코드를 작성 중인데 bash
스크립트에 루트 권한이 있는지 확인하고 싶습니다. 다른 사람들에게서 본 모든 코드는 $EUID == 0
UID = 0 및 EUID > 0으로 다른 프로그램을 실행하는 것이 전적으로 가능합니다. 내 코드가 두 가지를 모두 확인하면 안 되나요? 아니면 이런 (이상한) 상황이 발생하지 않도록 bash에 뭔가가 있나요?
이런 일이 발생하는 것을 보고 싶은 사람들을 위해 다음은 개념 증명입니다.
[root@new-host bennett]# cp /bin/sleep .
[root@new-host bennett]# chown bennett sleep
[root@new-host bennett]# chmod 4755 sleep
[root@new-host bennett]# ll sleep
-rwsr-xr-x. 1 bennett root 32188 Sep 9 02:38 sleep
[root@new-host bennett]# ./sleep 1000 &
[root@new-host bennett]# ps -e -o user= -o ruser= -o comm= | awk '$1 != $2'
bennett root sleep
질문을 검토해 보겠습니다. 어떤 상황에서도 bash
이것이 가능합니까 ? (( $UID == 0 && $EUID > 0 ))
다른 프로그램은 괜찮습니다.
답변1
예:
$ env UID=0 EUID=90 bash -c 'echo $UID $EUID'
0 90
위의 내용은 변수 값만 변경한다는 점에 유의하세요. 이것실제UID 및 EUID는 영향을 받지 않습니다.
을 사용해야 합니다 id
. 예를 들어 질문을 참조하십시오.루트가 아닌 경우 스크립트가 실행되는 것을 방지하려면 어떻게 해야 합니까? (그리고 "루트로 실행되지 않습니다! 종료 중..."이 표시됩니다.)
스크립트가 set-uid 비트를 설정하는 경우(그리고 이러한 스크립트 set-uid를 실행하는 것은 Unix의 일입니다) 유효 사용자 ID도 실제 ID와 다릅니다. 이 경우 UID는 스크립트를 호출하는 사용자의 UID가 되고 EUID는 스크립트 소유자의 UID가 됩니다.
답변2
Bash는 시작 시 권한을 제거하므로 다른 유효 UID와 실제 UID로 실행되는 bash 프로세스를 자주 접하지 않습니다. 이는 다른 sh 구현에서도 가능합니다.
스크립트가 루트로 실행되고 있는지 테스트하려면 EUID가 올바른지 확인하고 실제 UID는 신경 쓰지 마세요.
그리고 EUID를 확인하는 것조차 잘못된 경우가 많습니다. 루트 액세스가 필요한지 어떻게 알 수 있나요? 모든 파일과 장치에는 루트가 아닌 사용자가 액세스할 수 있는 권한이 있을 수 있으며, 액세스 권한으로 제어되지 않는 권한이 실제로 필요한 특정 도구를 사용해야 하는 경우 스크립트가 필요한 기능으로 실행될 수 있습니다. 조롱당함(즉, 테스트 목적으로 조롱당함)
답변3
bash를 하위 프로세스로 시작하는 옵션을 사용 -p
하고 상위 프로세스의 ruid=0이지만 euid가 다른 경우에 가능합니다.
~에 따르면bash(1) 매뉴얼 페이지:
쉘 시작 시 유효 사용자(그룹) ID가 실제 사용자(그룹) ID와 동일하지 않은 경우,
-p
이 옵션을 제공하지 않으면 시작 파일을 읽지 않으며 해당 환경에서 쉘 기능을 상속받지 않습니다. ,SHELLOPTS
,BASHOPTS
, 환경에CDPATH
변수가GLOBIGNORE
나타나면 무시되고 유효 사용자 ID는 실제 사용자 ID로 설정됩니다. 호출 시 이 옵션을 제공 하면-p
시작 동작은 동일하지만 유효 사용자 ID가 재설정되지 않습니다.