为什么在未设置可执行位时 root 无法执行?

为什么在未设置可执行位时 root 无法执行?

root用户写入文件,即使write未设置其权限。

root用户读取文件,即使其read权限未设置。

root用户 cd进入目录,即使execute未设置其权限。

root用户不能execute未设置文件权限时执行文件。

为什么?

user$ echo '#!'$(which bash) > file
user$ chmod 000 file
user$ ls -l file
---------- 1 user user 12 Jul 17 11:11 file
user$ cat file                      # Normal user cannot read
cat: file: Permission denied
user$ su
root$ echo 'echo hello' >> file     # root can write
root$ cat file                      # root can read
#!/bin/bash
echo hello
root$ ./file                        # root cannot execute
bash: ./file: Permission denied

答案1

简而言之,因为执行位被认为是特殊的;如果没有设置根本不,则该文件被认为不是可执行文件,因此无法执行。

然而,即使设置了一个执行位,root 也可以并且将会执行它。

观察:

caleburn: ~/ >cat hello.sh
#!/bin/sh

echo "Hello!"

caleburn: ~/ >chmod 000 hello.sh
caleburn: ~/ >./hello.sh
-bash: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
sudo: ./hello.sh: command not found

caleburn: ~/ >chmod 100 hello.sh
caleburn: ~/ >./hello.sh
/bin/sh: ./hello.sh: Permission denied
caleburn: ~/ >sudo ./hello.sh 
Hello!

答案2

过去,系统管理工具包括/etc、、、/etc/restore等。想象一下,如果将/etc/rrestores设置为并运行,/etc/init会发生什么情况。/etc/haltrootPATH/etc:/binrootpasswd

它不会正常工作。

更糟糕的是,在过去,二进制可执行文件没有魔术头,因此除了检查权限位之外,检查二进制文件是否是可执行文件实际上是不可能的。因此,他们使文件不是 * 的有效目标,exec除非它们实际上是文件(没有目录等)并且至少设置了一个执行位。

*检查可能是在 execvp 中进行的,这是一个用户模式函数。

它仍然是一个有用的检查,因为理论上任何东西都可以是 shell 脚本,那么为什么要删除它呢?

相关内容