리눅스 last 명령어 사용법 - 로그인 이력과 재부팅 시각 추적하기
이 명령어를 언제 쓰는가
세 가지 상황에서 쓴다. 첫째, 서버가 나도 모르게 재부팅됐을 때 정확히 몇 시에 내려갔다 올라왔는지 확인할 때. 둘째, 침해 사고 조사에서 누가 언제 어디서 로그인했는지 훑을 때. 셋째, 퇴사자 계정이나 사용하지 않는 계정을 정리하기 전에 마지막 접속 시점을 확인할 때다.
uptime이 "지금 몇 시간째 떠 있다"만 알려준다면 last는 그 이전까지 거슬러 올라간다. 정전인지 커널 패닉인지 계획 재부팅인지도 종료 기록의 유무로 구분할 수 있다.
기본 형식
last [옵션] [사용자명 | tty ...]
last는 /var/log/wtmp 바이너리 파일을 최신 기록부터 역순으로 읽는다. 인자로 사용자명을 주면 그 사용자만, reboot이나 shutdown이라는 특수 이름을 주면 재부팅/종료 기록만 걸러낸다.
자주 쓰는 옵션
| 옵션 | 의미 | 예시 |
|---|---|---|
| -n 수 | 최근 N건만 출력 | last -n 20 |
| -F | 연/월/일 초까지 전체 시각 표시 | last -F -n 10 |
| -i | 호스트명 대신 IP 주소로 표시 | last -i |
| -a | 출발지 정보를 맨 오른쪽 열로 이동(잘림 방지) | last -a |
| -x | 시스템 종료·런레벨 변경 기록 포함 | last -x |
| -s / -t | 이 시각 이후 / 이 시각 이전으로 한정 | last -s -7days |
| -f 파일 | 다른 wtmp 파일을 지정 | last -f /var/log/wtmp.1 |
| -w | 사용자명과 도메인을 줄이지 않고 전부 | last -w |
-F -i -a -x -s -t -w는 리눅스의 util-linux 판 last에만 있다. macOS/BSD의 last는 옵션 체계가 달라서 -t가 시각이 아니라 tty 지정이고 -F는 아예 없다. 이 글의 예제는 리눅스 기준이다.
출력 읽는 법
hscho pts/0 192.168.0.31 Tue Aug 25 20:26 still logged in
deploy pts/1 10.0.2.15 Tue Aug 25 18:02 - 18:44 (00:42)
reboot system boot 5.15.0-91-generi Tue Aug 25 17:58 still running
hscho pts/0 192.168.0.31 Mon Aug 24 09:11 - crash (1+08:47)
맨 오른쪽 괄호는 세션 지속 시간이고 1+08:47은 1일 8시간 47분이다. 여기서 가장 중요한 단어는 마지막 줄의 crash다. 정상 종료라면 로그아웃 기록이 남지만, 종료 기록 없이 부팅 기록이 먼저 나타나면 last가 그 세션을 crash로 표시한다. 즉 계획된 재부팅이 아니라 커널 패닉이나 전원 차단이었다는 신호다. 정상 종료된 세션은 down으로 표시된다.
reboot 줄의 세 번째 열에는 그때 부팅한 커널 버전이 들어간다. 커널 업그레이드가 언제 적용됐는지 확인할 때 유용하다.
실전 예제
1) 이 서버가 최근 몇 번, 언제 재부팅됐는지 확인한다.
last -x reboot shutdown | head -20
2) 특정 계정의 최근 접속 이력을 초 단위 시각과 IP로 본다.
last -F -i -a deploy | head -20
3) 지난 7일간의 로그인만 추린다(침해 조사 1차 스캔).
last -F -i -s -7days
4) 어느 IP에서 몇 번 들어왔는지 집계해 낯선 출발지를 찾는다.
last -i -w | awk 'NF > 3 && $3 ~ /^[0-9]+\./ {print $3}' | sort | uniq -c | sort -rn | head
5) 로테이트되어 넘어간 지난달 기록까지 뒤진다.
ls -l /var/log/wtmp*
sudo last -F -f /var/log/wtmp.1 | head -40
6) 로그인 실패(무차별 대입 시도)를 확인한다.
sudo lastb -F -i -n 30
lastb는 last와 짝을 이루는 명령으로 실패 기록 파일 /var/log/btmp를 읽는다. root 권한이 필요하다.
함정과 주의점
wtmp는 로테이트되어 사라진다. 대부분의 배포판이 logrotate로 wtmp를 월 단위로 돌린다. "3개월 전 접속 기록이 안 보인다"는 것은 기록이 없어서가 아니라 /var/log/wtmp.1 같은 파일로 넘어갔거나 이미 삭제된 것이다. Ubuntu/Debian은 /etc/logrotate.conf, RHEL 계열은 /etc/logrotate.d/wtmp에 보관 주기가 정의돼 있으니 감사 요건이 있다면 그 값을 먼저 늘려야 한다.
침해 조사에서 last만 믿으면 안 된다. wtmp는 그냥 파일이고 root 권한을 얻은 침입자는 자기 기록만 지울 수 있다. 그래서 실제 조사에서는 반드시 교차 확인한다. systemd 환경이면 journalctl -u ssh -S "2026-08-20", Ubuntu/Debian은 /var/log/auth.log, RHEL 계열은 /var/log/secure를 함께 본다. last에는 없는데 auth.log에는 Accepted publickey가 있다면 그것 자체가 조작 신호다.
PTY 없는 접속은 아예 기록되지 않는다. ssh host "명령", scp, rsync, git 푸시는 wtmp에 남지 않는다. 즉 last가 비어 있어도 그 계정으로 명령이 실행됐을 수 있다. 이런 접속까지 보려면 SSH 데몬 로그(auth.log/secure)를 봐야 한다.
lastlog와 헷갈리지 않는다. lastlog는 전혀 다른 명령으로, 모든 계정의 마지막 로그인 시각만 한 줄씩 보여준다. 미사용 계정을 한눈에 골라낼 때는 lastlog -b 90(90일 이상 미접속)이 훨씬 빠르다.
함께 보면 좋은 명령어
- who - 과거가 아니라 지금 붙어 있는 세션을 본다.
- journalctl - wtmp가 놓치거나 지워진 접속을 SSH 데몬 로그로 교차 검증한다.
- uptime - last의 재부팅 기록과 현재 가동 시간을 맞춰 본다.