众所周知,如果要在 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
,但脚本可以有不同的解释器。您的脚本可能是为与 , 或 一起工作ksh
而zsh
编写awk
的expect
。因此,您必须知道使用什么解释器来调用脚本。通过使用 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 可执行文件本身需要那一点(而且这样做真的非常糟糕)。