Здесь есть серьезное недоразумение. Давайте проясним эти вещи.
Прежде всего, указанное вами ограничение не так:
Тем не менее, когда скрипт (текстовый файл, который начинается со строки взрыва; т.е., строка, начинающаяся с #!
) дается некоторым оболочкам (bash), он запускает исполняемый файл, названный в этой строке (например, /usr/bin/perl
), и подключает содержимое файла сценария к стандартному вводу этого исполняемого файла, который может отсутствовать на этом диске ,
Удивительно, но это объясняет возможность выполнения, несмотря на noexec
. Я думаю, что спрашивающий там все понял неправильно, и это была не его вина! Одно неверное предположение в вопросе вызвало другое неправильное предположение в ответе.
Что тогда не так?
1. Bind mount является специфическим
Чтобы получить некоторый контекст, давайте посмотрим, что происходит, когда вы пытаетесь связать mount только для чтения. Возникает вопрос: почему mount не поддерживает параметр только для чтения для bind mounts? Вывод:
Для достижения желаемого результата нужно запустить две команды:
mount SRC DST -o bind
mount DST -o remount,ro,bind
Более новые версии mount (util-linux> = 2.27) делают это автоматически при запуске
mount SRC DST -o bind,ro
Но когда вы пытаетесь использовать noexec
вместо ro
, вам все равно нужны две команды! В моем Kubuntu у меня есть util-linux 2.27.1-6ubuntu3.3
и эта команда:
mount SRC DST -o bind,noexec
игнорирует noexec
, мне нужно перемонтировать. То же самое, если монтирование выполняется через /etc/fstab
. Вы можете экспериментировать. В любое время проверьте с помощью простой команды mount
каковы фактические параметры.
Бьюсь об заклад, Аскер думал, что монтирование было с опцией noexec
, но на самом деле это не так. Он или она смогли выполнить скрипт из предположительно noexec
монтирования. Это было странно, отсюда и вопрос.
Затем автор ответа интерпретировал это так, как если бы это была оболочка, которая читает shebang, вызывает другой исполняемый файл и не беспокоится о noexec
для скрипта. Если точка монтирования была действительно noexec
то это было бы разумным предположением.
Но…
2. Это распространенный миф, что ракушки читают шебанги; ядро делает
Прочитайте, как работает #!шебанг работа? и обратите внимание, что один из ответов там изначально следовал мифу, а затем был исправлен.
Так что если у вас есть:
- точка монтирования
/mnt/foo/
с параметром noexec
,
- скрипт
/mnt/foo/script.py
который в противном случае исполняется (например, был вызван chmod -x …
),
- Шебанг, как
#!/usr/bin/python
в качестве первой строки в скрипте
и вы запускаете это так
/mnt/foo/script.py
тогда ваше ядро Linux не пропустит вас из-за noexec
. Это случилось бы в этом другом вопросе, если бы монтирование там на самом деле не noexec
; но я считаю, что это не так.
3. Тем не менее, есть два способа "выполнить" скрипт
Из комментариев:
"и попробуем его выполнить" Как? Запустив его напрямую или передав переводчику?
Запуск его напрямую означает:
/mnt/foo/script.py
Это будет соблюдать noexec
как описано выше. Исполняемый файл - script.py
.
Передача его переводчику означает:
python /mnt/foo/script.py
В этом случае исполняемым файлом является python
. Не имеет значения, монтируется ли foo/
с помощью noexec
; не имеет значения, исполняется ли script.py
вообще; Неважно, что такое Шебанг. Дело в том, что script.py
не выполняется, он читается .
Пока пользователь может читать файл и запускать правильный интерпретатор, нет способа предотвратить передачу файла интерпретатору; но это не файл, который выполняется.