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/rrestore
s设置为并运行,/etc/init
会发生什么情况。/etc/halt
root
PATH
/etc:/bin
root
passwd
它不会正常工作。
更糟糕的是,在过去,二进制可执行文件没有魔术头,因此除了检查权限位之外,检查二进制文件是否是可执行文件实际上是不可能的。因此,他们使文件不是 * 的有效目标,exec
除非它们实际上是文件(没有目录等)并且至少设置了一个执行位。
*检查可能是在 execvp 中进行的,这是一个用户模式函数。
它仍然是一个有用的检查,因为理论上任何东西都可以是 shell 脚本,那么为什么要删除它呢?