sudo -l 출력, 어떻게 읽어야 할까?
이 글에서 다루는 내용
sudo -l -U <user> 명령의 출력이 줄바꿈 때문에 한눈에 들어오지 않을 때, 이를 구조적으로 해석하는 방법을 다룬다. 특히 Defaults 영역과 명령 목록 영역을 구분하는 법, 그리고 (ALL), (enes) 같은 괄호 표기가 어떤 권한 주체를 의미하는지를 실제 출력 예시와 함께 살펴본다. 마지막으로 출력이 지저분할 때 보기 좋게 정렬하는 쉘 명령 팁까지 정리한다.
출력의 기본 구조
sudo -l 명령의 출력은 크게 두 블록으로 나뉜다.
Matching Defaults entries for <user> on <host>:
<sudo 기본 설정들>
User <user> may run the following commands on <host>:
(실행권한주체) NOPASSWD: 명령1, 명령2, ...
(실행권한주체) NOPASSWD: 명령3, ...
첫 번째 블록은 sudo가 어떤 환경으로 동작하는지를 알려주는 Defaults 설정이고, 두 번째 블록이 실제로 "이 사용자가 무엇을 할 수 있는지"를 나타내는 핵심 부분이다.
질문의 출력을 해석하면
질문에 주어진 출력은 다음과 같이 해석된다.
① Defaults (sudo 동작 설정)
env_reset— sudo 실행 시 환경 변수를 초기화mail_badpass— 비밀번호를 틀렸을 때 관리자에게 메일 발송secure_path=...— sudo 실행 시 사용할 PATH를 고정use_pty— 가상 터미널(pty)을 사용하여 명령 실행
② github-runner가 실행 가능한 명령
첫 번째 줄은 (ALL) NOPASSWD:로 시작하는데, 이는 모든 사용자(보통 root 포함) 권한으로 비밀번호 없이 실행할 수 있다는 뜻이다. 해당 명령은 systemctl의 restart, start, stop, status를 blog-spring과 word-mov 두 서비스에 대해 각각 실행할 수 있다.
두 번째 줄은 (enes) NOPASSWD:로 시작하며, enes 사용자 권한으로만 비밀번호 없이 /usr/bin/pm2를 실행할 수 있다는 의미다.
괄호 ( ) 표기의 의미
sudo -l 출력을 읽을 때 가장 헷갈리는 부분이 바로 명령 앞의 괄호다. 이 괄호는 "누구의 권한으로 실행할 수 있는가"를 나타낸다.
| 표기 | 의미 |
|---|---|
(ALL) |
모든 유저(보통 root 포함)로 실행 가능 |
(enes) |
sudo -u enes 명령 형태로만 실행 가능 |
(ALL:ALL) |
모든 유저 + 모든 그룹으로 실행 가능 |
(root) |
root로만 실행 가능 |
따라서 github-runner는 sudo systemctl restart blog-spring은 기본값인 root 권한으로 실행하면 되지만, pm2는 반드시 sudo -u enes /usr/bin/pm2 ... 처럼 enes 사용자로 지정해서 실행해야 한다. 이 부분을 놓치면 CI/CD 스크립트에서 권한 오류로 헤매기 쉽다.
출력을 보기 편하게 만드는 팁
터미널 폭이 좁아 줄바꿈이 애매할 때는 아래처럼 정렬해서 볼 수 있다.
# 단어 경계에서 줄바꿈하여 100자 폭으로 정렬
sudo -l -U github-runner | fold -s -w 100
명령어만 한 줄씩 보고 싶다면 콤마 기준으로 분리하는 방법이 유용하다.
# NOPASSWD 항목만 뽑아서 한 줄씩 출력
sudo -l -U github-runner | grep NOPASSWD | tr ',' '\n'
이렇게 하면 GitHub Actions runner나 자동화 스크립트에서 사용 가능한 명령을 한눈에 점검하기 좋다.