강좌

HOME > 강좌 >
강좌| 리눅스 및 오픈소스에 관련된 강좌를 보실 수 있습니다.
 
lsof 사용하기
조회 : 6,300  


0. lsof란 
    사전적인 의미로는 열려진 파일을 보는 유틸이다 
    즉 시스템에서 구동되고 있는 프로세서에 의해 열려진 파일을 확인 하는 확인하는 것이다
    하지만 Unix, Linux계열은 프로세서분아니라  소켓등도 
    파일로 관리 함으로 lsof로 모니터링이 가능하다 .

1. 설치 및 다운로드
    일반적으로 사용하는 배포본의 경우 포함하고 있거나 배포패키를 제공한다 
    즉 rpm, dep와 같은 형테의 팡르을 찾아서 설치하면되며 
    최신버전을 원하는경우에는 ftp://vic.cc.purdue.edu/pub/tools/unix/lsof에서 확인이 가능하다 .

    다운 받은후 압축을 해제하면 먼저 소스파일의 무결성을 조사하여야한다 .
    # ./inventory
        Conducting an inventory of the lsof distribution; this will take a while.
        ....
        ....
        Examining lib: OK
        Examining scripts: OK
        This lsof distribution seems to be complete.
    

    무결성 조사이후 complete가 되면 헤더파일에대한 테스및 환경을 구성해야한다 
    # ./Configure

    이후 이상이 없다면 컴컴파일과 인스톨을 진행한다 
    # make && make install


2. lsof 옵션 및 기본 사용법
    lsof 사용법 
        lsof [ -?abChlnNOPRstUvVX ] [ -A A ] [ -c c ] [ +c c ] [ +|-d d ] [ +|-D D ] [ +|-f [cfgGn] ] 
            [ -F [f] ] [ -g [s] ] [ -i [i] ] [ -k k ] [ +|-L [l] ] [ +|-m m ] [ +|-M ] [ -o [o] ] [ -p s ] [ +|-r [t] ] 
            [ -S [t] ] [ -T [t] ] [ -u s ] [ +|-w ] [ -x [fl] ] [ -z [z] ] [ -Z [Z] ] [ -- ] [names]


    lsof 의 옵션 
        -?, -h    list help
        -a        AND selections (OR)
        -d        s select by FD set
        -D        D ?|i|b|r|u[path]
        +|-f        -files +filesys
        -l        list UID numbers
        -n        no host names
        -N        select NFS files
        -s        list file size
        -t        terse listing
        -T        disable TCP/TPI info
        -v        display version info
        -V        verbose search
        -F [f]    select fields;-F? for help
        -o o        o 0t offset digits (8)
        -S [t]    t second stat timeout(15)
        -i i        select by IPv4 address: [proto][@host|addr][:svc_list|port_list]
        +|-r [t]    repeat every t seconds (15);
                + until no files, - forever
        -b        avoid kernel blocks
        -c c        list command c
        -P        no port names
        -i        select IPv4 files
        -p s        select by PID set
        -C        no kernel name cache
        +|-w        Warnings (+)
        -R        list paRent PID
        -k k        kernelsymbols (/dev/ksyms)
        -U        select Unix socket
        -u s        exclude(^)/select login/UID s
        -m m        kernel memory (/dev/kmem)
        +|-M        portMap registration (-)
        --         end option scan
        -g [s]    select by process group ID set and print process group IDs
        names    select named files or files on named file systems 

    lsof 각 컬럼에 대한 정의 
        Command            프로세스와 관련된 Unix command 이름
        -------------------------------------------------------------------------------------------------
        PID,PPID,PGRP        Process IDentification number
                        Parent Process IDentification number
                        (해당 프로세스의 부모 프로세스 ID)
                        Process Group IDentification number
                        (해당 프로세스와 관련된 프로세스 그룹 ID)
        -------------------------------------------------------------------------------------------------
        USER                해당 프로세스를 소유한 사용자 ID 또는 login name
        -------------------------------------------------------------------------------------------------
        FD                File Descriptor number
                        (ex) cwd : current working directory
                        r : read access / w : write access / u : read and write access
        -------------------------------------------------------------------------------------------------
        TYPE                해당 파일과 관련한 노드 타입
                        (ex) inet : Internet domain socket
        -------------------------------------------------------------------------------------------------
        DEVICE            device number
        -------------------------------------------------------------------------------------------------
        SIZE                file 이나 file offset의 사이즈
        SIZE/OFF
        OFFSET
        -------------------------------------------------------------------------------------------------
        INODE            local file 의 node number 또는 Internet protocol type
        NODE-ID            또는 서버 호스트의 NFS file의 inode number
        -------------------------------------------------------------------------------------------------
        NAME                해당 파일이 소속된 mount point나 파일 시스템의 이름 

3. lsof 이용방법

    lsof <filename>        해당 파일을 액세스 하는 프로세서 확인
        # lsof /tmp/mysql.sock
        COMMAND  PID  USER   FD   TYPE     DEVICE SIZE NODE NAME
        mysqld  2617 mysql   12u  unix 0xf4705e40      5907 /tmp/mysql.sock


    lsof <directoryname>    해당 디렉토리를  엑세스 하는  프로세서 확인 
        # lsof /home
        COMMAND  PID        USER   FD   TYPE DEVICE    SIZE     NODE NAME
        httpd   4705      nobody  cwd    DIR   8,17    4096 13828178 /home/test/
        httpd   4705      nobody   22u   REG   8,17       0 13853325 /home/test/data/session/sess_5a9d8c235bb55430370c131b95bdaf08
        httpd   5662      nobody   21r   REG   8,17  172964 17925310 /home/test/images/2009/06/05/dWljaHNtdWx0aV8xMjQ0MjA2OTE4.jpg
        httpd   5797      nobody  cwd    DIR   8,17    4096 13828269 /home/test/js
        httpd   5920      nobody  cwd    DIR   8,17    4096 13828269 /home/test/js
        httpd   5920      nobody   22u   REG   8,17      16 13840521 /home/test/data/session/sess_50941be40d86bf93a77cebf04570f9d8
        httpd   6034      nobody   21r   REG   8,17  178051 14489669 /home/test/images/2009/06/07/eWhyamphbmdfMTI0NDMzNTIxMw==.jpg
        httpd   6066      nobody   22u   REG   8,17       0 13841011 /home/test/data/session/sess_9137b3fecd4352d194e92d5b35374593
        httpd   6209      nobody   22u   REG   8,17       0 13840040 /home/test/data/session/sess_7c81eab19efa98c260c48bb1736261ef
        httpd   6433      nobody  cwd    DIR   8,17    4096 13828129 /home/test
        httpd   6433      nobody   22u   REG   8,17       0 13841235 /home/test/data/session/sess_b211208c7485bc3e1380ca12cfe981c5

    lsof -i             열려있는 소켓 확인 
        COMMAND     PID        USER   FD   TYPE    DEVICE SIZE NODE NAME
        httpd      2115      nobody    3u  IPv6  65745129       TCP *:http (LISTEN)
        httpd      2115      nobody   20u  IPv6 131549543       TCP xxx.xxx.xxx.xxx:http->219.241.231.110:cs-live (FIN_WAIT2)
        httpd      2116      nobody    3u  IPv6  65745129       TCP *:http (LISTEN)
        httpd      2116      nobody   20u  IPv6 131549652       TCP xxx.xxx.xxx.xxx:http->121.55.80.117:dict-lookup (FIN_WAIT2)
        httpd      2117      nobody    3u  IPv6  65745129       TCP *:http (LISTEN)
        httpd      2117      nobody   20u  IPv6 131549861       TCP xxx.xxx.xxx.xxx:http->59.25.15.194:gbs-smp (ESTABLISHED)

    lsof -i TCP        열려있는 TCP소켓 확인 
        COMMAND     PID        USER   FD   TYPE    DEVICE SIZE NODE NAME
        sshd       2521        root    3u  IPv6      5729       TCP *:ssh (LISTEN)
        xinetd     2550        root    5u  IPv4      5910       TCP *:pop3 (LISTEN)
        xinetd     2550        root    6u  IPv4      5911       TCP *:rsync (LISTEN)
        vsftpd     2575        root    3u  IPv4      5822       TCP *:ftp (LISTEN)
        mysqld     2617       mysql   10u  IPv4      5906       TCP *:mysql (LISTEN)
        sendmail   2651        root    4u  IPv4  81221389       TCP *:smtp (LISTEN)
        httpd      4536      nobody    3u  IPv6  65745129       TCP *:http (LISTEN)
        httpd      4536      nobody   20u  IPv6 131583624       TCP xxx.xxx.xxx.xxx:http->122.47.11.45:eicon-x25 (FIN_WAIT2)
        httpd      4537      nobody    3u  IPv6  65745129       TCP *:http (LISTEN)
        httpd      4537      nobody   20u  IPv6 131584625       TCP xxx.xxx.xxx.xxx:http->121.181.169.49:street-stream (ESTABLISHED)

    lsof -i UDP        열려있는 UDP소켓 확인 
        COMMAND     PID USER   FD   TYPE   DEVICE SIZE NODE NAME
        portmap   12413  rpc    3u  IPv4 20459612       UDP *:sunrpc 
        rpc.rquot 15418 root    3u  IPv4 20804960       UDP *:755 
        rpc.rquot 18396 root    3u  IPv4 24909363       UDP *:webster 
        rpc.mount 18515 root    6u  IPv4 24909943       UDP *:883 

    lsof -c deamon    해당 데몬에서 사용하는 프로세서와 파일 확인
        # lsof -c httpd
        COMMAND   PID   USER   FD      TYPE    DEVICE        SIZE      NODE NAME
        httpd    7101 nobody  cwd       DIR       8,3        4096         2 /
        httpd    7101 nobody  rtd       DIR       8,3        4096         2 /
        httpd    7101 nobody  txt       REG       8,3     2186786  10019698 /usr/local/apache_2.0.63/bin/httpd
        httpd    7101 nobody  mem       REG       8,3      880518   9599577 /usr/lib/sse2/libgmp.so.3.3.3
        httpd    7101 nobody  mem       REG       8,3        9336   9604463 /usr/lib/libXau.so.6.0.0
        httpd    7101 nobody  mem       REG       8,3      276818  10019678 /usr/local/apache_2.0.63/lib/libaprutil-0.so.0.9.17
        httpd    7101 nobody  mem       REG       8,3       69316   9609234 /usr/lib/libXpm.so.4.11.0

    lsof -p PID        해당 PID에서 사용하는 프로세서와 파일 확인
        # lsof -p 1
        COMMAND PID USER   FD   TYPE DEVICE    SIZE    NODE NAME
        init      1 root  cwd    DIR    8,3    4096       2 /
        init      1 root  rtd    DIR    8,3    4096       2 /
        init      1 root  txt    REG    8,3   38652 3993807 /sbin/init
        init      1 root  mem    REG    8,3  125736 6484198 /lib/ld-2.5.so
        init      1 root  mem    REG    8,3 1602128 6484199 /lib/libc-2.5.so
        init      1 root  mem    REG    8,3   16428 6484204 /lib/libdl-2.5.so
        init      1 root  mem    REG    8,3   93508 6484212 /lib/libselinux.so.1
        init      1 root  mem    REG    8,3  245376 6484211 /lib/libsepol.so.1
        init      1 root   10u  FIFO   0,16            1189 /dev/initctl

    lsof -n             레퍼런스 카운터 점검 
        # lsof -n 
        COMMAND     PID        USER   FD      TYPE     DEVICE        SIZE       NODE NAME
        init          1        root  cwd       DIR        8,3        4096          2 /
        init          1        root  rtd       DIR        8,3        4096          2 /
        init          1        root  txt       REG        8,3       38652    3993807 /sbin/init
        init          1        root  mem       REG        8,3      125736    6484198 /lib/ld-2.5.so
        init          1        root  mem       REG        8,3     1602128    6484199 /lib/libc-2.5.so
        init          1        root  mem       REG        8,3       16428    6484204 /lib/libdl-2.5.so
        init          1        root  mem       REG        8,3       93508    6484212 /lib/libselinux.so.1
        init          1        root  mem       REG        8,3      245376    6484211 /lib/libsepol.so.1
        init          1        root   10u     FIFO       0,16                   1189 /dev/initctl
        migration     2        root  cwd       DIR        8,3        4096          2 /
        migration     2        root  rtd       DIR        8,3        4096          2 /
        migration     2        root  txt   unknown                                   /proc/2/exe
        ksoftirqd     3        root  cwd       DIR        8,3        4096          2 /
        ksoftirqd     3        root  rtd       DIR        8,3        4096          2 /

4. 마무리 
    운영중인 서버에서 갑자기 대량 메일이 발송된다든지  이상 패킷이 송.수신을 한다면 
    lsof를 이용하여 점검하면 보다 편하고 빠르게 찾을수 잇다 
    물론 모든것을 다 찾아준다고 할수는없다 
    하지만 현제 프로세서와 연관되어있는 소켓이나 파일 디렉토리를 보다 용이하게 찾게해주며 
    특히 구동되오있는 백도어, 해킹툴등을 찾기에는 탁월하다 
    

[원글링크] : https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=1813


이 글을 트위터로 보내기 이 글을 페이스북으로 보내기 이 글을 미투데이로 보내기

 
이재석
본명 : 이재석
e-mail : locli앳superuser.co.kr
소속 : (주)수퍼유저코리아