lsof 명령어란?
lsof 명령어는 LiSt Open Files에서 유래됐다. 이름 그대로 '프로세스가 열려있는 파일'을 표시하는 커맨드이다.
UNIX/Linux에서는 일반적인 파일뿐만 아니라 네트워크 소켓이나 디바이스 드라이버, 프로세스 정보도 '파일'으로써 다룬다. 따라서 열려 있는 파일을 조사하는 것으로 대기 포트나 네트워크의 맵핑 정보 등을 파악할 수 있다. lsof 명령어에 의해 '어떤 파일을 열고 있는 프로세스', '어떤 포트에 접근하고 있는 프로세스'를 특정하고 '불필요한 프로그램이 실행되고 있는지' '부정한 프로그램이 동작하고 있지는 않은지'를 알아 볼 수 있다.
인수에 파일을 전달해 실행하면 그 파일을 사용중인 프로세스 ID(PID)의 목록이 출력된다.
프로세스가 사용중인 포트를 확인하는 작성법은 아래와 같다.
lsof [ 옵션 [ : 포트번호 | 서비스 ]] [ 파일 | 프로세스 ] ※ "[ ]"는 생략가능한 인수를 표시한 것이다. "|" 으로 구분된 항목은 어느쪽이든 1개를 지정하는 것이다. |
lsof 명령어의 주요 옵션
lsof 명령어의 중요한 옵션은 다음의 표와 같다.
옵션 | 의미 |
-P | 포트 번호를 서비스 명으로 변경하지 않는다. |
-c | 프로세스 명을 지정한다 |
-i | 네트워크 소켓 파일을 표시한다 |
-n | IP 주소를 표시한다 |
-p | 프로세스 ID를 지정한다 |
"-c' 옵션의 뒤에 프로세스 명을 지정하면 그 프로세스가 열고 있는 파일을 특정할 수 있다. 프로세스명이 아닌 PID로 지정하는 경우 "-p" 옵션을 이용한다.
특정 포트를 확인할 경우 "-i"을 이용한다. 인수를 지정하지 않은 경우 모든 포트를 대상으로 사용의 유무를 확인할 수 있다. 포트로 특정하는 경우는 "i:XXXX"와 같이 포트 번호를 지정하면 된다.
또한 lsof명령어로 표시할 수 있는 파일, 포트는 lsof 명령어를 실행하는 유저가 읽어들이기 권한을 가지고 있는 경우로만 한한다. 네트워크 소켓 파일은 일반 유저에 대해 읽기 권한이 주어져 있지 않기 때문에 많은 경우는 root 혹은 sudo 커맨드와 합쳐 관리자 권한에서 실행한다.
대기 포트와 프로세스의 확인
로컬 호스트의 대기 포트와 프로세스의 목록을 확인하고 싶은 경우는 네트워크 소켓 파일을 표시하는 옵션 '-i'를 인수없이 실행하면 된다.
이때, IP 주소를 호스트명으로 변환되지 않도록 '-n'옵션을, 포트 번호를 서비스명으로 변환되지 않도록 '-P'옵션을 함께 지정하면 빠른 속도로 결과를 얻을 수 있다.
출력되는 항목의 내용과 의미는 아래의 표와 같다.
항목 | 의미 |
COMMAND | 실행중의 프로그램 |
PID | 프로세스 번호 |
USER | 실행 유저 |
FD | 파일 디스크립터 (/proc/<PID>/fd) |
TYPE | 파일 종류 |
DEVICE | 디바이스 번호 |
SIZE/OFF | 파일 사이즈 |
NODE | 프로토콜 |
NAME | 파일 혹은 포트 |
대기상태의 포트는 '(LISTEN)' 으로 표시되어 있다. 아래의 실행 예를 살펴보자면, Samba 서버의 데몬 (smbd)가 대기상태이므로, 해당 포트와 프로세스 ID를 알 수 있다.
$ sudo lsof -i -n -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae 742 avahi 12u IPv4 16986 0t0 UDP *:5353
avahi-dae 742 avahi 13u IPv4 16987 0t0 UDP *:46148
chronyd 757 chrony 1u IPv4 16594 0t0 UDP *:123
chronyd 757 chrony 2u IPv6 16595 0t0 UDP *:123
・
・
smbd 2198 root 27u IPv4 7258 0t0 TCP *:445 (LISTEN)
smbd 2198 root 28u IPv4 7260 0t0 TCP *:139 (LISTEN)
・
・
특정 포트로 실행중의 프로세스를 확인
특정 포트 번호로 실행중의 프로세스를 조사하는 경우는 '-i:XX'의 방법으로 '-i' 옵션의 뒤에 포트 번호를 지정하면 된다. sshd는 22번, httpd는 80번 등 주요 서비스에는 포트 번호가 할당되어 있기 때문에 (well-known 포트) , 보통은 그 번호를 지정한다.
또한 '-i' 옵션에는 포트 번호뿐만 아니라 서비스명도 지정할 수 있다. 예를 들어, ssh에 관해 서비스를 조사하는 경우에는 '-i:ssh'로 작성하면 된다.
아래의 예에서는 22번 포트로 실행중인 프로세스를 표시하고 있다.
$ sudo lsof -i:22 -P
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 2364 root 3u IPv4 918 0t0 TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED)
sshd 2368 pi 3u IPv4 918 0t0 TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED)
sshd 2490 root 3u IPv4 8220 0t0 TCP *:22 (LISTEN)
참고자료
'IT > 기초 지식' 카테고리의 다른 글
[데이터베이스] 자연키(Natural key)와 대체키(Surrogate Key) (0) | 2020.10.23 |
---|---|
[네트워크/Linux] SNMP와 snmpget, snmpwalk 명령어 (0) | 2020.10.22 |
[UML] 시퀀스 다이어그램(Sequence Diagram) 기초 정복 (0) | 2020.10.13 |
[git] 잘 잊어버리는 사람을 위한 git diff 치트 시트 (0) | 2020.10.07 |
[Linux] Linux의 기초와 명령어 정리 (0) | 2020.05.06 |