Linux command - lsof

sycho·2023년 12월 1일
0

Linux Commands

목록 보기
5/30

lsof

  • documentation 여기서 설명하는 것 이상으로 유용한 command 및 lsof에서 출력하는 정보에 대한 내용이 써져 있으니 궁금하면 찾아보자.

  • process들이 열고 있는 file들을 찾는데 사용한다. 현 directory의 file들을 나열하는 ls command와 헷갈리지 말자

  • 파일을 누가 사용하고 있는건지 파악할때, 모르는 process가 무슨 짓거리를 하고 있는지 파악할때 등에 쓰인다. malicious attack을 탐지하는데 활용이 될 수 있다.

$ lsof
COMMAND   PID   TID TASKCMD  USER   FD      TYPE             DEVICE SIZE/OFF             NODE NAME
init        1                root  cwd   unknown                                              /proc/1/cwd (readlink: Permission denied)
init        1                root  rtd   unknown                                              /proc/1/root (readlink: Permission denied)
init        1                root  txt   unknown                                              /proc/1/exe (readlink: Permission denied)
init        1                root NOFD                                                        /proc/1/fd (opendir: Permission denied)
init        1     7 init     root  cwd   unknown                                              /proc/1/task/7/cwd (readlink: Permission denied)
init        1     7 init     root  rtd   unknown                                              /proc/1/task/7/root (readlink: Permission denied)
init        1     7 init     root  txt   unknown                                              /proc/1/task/7/exe (readlink: Permission denied)
init        1     7 init     root NOFD                                                        /proc/1/task/7/fd (opendir: Permission denied)
init       12                root  cwd   unknown                                              /proc/12/cwd (readlink: Permission denied)
init       12                root  rtd   unknown                                              /proc/12/root (readlink: Permission denied)
init       12                root  txt   unknown                                              /proc/12/exe (readlink: Permission denied)
init       12                root NOFD                                                        /proc/12/fd (opendir: Permission denied)
init       13                root  cwd   unknown                                              /proc/13/cwd (readlink: Permission denied)
init       13                root  rtd   unknown                                              /proc/13/root (readlink: Permission denied)
init       13                root  txt   unknown                                              /proc/13/exe (readlink: Permission denied)
init       13                root NOFD                                                        /proc/13/fd (opendir: Permission denied)
sh         14               sycho  cwd       DIR               0,47     4096 6192449488238263 /mnt/c/Users/Seiyeon Cho/AppData/Local/Programs/Microsoft VS Code
sh         14               sycho  rtd       DIR               8,16     4096                2 /
sh         14               sycho  txt       REG               8,16   125688             1328 /usr/bin/dash
sh         14               sycho  mem       REG               8,16  2216304             6521 /usr/lib/x86_64-linux-gnu/libc.so.6
sh         14               sycho  mem       REG               8,16   240936             6325 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2
sh         14               sycho    0r     FIFO               0,11      0t0            17431 pipe
...

content

  • COMMAND : 해당 행 관련 process의 command의 첫 9글자

  • PID : 해당 행 관련 process의 ID

  • TID : 해당 행 관련 task(thread)의 ID

  • TASKCMD : 해당 행 관련 task(thread)의 command. 보통 process의 command, 즉 COMMAND와 동일한데 다를 때도 있다.

  • USER : process 소유 user ID

  • FD : file descriptor. FD 숫자이거나 특정 character 모음일수 있다.

    • cwd : current working directory
    • rtd : root directory
    • txt : program text. 코드, data등이 담긴 파일
    • mem : memory-mapped file
    • 숫자인 경우 뒤에 r, w, u를 통해 FD 관련 권한이 붙을 수 있다. (read, write, both)
    • file synchronization 관련 lock 정보도 붙을 수 있다 (r, R, w, W, u, U, x, X). 있다면 위의 권한 관련 알파벳 다음에 붙는다.
  • TYPE : file의 종류

    • DIR : directory
    • REG : 일반 파일
    • CHR : Character special file (I/O 장치에 접근할 때 사용되는 파일)
    • FIFO : first in first out file. 타 process에게 data를 전달할 때 사용되며, 형식이 first-in-first-out이라서 저런 이름이 붙음.
  • DEVICE : 파일 형식이 뭐냐에 따라 다른데, 일단 DIR, REG, CHR의 경우 device number을 알려준다.

  • SIZE/OFF : file size 혹은 file offset을 알려준다. 단위는 byte.

  • NODE : 역시나 file 형식에 따라 다른데, 일반적으로 local file의 file system 상의 node number을 지칭한다. 즉 일반적으로 file의 metadata를 보유하는 inode의 number을 보유한다고 생각하면 된다. 뭔소린지 모르면 이 글을 참고하자.

  • NAME : file이 존재하는 file system / mount point의 이름이다.

option

-u

  • 사용자가 open한 file을 파악할 때 쓰인다.
$ lsof -u sycho

-i

  • 이 command의 경우, 파일과 관련된 네트워크 연결의 server/client측 ip 주소와 port number까지 확인이 가능하다(!). 해당 정보는 NAME column에 나온다.

  • 특정 protocol과 port 연결과 관련된 file들을 파악할 때 쓰인다. 밑은 22 port의 TCP 연결에서 열고 있는 파일들을 출력한다.

$ lsof -i TCP:22
  • 아니면 IPv4/IPv6 네트워크와 관련된 파일들을 파악할 때 쓰인다.
$ lsof -i 4
$ lsof -i 6
  • 특정 protocol에 관한 여러개의 port에서 진행되는 연결들에 대해 한번에 탐색도 가능하다. 밑은 1~1024port에 있는 연결들중 TCP와 관련된 연결에서 열고 있는 파일들을 파악할 때 쓰인다.
$ lsof -i TCP:1-1024
  • 모든 network connection과 관련된 file 파악에 쓰일 수도 있다.
$ lsof -i

^

  • 특정 사용자를 제외한 모든 process에서 사용하는 file 탐색 때 쓰인다.
$ lsof -i -u^root

-p

  • 특정 process id에서 사용하는 file 탐색에 쓰인다.
$ lsof -p 1

-c

  • 특정 command를 수행하는 process들에서 사용하는 file 탐색에 쓰인다. 밑은 lsof command를 수행하는(...) process들이 접근하는 file들을 알려준다.
$lsof -c lsof

응용

  • 특정 사용자의 process를 전부 kill할 거면 밑과 같이 하자.
$ kill -9 `lsof -t -u sycho`
  • grep command랑 함께 활용하면, 출력물 내에서 특정 문자열이 포함된 녀석만을 손쉽게 찾는 것이 가능하다. 이를 활용해서 위의 option이랑 같은 역할의 command를 option을 외우지 않아도 수행하는게 가능하다. 예를들어 밑의 경우 lsof 출력물 중 sycho가 등장한 항목만 출력하기에, -u와 비슷한 역할을 한다고 볼 수 있다. 완전히 동일하진 않은게, 경로에 sycho가 있으면 그것도 출력하기 때문... 참고로 |은 pipe라고 불리는데 이게 뭔지 모르면 다음 글 참고. 그래도 정확한 출력을 원하면 option을 사용하도록 하자.
$ lsof | grep "sycho"
  • wc command는 파일 내 단어 개수를 파악하는데 사용된다. 여기에 -l option을 사용할 경우 파일의 줄 개수를 파악하는게 가능한데, pipe를 활용해서 lsof의 출력물의 줄/단어 개수를 파악하는 것도 가능하다. 다만 유의할게 맨 처음에 header line도 개수에 포함한다는 것이다.
$ lsof | wc -l
2207
  • 응용이라기보단 option을 안 쓰는 command라고 생각하면 되는데, 특정 directory의 하위 파일들 중 열려 있는 녀석들이 뭔지 파악하는 것도 가능하다. 그냥 기준 direcotry를 우측에 넣으면 된다. 예를 들어 밑의 경우 /dev 하위 파일들 중 열려 있는 모든 파일들을 출력한다.
$ lsof /dev

유의사항

  • 해당 command를 실행한 user이 볼 수 있는 권한을 가진 파일들에 대한 정보만을 출력한다. 즉 만약 실제로 열려 있는 파일이더라도, lsof를 실행한 user이 볼 수 있는 권한이 없으면 관련 정보는 출력이 되지 않는다. sudo를 통해 위의 wc command 응용을 통해 이를 확인하는 것이 가능하다.
$ lsof | wc -l
2207
$ sudo lsof | wc -l
[sudo] password for sycho: 
2430

참고 영상
Learn Linux TV : Linux Crash Course - The lsof Command

profile
CS 학부생, 핵심 관심 분야 : Embed/System/Architecture/SWE

0개의 댓글