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

Mad*_*vil 2 linux bash shell permissions

我在用户目录中创建了一个 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```
Run Code Online (Sandbox Code Playgroud)

Eug*_*eck 15

“执行”脚本有多种不同的方式,它们有细微的差别:

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

您可以使用脚本使差异可见,即echo "$0". 在第一种情况下,它将输出到 的路径sh,在第二种情况下输出脚本的路径,在第三种情况下输出到当前 shell 的路径。


ctr*_*lor 6

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

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

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