Как говорилось в предыдущих ответах, цвет указывает, считаются ли файлы исполняемыми или нет.
Разрешение «выполнить» (= бит )в Linux и большинстве других Unix имеет одно значение для файлов и другое для каталогов.
Для каталогов, если у вас есть разрешение на выполнение, вы можете видеть их содержимое. Если вы этого не сделаете, вы не сможете перейти в каталог или просмотреть список файлов в нем, даже если у вас есть доступ как для чтения, так и для записи в каталог.
Для обычных файлов (, в отличие от файлов устройств и других специальных типов файлов Unix ), бит выполнения означает, что если вы используете имя файла в командной строке,ОС (или, точнее, :оболочка )попытается «выполнить» или запустить файл как команду. И наоборот, если у вас нет разрешения на выполнение файла, вы не сможете запустить его из командной строки.
Итак, если вы, например, удалите разрешение x для всех пользователей в файле /bin/cat (, который является командой Unix ), вы сами или кто-либо еще и любая программа, которая пытается использовать «кошку», команда не удастся.
Это команды ОС, такие как «cat» и «grep», исполняемые файлы которых обычно находятся в каталогах / */bin/ --/bin, /usr/bin, /sbin, /usr /sbin и т. д.
Кроме того, могут быть нескомпилированные, интерпретированные сценарии, которые либо написаны на каком-либо языке программирования, таком как Python, либо сценарии оболочки (, по сути, команды, которые вы пишете, как будто из командной строки при ssh-подключении к серверу ).
Теперь, когда вы устанавливаете бит выполнения в файле скрипта (, например, файле foobar ), и пытаетесь выполнить его вашей оболочкой :"./foobar", оболочка пытается проанализировать файл и найдите правильную программу для передачи сценария.
Оболочка делает это, пытаясь прочитать первую строку файла и найдя нотацию "shebang" о том, какая программа должна запускаться.
Итак, если ваш foobar был текстовым файлом с такой первой строкой:
#!/usr/bin/python
Затем оболочка попытается выполнить команду :/usr/bin/python foobar
, в основном вызывая интерпретатор Python и передавая ему имя вашего файла foobar в виде скрипта Python.
Если оболочка не найдет такую первую строку в вашем файле, она попытается выполнить сам foobar, как если бы он содержал команды оболочки.
Если файл с исполняемым битом не содержит правильных команд оболочки, оболочка будет просто жаловаться.
Вот что произойдет, если у вас есть файлы TTF с установленным битом exec и вы попытаетесь запустить их из командной строки:
$./FreeMonoOblique.ttf
-bash:./FreeMonoOblique.ttf: cannot execute binary file: Exec format error
$
Итак, для шрифтовэто, вероятно, более аккуратно, если бит exec не установлен, но на самом деле ничего не меняет.
П.С. Просто какая-то посторонняя информация. Если вы удалите бит выполнения для какой-либо команды или скрипта, он все равно может быть передан любой другой программе в качестве аргумента. Если эта другая программа знает, как выполнить вашу команду, удаление вами бита exec не имеет большого значения. Например, скрипт foobar Python по-прежнему будет запускаться интерпретатором Python, если вы просто сделаете это из командной строки:
$python foobar
вместо
$./foobar
То же самое с примером системных команд, таких как «кошка». Если вы удалите бит exec из «cat», вы все равно можете передать его новому экземпляру оболочки для выполнения :
.
$sh -c 'cat myfile'
будет работать, даже если вы удалили бит exec из cat и
$cat myfile
нет.
Я не знаком с pam_exec.so
реализацией, но я сделал небольшой PAM, и я думаю, что любому модулю сложно обрабатывать интерактивный сеанс со сторонним -скриптом из-за того, как работает диалог PAM(pam_conv_*
функций )и необходимость знать, когда сторонний сценарий будет читать из stdin
или нет (, поскольку сценарий не просто exec
модулем на переднем плане ).
В зависимости от количества усилий, которые вы готовы приложить, создание PAM несложно, и у вас есть легко читаемые примеры на python или golang
.Другой (возможно, более быстрый )вариант — использовать параметр stdin
в pam_exec.so
.
Помимо безопасности, и в зависимости от вашего варианта использования этого может быть достаточно, поскольку он отправляет пароль на стандартный ввод сценария.
Если вам подходит вариант объединения ввода скрипта с паролем (, как в некоторых реализациях двухфакторной аутентификации, где вы вводите пароль + OTP в поле пароля):
stdin
в строку pam_exec.so
pam_unix
не сможет сделать это с дополнительным вводом)