스크립트가 실행 가능으로 설정되지 않은 경우에도 스크립트를 실행할 수 있습니까?


25

실행 파일로 설정하거나 설정하지 않고 스크립트 (.sh)를 실행하는 것 같습니다. 정확히 이것이 중요한 부분은 무엇입니까?

답변:


24

myscript다음을 포함하는 파일이 있다고 가정 해 봅시다 .

#!/bin/bash
echo "Hello, World!"

이 파일을 실행 가능하게 만들고로 실행 ./myscript하면 커널은 처음 두 바이트가 #!임을 알 수 있습니다. 이는 스크립트 파일임을 의미합니다. 그런 다음 커널은 나머지 행을 인터프리터로 사용하고 파일을 첫 번째 인수로 전달합니다. 따라서 다음을 실행합니다.

/bin/bash myscript

bash는 파일을 읽고 파일에 포함 된 명령을 실행합니다.

따라서 bash (또는 스크립트에 필요한 모든 인터프리터)가 스크립트를 "실행"하려면 파일을 읽을 수만 있으면됩니다.

따라서 스크립트의 경우 실행 비트는 실행하기가 조금 더 편리합니다. bash가 실행 가능한 한, 항상 스크립트 파일을 인수로 사용하여 bash를 실행하거나 bash를 대화식으로 실행하고 터미널에 한 줄씩 스크립트를 복사하여 명령을 실행할 수 있습니다.


자세히 설명해 주셔서 감사합니다. :) 내가 올바르게 이해했다면 bash에 대한 모든 사용자 액세스는 스크립트를 실행하기 위해 스크립트에 대한 읽기 액세스 권한 만 있으면됩니다. bash는 스크립트를 입력으로 사용하고 읽기만하면되기 때문입니다. 해당 사용자에 대한 스크립트의 읽기 권한을 사용하여이 동작을 중지 할 수 있습니다. 권리? 이 실행 권한은 언제 사용되며 정확히 중요합니까?
Ashfame 2019

예, "bash myscript"를 사용하는 경우 사용자는 "myscript"에 대한 읽기 액세스 만 필요합니다 (물론 bash가 경로 내에 있으면 / bin / bash에 대해 실행 가능). 그러나 스크립트를 실행 가능하게 만들면 약간 다릅니다. 커널의 관점에서 첫 줄이 #! / bin / bash이면 다시 "/ bin / bash myscript"가 될 것이지만, 그 시점에 도달하려면 먼저 스크립트를 실행 파일로 제시해야합니다. 사용자 또는 그룹. 그러나 일부 사용자의 경우 스크립트가 실행 가능하지 않고 읽을 수있는 경우에도 마찬가지입니다. 스크립트를 "bash myscript"로 "실행"할 수 있습니다 ....
LGB

@LGB 그래서 그것은 거의 쓸모가 없습니다. 좋은 점은 해당 스크립트에 대한 사용자의 읽기 권한을 차단하는 것입니다. 권리?
Ashfame

@ Ashfame : 쓸모없는 것이 아니라 유용하다고 말합니다. 일반 파일의 실행 비트는 액세스를 제한하는 데 사용되지 않습니다. 당신이 그것을 기대하고있는 것 같습니다. 이진 실행 파일이 있으면 실행할 수있는 실행 권한이 있어야합니다. 그러나 파일에 대한 읽기 액세스 권한이있는 경우 언제든지 파일을 자신의 홈 디렉토리에 복사 할 수 있습니다.이 경우 사본은 사용자가 소유하므로 실행 권한을 추가하고 실행할 수 있습니다. 그러나 디렉토리의 경우 약간 다른 목적이 있습니다. mywiki.wooledge.org/Permissions
geirha를

1
올바른 인터프리터를 모른다면 / bin / bash 대신 무엇을 사용해야합니까? shebang 행에 따라 스크립트를 실행하는 명령이 있습니까?
Aivar

16

"sh를 사용하여 쉘 스크립트 실행"과 "쉘 스크립트 실행"을 혼동하지 마십시오.

다음에 대한 파일 권한의 영향을받지 않습니다 file.sh.

sh file.sh

코드 를 읽고 실행하는 sh(프로그램으로 해석 /bin/sh) file.sh실행 중입니다.

스크립트 자체 를 실제로 실행 하면 파일 권한이 적용 됩니다 .

./file.sh

FAT와 같은 Linux 이외의 파일 시스템에서는 파일 권한이 지원되지 않습니다. 따라서를 실행하더라도 chmod -x file.sh파일에는 여전히 이전 권한이 있습니다.

실행 권한은 파일 시스템에 의해 시행됩니다. 그러나 프로그램은 "execute"에 대한 파일 시스템 권한을 무시하는 파일 내용을 읽어서 코드를 "실행"할 수도 있습니다.


나는 당신의 요점을 이해합니다. 그러나 그것은 그룹이나 세계 또는 둘 다를위한 것인가?
Ashfame 2019

@Ashfame 실행 권한을 설정하면 해당 권한이있는 사용자 (그룹, 세계 또는 소유자)에 관계없이 스크립트를 직접 실행할 수 있습니다. 그러나 실행 권한이없는 사람도 다른 프로그램 (예 :)을 호출 bash하여 실행을 수행하여 read권한을 제거해야 할 수도 있습니다.
jg-faustus

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를 통해 스크립트를 처리 할 수도 없습니다. 권리?
Ashfame

@Ashfame 읽기 권한 지점에서 예. 방법 sudo chmod g+x myfile.sh에 대해서는 터미널에서 와 같이 호출 하여 파일 그룹에 대한 실행 권한을 추가합니다. 파일 권한 학습서를 참조하십시오 . 여러 사용자의 권한을 동시에 관리하려면 그룹을 사용하십시오 (예 : 그룹 관리) .
jg-faustus

우리가 GUI에서 실행 가능한 권한을 추가 할 때의 의미는 무엇입니까? 소유자 / 그룹 / 세계?
Ashfame 2019

1

그런 식으로 생각하지 마십시오. 이 파일을 실행할 수 있습니까? 다음과 같은 방식으로 생각하십시오. 누가이 파일을 실행할 수 있습니까?

컴퓨터가 당신이고 파일이 당신의 것이라면 나는 그것을 실행할 수 있다고 확신합니다. chmodchown 과 같은 명령 과 파일 권한 을 자세히 살펴볼 수 있습니다 .

도움이 되길 바랍니다.


예, 그들에 대해 알고 있습니다. 즉, 나는 (소유자) 항상 실행할 수 있습니다. 권리? 그렇다면 파일을 실행 파일로 설정하는 것이 그룹이나 세계 또는 둘 다를위한 것입니까?
Ashfame 2019

1

파일이 실행 가능하지 않으면 execLinux 커널 의 syscall이 실패합니다.EACCES

할 수는 있지만 sh myprog.sh(파일을 읽고 해석하는 것만 큼), ./myprog.sh그렇게 할 때 프로그램을 실행할 수없는 것처럼 실행하려고 시도하십시오 .

이것은 다음을 통해 확인할 수 있습니다 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에서 확인할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.