현재 저는 라즈베리 파이에서 리눅스를 가지고 놀고 있으며 권한 시스템이 어떻게 작동하는지 이해하려고 노력하고 있습니다.
나는 두 명의 사용자 세트를 만들었고 그 중 한 명은 자신의 문서 폴더에 다음 권한을 가진 Python 스크립트를 만들었습니다 -rwx--x---
.
다른 그룹 구성원은 python hello.py 명령을 사용하여 파일을 실행해야 하지만 권한이 거부되었다고 말합니다.
유일한 방법은 그룹에 읽기 권한을 부여하는 것입니다.-rwxr-x---
python 스크립트를 실행하는데 실행 권한이 부족한 이유는 무엇입니까?
답변1
커널이 파일을 실행하려면 실행 권한이 충분합니다.
파일이 로 시작하면 #!
스크립트임을 확인하고 행을 구문 분석하여 인터프리터의 경로와 선택적 인수를 찾은 다음 해당 선택적 인수와 파일 경로를 인수로 사용하여 인터프리터를 실행합니다.
예를 들어 파일이 다음으로 시작하는 경우:
#! /usr/bin/python -E
커널이 execve("/path/to/the-script", ["the-script", "arg"], [envs])
로 변경됩니다 execve("/usr/bin/python", ["/usr/bin/python", "-E", "/path/to/the-script", "arg"], [envs])
.
실행 권한이 없었다면 여기까지 도달하지 못했을 것입니다.
이때 중요한 것은 인터프리터의 실행 권한이다. 실행파일이면 정상적으로 작동됩니다.
그러나 나중에 열어서 내부 코드를 읽고 해석 /usr/bin/python
하고 싶을 것입니다 . /path/to/the-script
이렇게 하려면 파일에 대한 읽기 권한이 필요합니다. 지난번 이후로 euid를 변경하지 않은 경우(예: 파일에 /usr/bin/python
suid/sgid 비트가 있는 경우) 이전에 읽기 권한이 없었다면 여전히 해당 권한이 없습니다.
따라서 실행 권한만 있으면 스크립트를 정상적으로 실행할 수 있습니다. 단지 인터프리터가 내용을 읽기 위해 열어야 하는 경우 실패할 것입니다(그리고 스크립트를 실행하려는 셸이 아니라 인터프리터에서 나오는 오류 메시지를 보게 될 것입니다). 다음과 같은 스크립트에서:
#! /bin/echo Here goes
echo
읽기 위해 파일을 열려는 시도가 없기 때문에 읽기 권한이 없어도 문제가 되지 않는다는 것을 알게 될 것입니다 .
답변2
스크립트를 실행하는 데 "x" 권한이 필요하지 않습니다. 커널의 관점에서 볼 때 이는 단순한 텍스트 파일이며 이를 실행하는 인터프리터가 아닙니다. Python 스크립트를 실행하면 Something.py가 아닌 Python 바이너리가 실행됩니다.
하지만 인터프리터가 스크립트를 읽고 실행할 수 있어야 하므로 스크립트에는 r 플래그가 필요합니다.
대부분의 인터프리터는 실행 가능 플래그 없이는 스크립트를 실행하지 않습니다. 가능하더라도 이는 안전 예방 조치입니다.
따라서 스크립트를 실행하려면 r 및 x 플래그가 필요합니다.