Devin.KR
로그인

리눅스 who 명령어 사용법 - 현재 접속자 확인과 재부팅 전 안전 점검

개발자 조회 1

이 명령어를 언제 쓰는가

서버를 재부팅하거나 서비스를 내리기 직전에 "지금 나 말고 누가 붙어 있나"를 확인하는 명령이다. 다른 팀이 같은 서버에서 배포 중인데 모르고 재부팅해 사고가 나는 일은 생각보다 흔하다.

보안 점검에서도 쓴다. 알 수 없는 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 whoamiroot가 된다. 반면 who am i는 utmp에서 이 터미널의 로그인 기록을 찾는 것이라 sudo를 써도 원래 로그인한 사용자가 나온다. 감사 로그를 남길 때 이 차이가 중요하다.

함께 보면 좋은 명령어

  • last - 지금이 아니라 과거의 로그인 이력을 본다.
  • ss - utmp에 안 남는 SSH 연결까지 소켓 수준에서 잡아낸다.
  • id - 붙어 있는 사용자가 어떤 권한을 가졌는지 확인한다.