我在用户目录中创建了一个 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)一样),那么可以读取它的用户也可以复制并在其副本上设置执行位(如果您可以读取它,那么你就可以运行它)。