Profile picture

[Shell Script] 셸 스크립트 root로 실행 하였는지 확인 하는 방법 (EUID / RUID)

JaehyoJJAng2023년 04월 12일


쉘 스크립트를 작성해서 실행할 경우 해당 파일의 실행이 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

Loading script...