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


25

我似乎可以在将脚本(.sh)设置为可执行文件的情况下运行脚本。那么,这到底在哪里重要呢?

Answers:


24

假设您的文件myscript包含以下内容:

#!/bin/bash
echo "Hello, World!"

如果使该文件可执行并使用来运行./myscript,则内核将看到前两个字节为#!,这意味着它是一个脚本文件。然后,内核将其余部分用作解释器,并将文件作为第一个参数传递。因此,它运行:

/bin/bash myscript

bash读取文件并执行其中包含的命令。

因此,对于bash(或脚本需要的任何解释器)“执行”脚本,它仅需要能够读取文件。

因此,对于脚本,执行位只是使其执行起来更加方便。只要bash是可执行的,您始终可以将脚本文件作为参数运行bash,或者以交互方式运行bash并将脚本逐行复制粘贴到终端中以执行命令。


感谢您详细解释。:)如果我理解正确,那么对bash的任何用户访问都只需要对该脚本的读取访问权即可运行它,因为bash会将脚本作为输入,并且只需要读取它即可。我可以通过对该用户获取脚本的读取权限来停止此行为。对?那么,什么时候使用此可执行权限才有意义?
Ashfame 2011年

是的,如果您使用“ bash myscript”,那么用户只需要对“ myscript”具有读访问权限(如果路径中存在bash,则对于/ bin / bash当然是可执行的)。但是,如果使脚本可执行,则情况会有所不同。确实,从内核的角度来看,如果第一行是#!/ bin / bash,它将再次是“ / bin / bash myscript”,但是要达到这一点,首先您需要将脚本显示为可执行文件。用户或组。但是,如果对于某些用户而言脚本不是可执行文件而是可读的,那么这是正确的,他仍然可以使用“ bash myscript”“运行”脚本...。–
LGB

@LGB这几乎没有用。好的事情是将用户对该脚本的读取权限减少。对?
Ashfame 2011年

@Ashfame:我会说有用而不是没用。常规文件上的执行位不会(也从未打算)用于限制访问。似乎您对此有所期待。如果您具有二进制可执行文件,则必须对其具有执行权限才能运行它。但是,如果您具有对该文件的读取权限,则始终可以将文件复制到自己的主目录中,在这种情况下,副本将归您所有,因此您可以为其添加执行权限...并运行它。对于目录,它的目的有些不同。参见mywiki.wooledge.org/Permissions
geirha,2011年

1
如果我不知道正确的解释器,应该使用什么代替/ bin / bash?是否有根据shebang行运行脚本的命令?
艾瓦尔(Aivar)

16

确保不要将“执行外壳程序脚本”与“使用sh运行外壳程序脚本”混淆。

这不会受到以下文件权限的影响file.sh

sh file.sh

您正在执行sh(解析为程序/bin/sh),该程序读取file.sh并执行其代码。

如果您真正执行脚本本身,则文件许可权将生效:

./file.sh

请注意,非Linux文件系统(例如FAT)不支持文件权限。因此,即使您运行chmod -x file.sh,该文件仍将具有其以前的权限。

执行权限由文件系统强制执行。但是程序也可以通过读取文件内容来“执行”代码,从而绕过“执行”上的文件系统权限。


我明白你的意思。但是,这是针对团体还是针对整个世界?
Ashfame 2011年

@Ashfame如果设置了可执行权限,则该脚本可以由拥有该权限的用户直接运行-不管是基于组,全局还是所有者。但是,即使没有执行权限的人也可以通过调用不同的程序(例如bash)来执行该程序-阻止您也必须取消他们的read权限。
jg-faustus

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处理它。对?
Ashfame,2011年

@Ashfame在读取许可点上,是的。关于如何,您将sudo chmod g+x myfile.sh在终端中调用类似的命令来添加文件组的执行权限。请参阅文件权限教程。要同时管理多个用户的权限,您可以使用组,例如,参见管理组
jg-faustus

我的意思是,当我们在GUI中添加可执行权限时,那么该权限是给谁的?所有者/组/世界?
Ashfame 2011年

1

不要以这种方式考虑它。我可以执行这个文件吗?可以这样认为:谁可以执行此文件?

如果计算机是您的,文件是您的,我确定您可以执行它。您可能想进一步研究chmodchown之类的命令以及文件权限。

希望对您有所帮助。


是的,我了解他们。这意味着,我(所有者)可以始终执行它。对?然后将文件设置为可执行文件是针对组还是针对整个世界?
Ashfame 2011年

1

如果文件不可执行exec,Linux内核的系统调用将失败并显示EACCES

尽管可以执行sh myprog.sh(只能读取文件并进行解释),但是尝试运行该程序是./myprog.sh行不通的,因为这样做时:

  • 您在终端上的Bash shell使用以下exec系统调用./myprog.sh
  • shebang由execLinux内核的系统调用直接解释,如下所述: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-be-easily-bypassed-is-it-superfluous-or-whats-the

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.