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
즉, 실행 비트가 설정되지 않은 경우 특수한 것으로 간주되기 때문입니다.별말씀을요, 해당 파일은 실행 파일이 아닌 것으로 간주되어 실행할 수 없습니다.
그러나 루트는 실행 비트가 설정되어 있어도 이를 실행할 수 있고 실행할 것입니다.
관찰하다:
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에서 수행할 수 있습니다.
이론적으로는 무엇이든 쉘 스크립트가 될 수 있으므로 여전히 유용한 검사입니다. 그런데 왜 제거합니까?