[Linux] lsof 명령어 사용법
lsof
는 “List Open File”의 축약으로, open file은 일반 파일, 디렉터리, 블록 특수 파일, 문자 특수 파일, 실행 중인 텍스트 참조, 라이브러리, 스트림 또는 네트워크 파일(인터넷 소켓, NFS 파일 또는 UNIX 도메인 소켓)이 될 수 있습니다. 옵션없이 사용하면 모든 open file을 출력하고, 다른 옵션들을 함께 사용하거나 같은 옵션을 중복해서 사용하면 “or” 조건으로 open file을 출력합니다. 제외할 옵션 값으로 지정하기 위해서는 옵션 뒤에 지정된 값 앞에 “^”를 추가하면 됩니다. lsof
명령어의 사용법은 아래와 같습니다.
lsof [옵션]/path/to/filename : 지정된 파일을 열고 있는 프로세스 정보 확인 +D /path/to/directory : 특정 디렉토리의 열린 파일 보기 -c 명령어 : 지정된 명령어에 의해 열린 파일 보기 -u 사용자 : 특정 사용자가 오픈한 파일 출력 -p PID : 지정한 PID의 파일 정보 -i 4 : IPv4에 대한 정보 -i 6 : IPv6에 대한 정보 -i {TCP|UPD}{@호스트}{:포트번호|서비스} : 인터넷 주소 기반 소겟 파일을 오픈하고 있는 프로세스 정보 확인 -a : 지정된 옵션들을 "and" 조건으로 처리 -R : 부모 프로세스ID를 추가 출력 -t : PID만 출력 +|-r {초} : 반복해서 열린 파일 정보 출력(-r: 끝없이 반복, +r: 열린 파일이 없을 때까지 반복), 디폴트 15초 -s [p:s] : 프로토콜과 연결 상태 조건으로 확인. 여러 개의 연결 상태는 콤마(,)로 나열하며 "^"는 제외할 연결 상태를 의미
lsof
명령어의 출력 포맷을 확인해 보겠습니다.
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAMECOMMAND : 실행한 명령어 PID : 프로세스 ID USER : 명령어를 실행한 사용자 FD : File Descriptor의 종류 Lnn : Library references (AIX) err : FD information error jld : jail directory (FreeBSD) ltx : Shared Library text (Code and data) Mxx : Hex memory-mapped type number xx. m86 : DOS Merge mapped file mem : memory-mapped file mmap : memory-mapped device pd : parent directory cwd:current working directory rtd : root directory tr : kernel trace file (OpenBSD) txt : program text (code and data) v86 : VP/ix mapped file NUMBER : 숫자가 오는 경우 (0u, 1u, 2u 같은..) 숫자는 FD 번호 뒤에 오는 문자의 의미 r : read access w : write acces u : read and write access 예를 들어 '0u'라는 값은 0번 FD를 Read/Write 모드로 접근하고 있다는 의미 TYPE : 파일의 종류 DIR : 디렉토리 REG : Regular File CHR : Character Special File BLK : Block Special File IPv4 : IPv4 Socket IPv6 : IPv6 Socket ax25 : Linux AX.25 Socket inet : Internet domain socket unix : UNIX domain socket FIFO : FIFO Special File KQUEUE : BSD style kernel event queue file PSXSEM : POSIX semaphore file PSXSHM : POSIX shared memory file DEVICE : 디바이스 번호 SIZE/OFF : 파일의 크기 혹은 현재 오프셋 NODE : 다음 중 하나 로컬 파일의 노드 번호 서버 호스트에서 NFS 파일의 iNode 번호 인터넷 프로토콜 타입 Linux AX.25 소켓 디바이스의 iNode 번호 혹은 IRQ NAME : 파일 이름
lsof
를 사용하여 트로이 목마로 변장된 시스템 프로그램과 정상적인 시스템 프로그램을 비교하여 변조 여부를 확인할 수 있습니다. 몇 가지 예제를 통해서 lsof
의 사용법을 알아보겠습니다.
- root 사용자가 열고 있는 파일를 제외하고 모든 오픈 파일 정보 출력
$ lsof -u^root
- 여러 사용자가 사용하고 있는 파일 정보 출력
$ lsof -u user1 -u user2
- 지정한 포트 번호 범위의 오픈 파일 정보 출력
$ lsof -i TCP:1024-2048
- 특정 사용자가 열고 있는 파일 정보의 PID 출력 및 해당 프로세스 kill
$ lsof -u user1 -t
$ lsof -u user1 -t | xargs kill -9 - 특정 사용자가 열고 있는 파일 정보 모니터링
$ lsof -a -u root -i tcp:22 -r 5
- TCP 상태가 Listen,Established인 오픈 파일 정보 출력
$ lsof -iTCP -sTCP:LISTEN,ESTABLISHED