当未设置可执行位时,为什么不能根执行?


26

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

Answers:


25

简而言之,因为执行位被认为是特殊的;如果它没有设置在所有的,那么该文件被认为是不是一个可执行文件,因此不能执行。

但是,即使设置了其中一个执行位,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!

0

在住在旧的系统管理工具/etc,例如/etc/restore/etc/rrestore/etc/init/etc/halt,等。试想一下,如果会发生什么rootPATH被设置为/etc:/binrootRAN passwd

这行不通。

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

*检查可能在execvp中,这是一种用户模式功能。

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.