
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/halt
root
PATH
/etc:/bin
root
passwd
それは正しく動作しないでしょう。
さらに悪いことに、昔はバイナリ実行ファイルにはマジック ヘッダーがなかったため、バイナリが実行ファイルであるかどうかを確認することは、パーミッション ビットをチェックする以外には不可能でした。そのため、ファイルがexec
実際にファイル (ディレクトリなどではない) であり、少なくとも 1 つの実行ビットが設定されていない限り、ファイルは *の有効なターゲットではありませんでした。
*チェックは、ユーザー モード関数である execvp で行われた可能性があります。
理論上は何でもシェル スクリプトになる可能性があるため、これは依然として便利なチェックです。では、なぜこれを削除するのでしょうか。