리눅스 who 명령어 사용법 - 현재 접속자 확인과 재부팅 전 안전 점검
이 명령어를 언제 쓰는가
서버를 재부팅하거나 서비스를 내리기 직전에 "지금 나 말고 누가 붙어 있나"를 확인하는 명령이다. 다른 팀이 같은 서버에서 배포 중인데 모르고 재부팅해 사고가 나는 일은 생각보다 흔하다.
보안 점검에서도 쓴다. 알 수 없는 IP에서 들어온 세션이 붙어 있으면 그 자리에서 잡을 수 있다. 과거 이력은 last가 담당하고, who는 지금 이 순간만 본다.
기본 형식
who [옵션] [파일]
who는 /var/run/utmp(배포판에 따라 /run/utmp)에 기록된 현재 로그인 세션 목록을 읽어 보여준다. 파일 인자를 주면 그 파일을 대신 읽는다. 예를 들어 who /var/log/wtmp는 과거 로그인 기록 파일을 대상으로 삼는다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
| -H | 열 제목 표시 | who -H |
| -u | 유휴 시간과 프로세스 ID를 함께 표시 | who -uH |
| -a | 가능한 모든 정보를 한꺼번에 | who -a |
| -b | 마지막 부팅 시각 | who -b |
| -r | 현재 런레벨 | who -r |
| -q | 사용자 이름과 총 접속 수만 간단히 | who -q |
| -m | 이 터미널에 붙은 나 자신만 | who -m |
출력 읽는 법
NAME LINE TIME COMMENT
hscho pts/0 2026-08-25 20:26 (192.168.0.31)
deploy pts/1 2026-08-25 21:04 (10.0.2.15)
사용자 이름, 터미널 장치, 로그인 시각, 접속 출발지 순이다. pts/N은 SSH나 터미널 에뮬레이터로 붙은 가상 터미널이고, tty1 같은 것은 물리 콘솔이다. macOS에서는 콘솔 세션이 console로 나온다.
-u를 붙이면 유휴 시간 열이 추가된다. 점(.)은 최근 1분 안에 입력이 있었다는 뜻이고, 02:31처럼 나오면 2시간 31분째 아무것도 안 하고 붙어만 있는 세션이다. old는 24시간 이상 방치된 세션이다.
실전 예제
1) 재부팅 전에 다른 작업자가 있는지 확인한다.
who -uH
2) 나 하나뿐인지 숫자로 빠르게 확인한다.
who -q
3) 접속자 수만 뽑아 스크립트 조건으로 쓴다.
if [ "$(who | wc -l)" -gt 1 ]; then
echo "다른 세션이 있다. 재부팅 보류"
exit 1
fi
4) 어느 IP에서 몇 명이 붙어 있는지 집계한다.
who | awk -F'[()]' 'NF > 1 {print $2}' | sort | uniq -c | sort -rn
출발지는 괄호 안에 들어 있으므로 괄호를 구분자로 잘라 낸다. $NF로 마지막 열을 집으면 출발지가 없는 콘솔 로그인에서 IP가 아니라 로그인 시각이 집계되어 버린다.
5) 부팅 시각과 런레벨을 함께 본다(장애 보고서용).
who -b
who -r
6) 내 세션의 터미널 이름을 알아내 다른 명령에 넘긴다.
who am i
tty
함정과 주의점
who에 안 보이는 접속이 많다. who는 utmp에 기록을 남기는 로그인 세션만 본다. 그런데 ssh server "systemctl restart nginx"처럼 명령만 실행하고 빠지는 접속은 의사 터미널을 할당하지 않으므로 utmp에 남지 않고 who에도 안 나온다. rsync, scp, git over ssh도 마찬가지다. "아무도 없다"는 판단을 who만으로 내리면 안 된다. 실제로 붙어 있는 SSH 연결은 ss -tnp state established '( dport = :22 or sport = :22 )'로 확인하고, systemd 환경이면 loginctl list-sessions가 더 정확하다.
컨테이너 안에서는 아무것도 안 나온다. 도커 이미지에는 utmp 파일이 비어 있거나 아예 없어서 docker exec -it로 들어가 who를 쳐도 결과가 없다. 버그가 아니라 정상이다.
whoami와 who am i는 다른 명령이다. whoami는 현재 유효 사용자 이름을 출력하므로 sudo whoami는 root가 된다. 반면 who am i는 utmp에서 이 터미널의 로그인 기록을 찾는 것이라 sudo를 써도 원래 로그인한 사용자가 나온다. 감사 로그를 남길 때 이 차이가 중요하다.
함께 보면 좋은 명령어
- last - 지금이 아니라 과거의 로그인 이력을 본다.
- ss - utmp에 안 남는 SSH 연결까지 소켓 수준에서 잡아낸다.
- id - 붙어 있는 사용자가 어떤 권한을 가졌는지 확인한다.