Ответы:
Допустим, у вас есть файл, myscript
содержащий следующее:
#!/bin/bash
echo "Hello, World!"
Если вы сделаете этот файл исполняемым и запустите его с помощью ./myscript
, то ядро увидит, что первые два байта - #!
это файл сценария. Затем ядро будет использовать оставшуюся часть строки в качестве интерпретатора и передаст файл в качестве первого аргумента. Итак, он работает:
/bin/bash myscript
и bash читает файл и выполняет содержащиеся в нем команды.
Таким образом, для того, чтобы bash (или любой другой интерпретатор, которого требует ваш скрипт) «выполнял» скрипт, ему нужно только иметь возможность прочитать файл.
Таким образом, для сценариев бит выполнения просто делает его более удобным для выполнения. Пока bash является исполняемым, вы всегда можете запустить bash с файлом сценария в качестве аргумента, или запустить bash в интерактивном режиме и скопировать и вставить строку за строкой в ваш терминал, чтобы выполнить команды.
Убедитесь, что вы не путаете «выполнение сценария оболочки» с «запустите сценарий оболочки с помощью sh».
Это не будет зависеть от прав доступа к файлам file.sh
:
sh file.sh
Вы выполняете sh
(который разрешает программу /bin/sh
), который читает file.sh
и выполняет свой код.
Права доступа к файлам будут действовать, если вы действительно выполните сам скрипт :
./file.sh
Обратите внимание, что права доступа к файлам не поддерживаются файловыми системами, отличными от Linux, такими как FAT. Таким образом, даже если вы запустите chmod -x file.sh
файл, у него останутся прежние права доступа.
Разрешение на выполнение обеспечивается файловой системой. Но программы также могут «выполнять» код, считывая содержимое файла, что обходит права файловой системы на «выполнить».
bash
) для выполнения - чтобы заблокировать, что вам также придется отозвать их read
разрешение.
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basis
Но как разрешение предоставляется разным пользователям путем проверки исполняемого разрешения? И я получил ваше второе замечание. Вы имеете в виду удаление их разрешения на чтение сценария, чтобы они не могли даже обработать его через bash. Правильно?
sudo chmod g+x myfile.sh
в терминале, чтобы добавить разрешения на выполнение для группы файла. См. Учебник по разрешениям для файлов . Чтобы управлять разрешениями для нескольких пользователей одновременно, вы должны использовать группы, см., Например, Управление группами .
Не думай об этом так. Могу ли я выполнить этот файл? Подумайте об этом так: кто может выполнить этот файл?
Если компьютер принадлежит вам, а файл - ваш, я уверен, что вы сможете выполнить его. Возможно, вы захотите изучить такие команды, как chmod и chown , а также права доступа к файлам.
Надеюсь, это поможет.
exec
Системный вызов в Linux ядра не удается с , EACCES
если файл не является исполняемым
Хотя вы можете сделать sh myprog.sh
(который только читает файлы и интерпретирует это), пытаясь запустить программу как ./myprog.sh
не может работать, так как, когда вы делаете это:
exec
системный вызов./myprog.sh
exec
системным вызовом ядра Linux, как описано по адресу: /programming/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -The-первой линии в своем -Пыть / 40938801 # 40938801Это можно проверить с помощью main.c
:
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
и myprog.sh
:
#!/bin/sh
echo worked
Если myprog.sh
это не исполняемый файл, происходит main
сбой с:
execve: Permission denied
13
13
Проверено в Ubuntu 17.10 gcc -std=c99
.
POSIX 7 упоминает, что в:
Функции exec, за исключением fexecve (), должны завершиться ошибкой, если:
[EACCES] В доступе к каталогу, указанному в префиксе пути нового файла образа процесса, отказано в разрешении на поиск, либо в новом файле образа процесса запрещено разрешение на выполнение.
Дополнительную информацию можно найти по адресу: /security/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the