Bash - интерпретатор; он принимает ввод и делает все, что хочет. Не нужно обращать внимание на исполняемый бит. Фактически, Bash является переносимым и может работать в операционных системах и файловых системах, которые не имеют понятия исполняемого бита.
Что касается исполняемого бита, так это ядро операционной системы. Когда ядро Linux выполняет exec
, например, оно проверяет, что файловая система не смонтирована с параметром noexec
, оно проверяет исполняемый бит программного файла и обеспечивает выполнение любых требований. налагается модулями безопасности (такими как SELinux или AppArmor).
Обратите внимание, что исполняемый бит - это довольно дискреционный вид управления. В системе Linux x86-64, например, вы можете обойти проверку ядра исполняемого бита, явно вызвав /lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
в качестве интерпретатора :
cp /bin/ls /tmp/
chmod -x /tmp/ls
/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 /tmp/ls
Это в некоторой степени аналогично получению исходного кода Bash в Bash, за исключением того, что ld.so
является интерпретатором, а код, который он выполняет, является машинным кодом в Формат ELF.