给shell脚本添加执行权限的原因

给shell脚本添加执行权限的原因

众所周知,如果要在 shell 中执行脚本,那么该脚本需要具有执行权限:

$ ls -l
total 4
-rw-r--r-- 1 user user 19 Mar 14 01:08 hw
$ ./hw
bash: ./hw: Permission denied
$ /home/user/hw
bash: /home/user/hw: Permission denied
$

但是,可以使用 、 等执行此bash <scriptname>脚本sh <scriptname>

$ bash hw
Hello, World!
$ 

这意味着基本上可以执行脚本文件,即使它只有读取权限。这可能是一个愚蠢的问题,但是向脚本文件授予执行权限有什么意义呢?难道只是因为程序要运行需要有执行权限,但它实际上并没有增加安全性或任何其他好处?

答案1

是的,您可以使用bash /path/to/script,但脚本可以有不同的解释器。您的脚本可能是为与 , 或 一起工作kshzsh编写awkexpect。因此,您必须知道使用什么解释器来调用脚本。通过使用 shebang 行(#!/bin/bash位于顶部)可执行脚本,用户不再需要知道要使用什么解释器。它还允许您将脚本放入$PATH并像普通程序一样调用它。

答案2

安全功能在于与 suid/sgid 位的组合,但请继续阅读。

Exec 位现在主要是为了方便 - 它显示哪些文件应该直接执行。

  • 当输入命令时,如果您有“.”,则没有执行的文件不会在当前目录中运行。在你的路径中
  • 如果 TAB 自动完成功能发现您正在键入命令名称,则它只能建议带有 exec 位的文件
  • 用户可以更好地看到要执行哪些文件
  • 它告诉内核用户输入的文件名是一个命令,内核应该打开它并找出它的加载程序/执行程序是什么。

但它不会阻止专用用户运行该文件,正如其他人已经显示的那样。

问题是,当您可以在使用显式加载程序运行文件时规避(缺少)exec 位时,您也不会使用其 suid/sgid 位,因此您不会获得提升的权限。

让我们在 /bin 中

 -rwsr--r-- root root some_privileged_command

您可以以非特权用户身份执行该命令

 $ /lib/ld-linux.so.2 /bin/some_privileged_command

但它不会像 root 权限那样执行

 -rwsr-xr-x root root other_privileged_command

如果你直接执行它

 $ /bin/other_privileged_command

也就是说,对于 shebang 命令来说它无论如何都是没有意义的,因为即使设置了 suid,它们也不会以 root 权限执行 - 为此,shell 可执行文件本身需要那一点(而且这样做真的非常糟糕)。

相关内容