쉘 스크립트를 작성해서 실행할 경우 해당 파일의 실행이 root 권한인지 확인 해야 하는 경우가 종종 발생한다. 예를 들어 스크립트 내 코드가 root 권한이 필요한 동작들이 여럿 있는 경우가 그렇다. 그런 경우 스크립트 내에서 sudo
를 명령어 앞에 일일이 쓰는 것 보다 해당 스크립트 파일을 root 권한으로 실행하는 것이 효율적이다.
그렇게 되면 해당 파일이 root 권한으로 실행 되었는지 체크하는 분기문이 스크립트 제일 처음에 있어야 할 것이다. 그걸 작성하기 위해서는 먼저 EUID에 대해서 먼저 알아야 한다.
EUID / RUID ?
- RUID: Real User ID의 약어로 실제 사용자의 ID를 나타내는 값
- EUID: Effective User ID의 약어로 어떤 유저 권한으로 프로세스를 실행하고 있는지를 나타내는 값
shell script 파일을 실행하게 되면 Bash shell은 항상 순차적으로 코드가 실행된다. 따라서 스크립트 맨 위에 if 구문으로 현재 스크립트 실행 권한이 root가 맞는지 확인만 하면 끝이다. 참고로 Root의 EUID 값은 0이다
/etc/passwd 파일에서도 각 사용자별 UID(UserID)를 확인할 수 있다.
$ cat /etc/passwd | awk -F ":" '$3 <=0 {print $1,$3}' | column -t
root 0
위 명령어를 해석해보고 넘어가자
-F ":"
: 필드 구분자를:
로 설정하라는 의미이다. 이렇게 설정하면 각 라인을 콜론(':')을 기준으로 필드를 분할할 수 있다.- 파이썬의 split() 함수의 기능과 비슷하다고 보면 된다.
'$3 <=0 {print $1, $3}'
: awk 프로그램의 명령 블록이다. 이 블록은 사용자 계정 정보를 처리하고 출력하는 로직을 포함하고 있다.$3
: 라인에서 세 번째 필드를 나타낸다. 이는 UID(사용자 식별자)를 나타내는 필드이다.$3 <=0
: UID가 0보다 작거나 같은 조건을 검사한다. UID가 0인 경우는 보통 시스템 관리자(root) 게정을 의미한다.{print $1, $3}
: 조건을 만족하는 경우, 사용자 이름과 UID를 출력한다.$1
은 라인에서 첫 번째 필드인 사용자 이름을 나타낸다.
root 실행되었는지 체크 스크립트
check-root.sh
#!/bin/bash
# Make sure only root can run my script
if [[ ${EUID} != 0 ]]
then
echo -e "This Script must be run as root\n${EUID}"
exit 1
fi
echo "Its ok"
echo ${EUID}
스크립트 실행
$ sudo bash check-root.sh
Its ok
0
# 일반 권한으로 실행
$ bash check-root.sh
This Script must be run as root
1000