脚本是否可以运行,即使它们未设置为可执行文件?

我似乎可以运行脚本(.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.cvalidation:

 #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