에코되는 Bash 스크립트를 만들었습니다."안녕하세요 세계". 테스트 사용자도 생성했는데,단발, 사용 adduser
.
아래와 같이 파일을 실행할 권한이 있는 사람은 아무도 없습니다 ls
.
$ ls -l hello.sh
-rw-r--r-- 1 george george 19 Mai 29 13:06 hello.sh
위에서 파일의 소유자가 누구인지 알 수 있습니다.성 조지읽기 및 쓰기 권한만 있고 실행 권한은 없습니다. 하지만 다음과 같이 로그인했습니다.성 조지스크립트를 직접 실행할 수 있습니다.
$ . hello.sh
Hello World
설상가상으로 나는 다음과 같이 로그인했습니다.단발, 읽기 권한만 있지만 여전히 파일을 실행할 수 있습니다.
$ su bob
Password:
$ . /home/george/testdir/hello.sh
Hello World
어떻게 되어가나요?
답변1
귀하의 예에서는 파일을 실행하지 않고 대신구입그들을.
실행이 통과됩니다
$ ./hello.sh
이를 위해서는 실행 라이센스가 필요합니다. 이 경우 스크립트 파일의 명령이 실행되는 하위 쉘이 열립니다.
구입, 즉.
$ . hello.sh
(사이에 공백이 있음) 만읽다파일 및 셸. hello.sh
어디에서 명령을 호출합니까 ?그런 다음 읽기 권한으로, 즉 하위 쉘을 열지 않고 명령을 직접 실행하십시오. 파일이 읽기 전용이므로 읽기 권한만 있어도 충분히 작업이 가능합니다. (또한 스크립트 파일 이름을 다음과 같이 선언하는 것에 유의하세요.통화 PATH
검색hello.sh
, 따라서 다른 하나가 있는 경우PATH
저것보급품이 있을 거예요! 명시적인 경로를 사용하십시오. 예를 들어 . ./hello.sh
"올바른 경로"를 얻었는지 확인하십시오.)
이러한 일이 발생하지 않도록 하려면 스크립트를 사용해서는 안 되는 모든 사용자의 읽기 권한도 제거해야 합니다.아무튼 이게 합리적이네이 스크립트의 무단 사용이 정말로 걱정된다면
- 권한이 없는 사용자는 스크립트 내용을 복사하여 새 파일에 붙여넣기만 하면 누락된 실행 권한을 쉽게 우회할 수 있으며, 이 파일에 실행 권한을 부여할 수 있습니다.
- Kusalananda가 지적했듯이 권한이 없는 사용자는 다음을 호출하여 스크립트를 쉽게 사용할 수 있습니다.
바꾸다sh ./hello.sh
./hello.sh
이 경우에도 스크립트 파일에 대한 읽기 권한만 필요하므로(참조이 답변예를 들어).
일반적인 참고사항으로, 스크립트를 얻는 것과 스크립트를 실행하는 것 사이에는 미묘한 차이가 있다는 점을 명심하십시오(참조이 문제예를 들어).
답변2
실행 권한은 단순히 파일이처형된. 그러나 파일을 가져오거나( . hello.sh
또는 source hello.sh
) 쉘 인터프리터에 인수로 전달하면( sh hello.sh
) 파일을 실행하는 것이 아니라 다른 명령( .
또는 sh
)을 실행하는 것입니다.파일을 매개변수로 전달이 명령에.
따라서 귀하의 질문에 대답하자면, 파일을 "실행"할 수 있는 이유는 . hello.sh
실행할 수 있는 이유와 동일 합니다 cat hello.sh
.읽다파일을 실행하는 대신.
표시하려면:
$ ls -l
total 4.0K
-r--r--r-- 1 terdon terdon 21 May 29 12:29 foo.sh
$ cat ./foo.sh
#!/bin/sh
echo Hello
$ ./foo.sh
bash: ./foo.sh: Permission denied
$ sh ./foo.sh
Hello
보시다시피 실제로 스크립트를 실행할 수는 없지만 읽을 수는 있습니다( 가 있든 cat
없든 sh
).
답변3
가장 짧은 버전은 다음과 같습니다: 당신은 아닙니다구현하다문서. 누구세요읽다쉘에 들어가서 실행합니다.
알아채다일부언어 해석기는 실행을 요청한 파일의 실행 권한을 확인하고 사용자에게 적절한 권한이 없으면 실행을 거부합니다. 그러나 이는 전적으로 특정 인터프리터 작성자의 재량에 따른 검사이며 운영 체제에 의해 시행되지 않습니다.
약간의 사고 실험을 해보자.
내 생각엔 우리 모두 동의할 수 있을 것 같아만약에프로그램에는 실행 권한이 있으므로 이 프로그램을 실행할 수 있어야 합니다. 나는 또한 이 프로그램이 "Hello World" 문자열을 콘솔에 인쇄하도록 허용해야 한다는 점에도 동의할 수 있다고 생각합니다.
또한 파일에 읽기 권한이 있는 한 프로그램은 파일을 읽을 수 있어야 한다는 데에도 동의할 수 있습니다. 파일의 내용이 무엇인지는 중요하지 않습니다. 파일에 읽기 권한 비트가 설정되어 있으면 프로그램에서 해당 파일을 읽을 수 있어야 합니다.
이제 우리는 프로그램이 콘솔에 "Hello World"를 인쇄하도록 허용해야 한다는 데 동의했고, 프로그램이 파일을 읽을 수 있도록 허용해야 한다는 데 동의했습니다. 또한 프로그램이 허용되어야 한다는 점에도 논리적으로 동의해야 합니다. 파일을 읽으려면그리고콘솔에 "Hello World"를 인쇄합니다. 그리고 프로그램이 파일을 읽을 수 있는지 여부는 내용이 아니라 권한에 달려 있으므로 프로그램도 파일을 읽을 수 있도록 허용해야 한다고 말했습니다. 내용이 허용되면 "Hello World"가 콘솔에 인쇄됩니다. .파일의 내용은 입니다 echo Hello World
.
이제 프로그램이 파일을 읽을 수 있고 프로그램이 "Hello World"를 콘솔에 인쇄할 수 있으므로 파일의 내용을 검사하고오직echo Hello World
파일의 내용이 다음과 같다면 어떨까요? , "Hello World"를 콘솔에 인쇄합니다.
알았어, 그런데 그러면예즉, "설명"구현하다파일을 제출하시면 제가 모든 단계에서 그렇게 할 수 있도록 허용한다는 데 방금 동의하셨습니다!
이것이 바로 여기서 일어나고 있는 일입니다. 쉘은 단순히 텍스트 파일을 읽습니다. 이는 텍스트 파일에 읽기 권한이 있기 때문에 허용됩니다. 그리고껍데기텍스트 파일의 명령이 실행되고 있습니다. 이는 허용됩니다.껍데기실행 권한이 있습니다.