답변:
myscript다음을 포함하는 파일이 있다고 가정 해 봅시다 .
#!/bin/bash
echo "Hello, World!"
이 파일을 실행 가능하게 만들고로 실행 ./myscript하면 커널은 처음 두 바이트가 #!임을 알 수 있습니다. 이는 스크립트 파일임을 의미합니다. 그런 다음 커널은 나머지 행을 인터프리터로 사용하고 파일을 첫 번째 인수로 전달합니다. 따라서 다음을 실행합니다.
/bin/bash myscript
bash는 파일을 읽고 파일에 포함 된 명령을 실행합니다.
따라서 bash (또는 스크립트에 필요한 모든 인터프리터)가 스크립트를 "실행"하려면 파일을 읽을 수만 있으면됩니다.
따라서 스크립트의 경우 실행 비트는 실행하기가 조금 더 편리합니다. bash가 실행 가능한 한, 항상 스크립트 파일을 인수로 사용하여 bash를 실행하거나 bash를 대화식으로 실행하고 터미널에 한 줄씩 스크립트를 복사하여 명령을 실행할 수 있습니다.
"sh를 사용하여 쉘 스크립트 실행"과 "쉘 스크립트 실행"을 혼동하지 마십시오.
다음에 대한 파일 권한의 영향을받지 않습니다 file.sh.
sh file.sh
코드 를 읽고 실행하는 sh(프로그램으로 해석 /bin/sh) file.sh실행 중입니다.
스크립트 자체 를 실제로 실행 하면 파일 권한이 적용 됩니다 .
./file.sh
FAT와 같은 Linux 이외의 파일 시스템에서는 파일 권한이 지원되지 않습니다. 따라서를 실행하더라도 chmod -x file.sh파일에는 여전히 이전 권한이 있습니다.
실행 권한은 파일 시스템에 의해 시행됩니다. 그러나 프로그램은 "execute"에 대한 파일 시스템 권한을 무시하는 파일 내용을 읽어서 코드를 "실행"할 수도 있습니다.
bash하여 실행을 수행하여 read권한을 제거해야 할 수도 있습니다.
If you set the executable permission, the script can be run directly by users who have that permission - whether they have it on a group, world or owner basis그러나 실행 권한을 확인하여 다른 사용자에게 권한을 부여하는 방법은 무엇입니까? 그리고 두 번째 요점을 알았습니다. 스크립트에 대한 읽기 권한을 제거하여 bash를 통해 스크립트를 처리 할 수도 없습니다. 권리?
sudo chmod g+x myfile.sh에 대해서는 터미널에서 와 같이 호출 하여 파일 그룹에 대한 실행 권한을 추가합니다. 파일 권한 학습서를 참조하십시오 . 여러 사용자의 권한을 동시에 관리하려면 그룹을 사용하십시오 (예 : 그룹 관리) .
그런 식으로 생각하지 마십시오. 이 파일을 실행할 수 있습니까? 다음과 같은 방식으로 생각하십시오. 누가이 파일을 실행할 수 있습니까?
컴퓨터가 당신이고 파일이 당신의 것이라면 나는 그것을 실행할 수 있다고 확신합니다. chmod 및 chown 과 같은 명령 과 파일 권한 을 자세히 살펴볼 수 있습니다 .
도움이 되길 바랍니다.
파일이 실행 가능하지 않으면 execLinux 커널 의 syscall이 실패합니다.EACCES
할 수는 있지만 sh myprog.sh(파일을 읽고 해석하는 것만 큼), ./myprog.sh그렇게 할 때 프로그램을 실행할 수없는 것처럼 실행하려고 시도하십시오 .
exec시스템 호출을 사용합니다 ../myprog.shexec 설명 된대로 Linux 커널 의 시스템 호출로 직접 해석됩니다 . 첫 번째 라인의 pyt / 40938801 # 40938801이것은 다음을 통해 확인할 수 있습니다 main.c.
#define _XOPEN_SOURCE 700
#include <errno.h>
#include <stdio.h>
#include <unistd.h>
int main(void) {
char *argv[] = {"myprog", NULL};
char *envp[] = {NULL};
int ret;
ret = execve("myprog.sh", argv, envp);
perror("execve");
printf("%d\n", errno);
printf("%d\n", EACCES);
}
그리고 myprog.sh:
#!/bin/sh
echo worked
myprog.sh실행 파일이 아닌 경우 main실패합니다.
execve: Permission denied
13
13
우분투 17.10에서 테스트되었습니다 gcc -std=c99.
POSIX 7은 다음에서 언급합니다.
다음과 같은 경우 fexecve ()를 제외한 exec 함수는 실패합니다.
[EACCES] 새 프로세스 이미지 파일의 경로 접두사에 나열된 디렉토리에 대한 검색 권한이 거부되었거나 새 프로세스 이미지 파일이 실행 권한을 거부합니다.
자세한 근거는 https://security.stackexchange.com/questions/66550/unix-execute-permission-can-be-e-as-bypassed-is-it-superfluous- 또는 -whats-the에서 확인할 수 있습니다.