脚本是否可以运行,即使它们未设置为可执行文件?
我似乎可以运行脚本(.sh),有或没有它们被设置为可执行文件。 那究竟这究竟在哪里呢?
假设您有包含以下内容的文件myscript
:
#!/bin/bash echo "Hello, World!"
如果你使这个文件可执行并用./myscript
运行它,那么内核会看到前两个字节是#!
,这意味着它是一个脚本文件。 然后内核将使用该行的其余部分作为解释器,并将该文件作为其第一个参数传递。 所以,它运行:
/bin/bash myscript
和bash读取文件并执行它包含的命令。
因此,对于bash(或脚本需要的任何解释器)来“执行”脚本,它只需要能够读取文件。
因此,对于脚本,执行位只是使执行它更方便。 只要bash是可执行的,您始终可以使用脚本文件作为参数运行bash,或者以交互方式运行bash并将脚本逐行复制粘贴到终端中以执行命令。
确保您不会将“执行shell脚本”与“使用sh运行shell脚本”混淆。
这不受file.sh
上的文件权限的影响:
sh file.sh
您正在执行sh
(解析为program /bin/sh
),它读取file.sh
并执行它的代码。
如果您真的执行脚本本身,文件权限将生效:
./file.sh
请注意,非Linux文件系统(如FAT)不支持文件权限。 因此,即使您运行chmod -x file.sh
,该文件仍将具有以前的权限。
文件系统强制执行权限。 但程序也可以通过读取文件内容来“执行”代码,这会绕过“执行”的文件系统权限。
不要以那种方式来考虑它。 我可以执行这个文件吗? 想一想:谁可以执行这个文件?
如果计算机是您的,并且文件是您的,我相信您可以执行它。 您可能希望进一步了解chmod和chown等命令以及文件权限。
我希望有所帮助。
如果文件不可执行,则Linux内核的exec
系统调用将失败并显示EACCES
虽然你可以执行sh myprog.sh
,但尝试以sh myprog.sh
运行程序是./myprog.sh
,因为当你这样做时:
- Bash使用
./myprog.sh
上的exec系统调用 - shebangs直接由Linux内核的
exec
系统调用解释,如下所述: https ://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang- 上最一线对的一-PYT / 40938801#40938801 - Linux内核拒绝执行没有可执行权限的文件
这可以用main.c
validation:
#define _XOPEN_SOURCE 700 #include #include #include 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提到:
除了fexecve()之外,exec函数在以下情况下将失败:
[EACCES]对新进程映像文件的路径前缀中列出的目录拒绝搜索权限,否则新进程映像文件将拒绝执行权限。
进一步的理由可以在以下url找到: https : //security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the