実行ビットが設定されていない場合、なぜルートが実行できないのですか?

実行ビットが設定されていない場合、なぜルートが実行できないのですか?

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

つまり、実行ビットは特別なものと考えられているため、設定されていない場合はまったくファイルは実行可能ファイルではないとみなされ、実行できません。

ただし、実行ビットが 1 つでも設定されている場合、ルートはそれを実行できます。

観察する:

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/etc/init/etc/haltrootPATH/etc:/binrootpasswd

それは正しく動作しないでしょう。

さらに悪いことに、昔はバイナリ実行ファイルにはマジック ヘッダーがなかったため、バイナリが実行ファイルであるかどうかを確認することは、パーミッション ビットをチェックする以外には不可能でした。そのため、ファイルがexec実際にファイル (ディレクトリなどではない) であり、少なくとも 1 つの実行ビットが設定されていない限り、ファイルは *の有効なターゲットではありませんでした。

*チェックは、ユーザー モード関数である execvp で行われた可能性があります。

理論上は何でもシェル スクリプトになる可能性があるため、これは依然として便利なチェックです。では、なぜこれを削除するのでしょうか。

関連情報