Ashfame Asked: 2011-02-11 10:27:01 +0800 CST2011-02-11 10:27:01 +0800 CST 2011-02-11 10:27:01 +0800 CST 即使脚本未设置为可执行文件也可以运行吗? 772 我似乎可以运行脚本(.sh),无论是否将它们设置为可执行文件。那么这到底在哪里重要呢? scripts 4 个回答 Voted Best Answer geirha 2011-02-11T11:03:56+08:002011-02-11T11:03:56+08:00 假设您有myscript包含以下内容的文件: #!/bin/bash echo "Hello, World!" 如果你使这个文件可执行并用 运行它./myscript,那么内核会看到前两个字节是#!,这意味着它是一个脚本文件。然后内核将使用该行的其余部分作为解释器,并将文件作为其第一个参数传递。所以,它运行: /bin/bash myscript bash 读取文件并执行其中包含的命令。 因此,对于 bash(或您的脚本所需的任何解释器)来“执行”脚本,它只需要能够读取文件。 因此,对于脚本来说,执行位只是让执行起来更方便一些。只要 bash 是可执行的,您始终可以使用脚本文件作为参数运行 bash,或者以交互方式运行 bash 并将脚本逐行复制粘贴到终端中以执行命令。 Lekensteyn 2011-02-11T11:01:22+08:002011-02-11T11:01:22+08:00 确保您没有将“执行 shell 脚本”与“使用 sh 运行 shell 脚本”混淆。 这不会受到以下文件权限的影响file.sh: sh file.sh 您正在执行sh(解析为程序/bin/sh),它读取file.sh并执行它的代码。 如果您真的执行脚本本身,文件权限将生效: ./file.sh 请注意,非 Linux 文件系统(如 FAT)不支持文件权限。因此,即使您运行chmod -x file.sh,该文件仍将具有以前的权限。 执行权限由文件系统强制执行。但是程序也可以通过读取文件内容来“执行”代码,这绕过了“执行”的文件系统权限。 Ciro Santilli OurBigBook.com 2018-03-29T06:47:45+08:002018-03-29T06:47:45+08:00 如果文件不可执行exec,Linux 内核的系统调用会失败EACCES 虽然你可以这样做sh myprog.sh(它只是读取文件并解释是),但尝试运行程序是./myprog.sh行不通的,因为当你这样做时: 您在终端上的 Bash shell 使用exec系统调用./myprog.sh execshebangs 由Linux 内核的系统调用直接解释,如下所述: https ://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -pyt 的第一行/40938801#40938801 Linux内核拒绝执行没有可执行权限的文件 这可以通过以下方式验证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 在以下位置提到: 除 fexecve() 之外的 exec 函数在以下情况下将失败: [EACCES] 新进程映像文件的路径前缀中列出的目录的搜索权限被拒绝,或者新进程映像文件拒绝执行权限。 进一步的理由可以在:https ://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the myusuf3 2011-02-11T10:49:49+08:002011-02-11T10:49:49+08:00 不要那样想。我可以执行这个文件吗?可以这样想:谁可以执行这个文件? 如果计算机是你的,文件是你的,我相信你可以执行它。您可能想进一步研究chmod和chown等命令以及文件权限。 我希望这会有所帮助。
假设您有
myscript
包含以下内容的文件:如果你使这个文件可执行并用 运行它
./myscript
,那么内核会看到前两个字节是#!
,这意味着它是一个脚本文件。然后内核将使用该行的其余部分作为解释器,并将文件作为其第一个参数传递。所以,它运行:bash 读取文件并执行其中包含的命令。
因此,对于 bash(或您的脚本所需的任何解释器)来“执行”脚本,它只需要能够读取文件。
因此,对于脚本来说,执行位只是让执行起来更方便一些。只要 bash 是可执行的,您始终可以使用脚本文件作为参数运行 bash,或者以交互方式运行 bash 并将脚本逐行复制粘贴到终端中以执行命令。
确保您没有将“执行 shell 脚本”与“使用 sh 运行 shell 脚本”混淆。
这不会受到以下文件权限的影响
file.sh
:您正在执行
sh
(解析为程序/bin/sh
),它读取file.sh
并执行它的代码。如果您真的执行脚本本身,文件权限将生效:
请注意,非 Linux 文件系统(如 FAT)不支持文件权限。因此,即使您运行
chmod -x file.sh
,该文件仍将具有以前的权限。执行权限由文件系统强制执行。但是程序也可以通过读取文件内容来“执行”代码,这绕过了“执行”的文件系统权限。
如果文件不可执行
exec
,Linux 内核的系统调用会失败EACCES
虽然你可以这样做
sh myprog.sh
(它只是读取文件并解释是),但尝试运行程序是./myprog.sh
行不通的,因为当你这样做时:exec
系统调用./myprog.sh
exec
shebangs 由Linux 内核的系统调用直接解释,如下所述: https ://stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on -pyt 的第一行/40938801#40938801这可以通过以下方式验证
main.c
:和
myprog.sh
:如果
myprog.sh
不可执行,则main
失败并显示:在 Ubuntu 17.10 中测试,
gcc -std=c99
.POSIX 7 在以下位置提到:
进一步的理由可以在:https ://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-easily-bypassed-is-it-superfluous-or-whats-the
不要那样想。我可以执行这个文件吗?可以这样想:谁可以执行这个文件?
如果计算机是你的,文件是你的,我相信你可以执行它。您可能想进一步研究chmod和chown等命令以及文件权限。
我希望这会有所帮助。