为什么在Linux中执行文件的权限不起作用?

为什么在Linux中执行文件的权限不起作用?

我在用户目录中创建了一个 bash 脚本,执行时会显示文本“Hello world”。同时,我希望只有我自己(文件所有者)和我所在组的帐户才能执行该脚本,其余所有帐户只能读取。因此,我通过 chmod 设置权限,以非我所在组的用户身份登录,转到包含该文件的目录,通过 sh 运行该脚本,然后...它突然执行并显示“Hello world”而不是“访问被拒绝”。但这怎么可能,我禁止其他人执行?这是什么?这是什么意思?

[user@localhost ~]$ ls -la *.sh
-rwxr-xr-- 1 user users 0 Feb 19 01:21 file.sh
[user@localhost ~]$ sh file.sh
Hello World
[user@localhost ~]$ groups
users wheel
[user@localhost ~]$ su - testu
Password: 
[testu@localhost ~]$ groups
testu
[testu@localhost ~]$ cd ../user
[testu@localhost user]$ sh file1.txt
Hello World```

答案1

有不同的方法来“执行”一个脚本,它们有细微的差别:

  • run sh /path/to/script:脚本不需要执行权限!事实上你执行 sh,然后读取并解释脚本。所以当你读到它时,你可以不执行它,而是告诉 shell 读取它并对其采取行动这几乎和执行它是同一件事。
  • /path/to/script添加标头并授予执行权限后直接运行#!/bin/sh。在这种情况下,您将执行脚本本身,而 shebang 标头会告知要加载哪个 shell
  • run . /path/to/script:这会告诉您当前的 shell 加载脚本并对其进行解释,就像您将其内容输入到 shell 提示符中一样。同样,不需要执行权限,因为您不需要执行文件,但要读取它。

你可以用一个脚本来显示差异,该脚本只说echo "$0"。在第一种情况下,它将输出 的路径sh,在第二种情况下,它将输出 脚本的路径,在第三种情况下,它将输出 当前 shell 的路径。

答案2

因为您没有执行它,所以您正在将其读入sh解释器(sh 不检查执行位)。

如果你添加#!/bin/sh为第一行。那么它可以执行例如./file-name

另外,即使该sh ./file-name选项不可用(就像非解释程序(例如 C、C++、pascal、go)一样),那么可以读取它的用户也可以复制并在其副本上设置执行位(如果您可以读取它,那么你就可以运行它)。

相关内容