Answers:
假设您的文件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内核的系统调用直接解释,如下所述:https : //stackoverflow.com/questions/2429511/why-do-people-write-the-usr-bin-env-python-shebang-on pyt的第一行/ 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在以下位置提到了这一点:
在以下情况下,除fexecve()以外的exec函数将失败:
[EACCES]拒绝新过程映像文件的路径前缀中列出的目录的搜索权限,或者新过程映像文件拒绝执行权限。
进一步的理由可以在以下网址找到:https : //security.stackexchange.com/questions/66550/unix-execute-permission-be-easily-bypassed-is-it-superfluous-or-whats-the