Почему корень не может выполниться, когда исполняемые биты не установлены?

Если Вы хотите остановиться на ошибке:

while [ $? = 0 ]; do
    sleep 1
    python myapp.py
done
echo error: $?
26
21.07.2012, 01:26
2 ответа

Короче говоря, потому что выполнить бит считают особенным; если это не установлено вообще, то файл считается не исполняемым файлом и таким образом не может быть выполнен.

Однако, если даже ОДИН из выполнить битов установлен, корень может и выполнять его.

Наблюдайте:

caleburn: ~/ >cat hello.sh
#!/bin/sh

echo "Hello!"

caleburn: ~/ >chmod 000 hello.sh
caleburn: ~/ >./hello.sh
-bash: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
sudo: ./hello.sh: command not found

caleburn: ~/ >chmod 100 hello.sh
caleburn: ~/ >./hello.sh
/bin/sh: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
Hello!
25
27.01.2020, 19:40

Раньше инструменты системного администрирования находились в /etc, например /etc/restore, /etc/rrestore, /etc/ init, /etc/halt и т. д. Представьте, что произойдет, если root для PATH будет установлено значение /etc:/bin и root запустили passwd.

Это не сработает.

Что еще хуже, в старые времена двоичные исполняемые файлы не имели магических заголовков, поэтому проверить, является ли двоичный файл исполняемым, было невозможно, кроме как путем проверки битов разрешения. Таким образом, они сделали файлы недопустимыми целями exec*, если только они не были фактически файлами (без каталогов и т. д.) и имели хотя бы один установленный бит выполнения.

*Возможно, проверка выполнялась в execvp, функции пользовательского режима.

Это по-прежнему полезная проверка, так как теоретически что угодно может быть сценарием оболочки, так зачем его удалять?

0
27.01.2020, 19:40

Теги

Похожие вопросы