우리 모두 알고 있듯이, 쉘에서 스크립트를 실행하려면 스크립트에 실행 권한이 있어야 합니다.
$ ls -l
total 4
-rw-r--r-- 1 user user 19 Mar 14 01:08 hw
$ ./hw
bash: ./hw: Permission denied
$ /home/user/hw
bash: /home/user/hw: Permission denied
$
bash <scriptname>
그러나 이 스크립트는 등을 사용하여 실행할 수 있습니다 sh <scriptname>
.
$ bash hw
Hello, World!
$
이는 기본적으로 읽기 권한만 있어도 스크립트 파일을 실행할 수 있음을 의미합니다. 어리석은 질문일 수도 있지만, 스크립트 파일에 실행 권한을 부여하는 것이 무슨 의미가 있습니까? 프로그램을 실행하려면 실행 권한이 필요하기 때문에 실제로 보안이나 기타 이점이 추가되지 않을 수 있습니까?
답변1
예, 가능합니다 bash /path/to/script
. 하지만 스크립트에는 다른 해석기가 있을 수 있습니다. ksh
또는 와 함께 작동하도록 스크립트를 작성할 수 있습니다 zsh
. 따라서 스크립트를 호출하는 데 사용할 인터프리터를 알아야 합니다. 실행 가능한 스크립트에 shebang 라인( 상단)을 사용하면 사용자는 더 이상 어떤 인터프리터를 사용해야 하는지 알 필요가 없습니다. 또한 스크립트를 넣고 일반 프로그램처럼 호출할 수도 있습니다.awk
expect
#!/bin/bash
$PATH
답변2
보안 기능은 suid/sgid 비트와의 조합에 있지만 계속 읽어보세요.
Exec 비트는 이제 주로 편의를 위한 것입니다. 즉, 어떤 파일을 직접 실행해야 하는지 보여줍니다.
- 명령어를 입력할 때 "."가 있으면 실행되지 않은 파일은 현재 디렉터리에서 실행되지 않습니다. 당신의 길에
- TAB 자동 완성은 사용자가 명령 이름을 입력하는 것을 확인한 경우에만 exec 비트가 있는 파일을 제안할 수 있습니다.
- 사용자는 어떤 파일이 실행될지 더 잘 확인할 수 있습니다.
- 이는 사용자가 입력한 파일 이름이 명령이고 커널이 파일을 열고 해당 로더/실행기가 무엇인지 알아내야 함을 커널에 알려줍니다.
그러나 다른 사용자가 이미 보여준 것처럼 전용 사용자가 파일을 실행하는 것을 막지는 못합니다.
문제는 명시적 로더로 파일을 실행할 때 exec 비트를 피할 수 있지만 suid/sgid 비트도 사용하지 않으므로 상승된 권한을 얻을 수 없다는 것입니다.
/bin에서 해보자
-rwsr--r-- root root some_privileged_command
권한이 없는 사용자로 명령을 실행할 수 있습니다.
$ /lib/ld-linux.so.2 /bin/some_privileged_command
그러나 루트 권한처럼 실행되지는 않습니다.
-rwsr-xr-x root root other_privileged_command
직접 실행하면
$ /bin/other_privileged_command
즉, shebang 명령의 경우 suid가 설정되어 있어도 루트 권한으로 실행되지 않기 때문에 어쨌든 의미가 없습니다. 따라서 쉘 실행 파일 자체에는 루트 권한이 필요합니다(실제로는 매우 나쁩니다).