実行可能ビットが設定されていないのにrootが実行できないのはなぜですか?


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

回答:


25

要するに、実行ビットは特別と見なされるためです。設定されていない場合、ファイルは実行可能ファイルではないと見なされるため、実行できません。

ただし、実行ビットが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!

0

昔はシステム管理ツールは、に住んでいた/etcような/etc/restore/etc/rrestore/etc/init/etc/halt何が起こるか想像、などrootのがPATHに設定された/etc:/binroot走りましたpasswd

それは正しく機能しません。

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

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

理論的にはシェルスクリプトになる可能性があるため、これはまだ有用なチェックです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.