매일 치는 sudo
터미널을 쓰다 보면 Permission denied가 뜰 때마다 반사적으로 앞에 sudo를 붙이게 된다. 그런데 정작 "이게 뭘 하는 건지" 설명하라고 하면 막막한 경우가 많다. 이 글에서는 sudo의 의미부터, 작동 방식, 그리고 쓰면서 한 번쯤 궁금했던 것들까지 정리해본다.
sudo가 뭔가?
sudo는 Superuser Do의 약자다. 직역하면 "슈퍼유저로서 실행해라"는 뜻이다.
리눅스에는 모든 권한을 가진 root 계정이 존재한다. 시스템 파일을 수정하거나, 패키지를 설치하거나, 다른 사용자의 데이터에 접근하는 것 모두 root만 할 수 있는 작업들이다. sudo는 이 root 권한을 잠깐 빌려서 명령어를 실행하게 해주는 도구다.
sudo apt update # 패키지 목록 갱신 (시스템 전체에 영향)
sudo mysql -u root -p # DB 최고 관리자로 접근
왜 root로 직접 로그인하지 않나?
root로 상시 로그인해두면 모든 명령어가 즉시 실행되니 편할 것 같지만, 그만큼 위험하다. 실수로 rm -rf /를 치거나, 악성 스크립트가 실행되면 시스템 전체가 날아간다.
sudo의 존재 이유가 바로 이것이다. 꼭 필요한 순간에만 root 권한을 빌리고, 나머지 시간엔 일반 사용자로 작업하게 유도하는 구조다.
sudo를 치면 내부에서 어떤 일이 생기나?
/etc/sudoers파일을 확인해서 이 사용자에게 sudo 권한이 있는지 체크한다.- 비밀번호 입력을 요구한다. 단, root 비밀번호가 아니라 본인 계정 비밀번호다.
- 인증이 완료되면 해당 명령어를 root 권한으로 실행하고, 끝나면 권한을 반납한다.
sudo를 안 쳐도 되는 경우가 있다
분명히 어떤 명령어는 sudo 없이도 잘 되고, 어떤 건 막힌다. 차이는 이렇다.
- 이미 root 계정인 경우 — 처음부터 최고 권한이라 sudo가 필요 없다.
- 내 파일인 경우 — 내 홈 디렉토리 안의 파일은 내가 주인이라 자유롭게 읽고 쓴다.
- 권한이 모두에게 열려 있는 경우 —
chmod 755같이 other 권한이 있으면 누구나 실행 가능하다.
비밀번호를 묻는 경우 vs 안 묻는 경우
sudo를 쳐도 비밀번호를 묻지 않을 때가 있다. 이건 인증 캐시 때문이다.
- sudo는 한 번 인증하면 일정시간동안 기억한다.
- 그 안에 다시 sudo를 쓰면 비밀번호를 다시 묻지 않는다.
sudo -k로 캐시를 강제 초기화할 수 있다.
또한 /etc/sudoers에서 특정 명령어를 NOPASSWD로 설정하면 아예 비밀번호를 묻지 않도록 구성할 수도 있다. 자동화 스크립트에서 자주 쓰는 방식이다.
| 상황 | 이유 |
|---|---|
| sudo 없이 실행됨 | 이미 root거나, 내 파일이거나, 권한이 열려있거나 |
| sudo 쳤는데 비번 안 물어봄 | 캐시 남아있거나, NOPASSWD 설정 |
| sudo 쳤는데 비번 물어봄 | 캐시 만료 또는 처음 인증 |
| sudo 쳐도 거부됨 | sudoers에 해당 사용자 권한 없음 |
지금 내가 root인지 확인하는 방법
whoami # root 라고 나오면 root
id # uid=0(root) 이면 root
echo $EUID # 0이면 root
터미널 프롬프트 끝의 기호로도 바로 알 수 있다.
$ → 일반 사용자
# → root
macOS도 Unix 기반이라 이 명령어들이 동일하게 작동한다.
우분투에서 root로 SSH 접속이 안 되는 이유
우분투 설치 시 만드는 첫 계정은 자동으로 sudo 권한이 부여된 일반 사용자다. root 계정은 존재하지만, 기본적으로 비밀번호가 잠겨 있고 SSH 접속도 비활성화 상태다.
보안 때문이다. root SSH를 열어두면 전 세계 해커들이 비밀번호 하나만 뚫으면 서버를 통째로 가져갈 수 있다. AWS EC2 같은 클라우드 서버들도 모두 root SSH가 막혀있는 게 기본이다.
root 권한이 필요하다면, 본인 계정으로 SSH 접속 후 이렇게 하면 된다.
sudo 명령어 # 그때그때 root 권한 빌리기
sudo -i # root 쉘로 완전히 전환
sudo su의 의미
sudo su는 두 명령어가 합쳐진 것이다.
sudo— 다음 명령어를 root 권한으로 실행해라su— Switch User, 다른 사용자로 전환해라 (기본값은 root)
즉 "root 권한으로 root 계정으로 전환해라" 는 뜻이다. 결과적으로 root 쉘로 진입하게 된다.
비슷한 명령어인 sudo -i와 차이가 있다.
| 명령어 | 환경변수 | 특징 |
|---|---|---|
sudo su |
기존 사용자 환경 일부 유지 | 돌아가는 방법 |
sudo -i |
root 환경으로 완전 초기화 | 정석적인 방법 |
sudo su 후 멀쩡하던 명령어가 안 되는 이유
sudo su로 root 쉘에 들어가면 갑자기 node, npm 같은 명령어가 command not found로 뜰 때가 있다. 명령어가 사라진 게 아니라 PATH가 달라졌기 때문이다.
PATH는 명령어를 입력했을 때 OS가 실행 파일을 찾아보는 디렉토리 목록이다.
echo $PATH
# /usr/local/bin:/usr/bin:/bin:/usr/sbin ...
sudo는 보안상 PATH를 제한된 경로로 덮어쓴다. 그래서 일반 계정에서 nvm이나 npm으로 설치한 것들이 있는 경로 (/home/계정명/.nvm/...)는 root의 PATH에 없어서 못 찾는 것이다.
# 해결 방법 1: sudo -i 쓰기
sudo -i
# 해결 방법 2: sudo su 대신 sudo su - 쓰기 (로그인 쉘로 전환)
sudo su -
# 해결 방법 3: 전체 경로로 직접 실행
/home/계정명/.nvm/versions/node/v18.0.0/bin/node
마무리
sudo를 요약하면 이렇다.
리눅스는 기본적으로 사용자의 권한을 제한한다.
sudo는 꼭 필요한 순간에만 root 권한을 잠깐 빌리는 안전한 방법이고, 우분투를 포함한 대부분의 리눅스 배포판은 처음부터 이 방식을 쓰도록 설계되어 있다.
반사적으로 sudo를 붙이기 전에, 왜 권한이 필요한지 한 번쯤 생각해보는 습관이 보안에 큰 도움이 된다.
'개발 > 개발 상식' 카테고리의 다른 글
| 노트북 M.2 SSD 교체했는데 인식이 안 되는 이유 - SATA와 NVMe의 차이 (0) | 2026.03.10 |
|---|