본문 바로가기

컴퓨터관련/오늘의 공부

[펌글] lsof 명령어와 사용법

출처 http://blog.naver.com/PostView.nhn?blogId=teastful&logNo=140069338515&parentCategoryNo=&categoryNo=&viewDate=&isShowPopularPosts=false&from=postView

lsof

 lsof 명령어는 시스템에서 사용하는 있는 모든 자원들의 대한 목록을 출력할  있는 명령어로 시스템을 관리할  매우 유용하게 쓰인다.

 예를 들어 특정한 사용자가 사용하고 있는 자원 목록을 확인하고자   “ps –aux | grep 사용자이름 같은 형태로 출력을하지만 이것은 프로세스에 대한 정보만 출력할  사용 파일장치  세부적인 정보를 파악할  없게 된다.

 이때 lsof 명령어를 이용하여 모든 자원들의 목록을 출력할  있다.

 lsof 명령어는 시스템을 관리하기 위한 명령어이므로 일반 사용자의 접근을 허용하지 않도록 퍼미션을 700이나 100으로변경한다만일 일반 사용자게 허용이 되어 있다면 현재 서비스 중인 모든 자원들의 목록을 파악할  있기 때문에 보안상 매우위험해질  있기 때문이다.

 

lsof 옵션

■  –a

파일에 대한 검사를 하고자   다양한 옵션을 사용하게 되는데 이때 옵션에 대한 기본 OR 연산으로 각각의 파일에 대한 정보를 출력하게 된다이때  옵션에 대한 AND 연산을 사용할  있게 한다기본적으로 OR 연산을 하기 때문에 여러 개의 옵션을입력한다면 많은 정보들이 출력되므로 적절한 AND 연산을 이용하여 원하는 출력결과만 얻어낼  있다.

 

■  –b, -O

lsof 명령어를 실행할  블록될  있는 커널의 함수들의 사용을 피해 명령어가 블록되는 것을 예방하고자   사용될  있다.보통 프롬프트 상에서는 사용되지 않으나 스크립트를 이용할  스크립트의 실행 중지를 피할  있기 때문에 사용할  있다.

 

■  –c

특정한 명령어나 프로그램이 참조하고 있는 파일들의 목록을 출력하고자   유용하게 쓰인다예를 들어 lsof 명령어를 사용할  참조하는 모든 파일들을 출력하며 이것은 lsof 명령어를 사용할  필요한 파일들에 해당될 것이다.

 

■  –d

지정한 파일 기술자를 사용하는 파일들을 출력하며 범위를 지정하여 출력하고자할 때는 “N-M” 개별적인 다수 개를 지정하고자할 때는 “N,M….” 같이 설정   있다.

 

■  +d

지정한 디렉토리나 또는 디렉토리 내에서 사용되고 있는 파일들에 대한 정보를 출력한다허가되지 않은 디렉토리 내에서 작업하는 프로세스나 사용자  명령어를 검색하고자   유용하게 쓰인다.

 

■  –F

출력될 결과에서 특정한 필드를 출력할  있는 옵션으로 많은 정보들 중에 원하는 필드만을 출력하여 빠른 정보를 출력한다다음은 –F 옵션과 함께 사용할  있는  필드의 단축키들로 기본값은 –Fp 설정이 되어 있기 때문에 별도의 키를 사용하지 않는다면 PID 정보만을 출력한다.

단축키

  

단축키

  

c

명령어 이름

p

PID

d

캐릭터 장치의 코드

g

GPID

D

장치의 Major, Minor 번호

P

Protocol name

f

파일 기술자

r

raw device number

i

inode number

R

PPID

k

link count

s

file size

l

lock

S

stream module and device names

L

로그인 이름

t

file type

n

comment, name, IP 주소

T

TCP/TPI 정보

u

UID

 

 

 

■  –g, -i

-g 옵션은 설정한 GPID(Group PID) 가진 프로세스를 출력한다. –i 옵션은 설정한 네트워크(Internet) 소켓에 대한 정보를출력하며 프로토콜서비스 또는 호스트  IP 대해 설정을   있다. –I 옵션에서 제공하는 3개의  필드로 구성되어 있다.

  

  

4

6

IPV4 , IPV6 지정하고자   사용하며 46 동시에 사용한다면 IPV4, 6 모두를 포함하며 단독으로 사용한다면 지정한 버전에 대한 정보를 검색한다.

@hostname

@IP_address

접속하는 호스트나 IP 대한 정보를 검색하며 IP 버전과 구분하기 위한 IFS 값으로“@” 사용한다특수문자를 이용한 검사를 하기 때문에 정확하게 입력한다.

:service

:port

/etc/service 등록되어 있는 서비스이름을 지정하고나 또는 포트 번호를 직접 입력하여 출력할  있다다른 필드와 구분하기 위한 IFS “:” 이용한다.

 

■  –N, -G

NFS 서버가 구축된 환경에서 NFS 연결되어 있는 파일들에 대한 정보를 출력한다. –G 옵션은 GPID 대항되는 정보를 출력하며 여러 개를 출력한다면 “.”으로 구분할  있다.

 

■  –l

로그인 사용자이름 대신 UID 출력한다이것은 일반적으로 사용되지 않지만 UID 이용한 스크립트를 만들  유용하게 쓰일 있다예를 들어 현재 로그인한 사용자  특정한 UID 사이값을 사용자들의 모든 정보를 출력하고자   사용된다.

 

■  –n, -P

호스트이름 대신에 IP address 출력한다. –P 옵션은 /etc/services 등록되어 있는 이름 대신 포트 번호로 출력한다.

 

■  –r

지속적인 출력을   지정한 초만큼의 주기로 실행하여 출력한다특정한 파일이나 사용자의 프로세스를 파악하고자   사용될  있으며 기본값은 15초로 설정이 되어 있다.

 

■  –s, -t

파일의 크기를 항상 출력하며 기본값으로 설정이 되어 있다. –t 옵션은 PID 번호만을 출력한다.

 

■  –S

블록될  있는 커널의 함수 lstat, readlink, stat 사용할  시간을 설정하는 옵션으로 만약 스크립트 내에서 –b 사용하지 않았을  블록이  상황이 발생하였을  지정한 시간 후에는 블록이 해제된다. –b 옵션을 사용한다면 설정하지 않아도 되며만약 –b 옵션을 설정하지 않았다면 “-S 10” 같이 시간을 설정한다.

 

■  –u

사용자 ID  UID 값으로 지정할  있으며 다수의 사용자를 지정하기 위해서 “,” 사용할  있으며 특정한 사용자를 제외한정보를 출력한다면 “^사용자 설정할  있따.

 

■   –U, -X

UNIX domain 이용한 소켓에 대한 정보를 출력하며 syslogd 데몬이 사용되고 있다. –X 옵션은 AIX 시스템을 위한 특별한옵션으로 리눅스에서는 사용되지 않는다.

 

특정한 파일  디렉토리를 사용하고 있는 프로세스 출력

“lsof 파일이름 입력하였을  입력한 파일을 사용한 명령어  장치사용자를 파악   있다이것은 허가되지 않은 명령어나 파일 또는 장치에 대해 접속하고 있는 사용자를 추출하고자   사용할  있다예를 들어 lsof 명령어를 사용하지 있는프로세스  사용자를 검색할  있다.

[root@soo0e ~]# lsof '/usr/sbin/lsof'

COMMAND  PID USER  FD   TYPE DEVICE   SIZE   NODE NAME

lsof    4650 root txt    REG    3,7 121364 671379 /usr/sbin/lsof

lsof    4651 root txt    REG    3,7 121364 671379 /usr/sbin/lsof

 

지정한 디렉토리 내에 존재하는 파일을 사용하고 있는 목록을 출력한다면 +d 옵션을 이용하여 출력할  있다그러나 하위 디렉토리가 존재한다면 지정한 하위 디렉토리 내에 있는 파일을 검사하지 못하므로 이때는 +D 이용한다.

[root@soo0e ~]# lsof +d /var/log/

COMMAND   PID USER   FD   TYPE DEVICE  SIZE   NODE NAME

syslogd 31397 root    2w   REG    3,6    76 480051 /var/log/console

syslogd 31397 root    3w   REG    3,6 51413 480045 /var/log/messages

syslogd 31397 root    4w   REG    3,6 14502 480046 /var/log/secure

(…)

 

간혹 특정한 파티션에 대해 umount 명령어를 실행하였을  다른 사용자가 사용하고 있다면 umont 되지 않는다이때 해당파티션을 마운트하고 있는 사용자나 PID 검사하여 KILL  umount 시키면 된다.

[root@soo0e ~]# lsof +d /var

COMMAND  PID USER   FD   TYPE DEVICE SIZE    NODE NAME

crond   1793 root  cwd    DIR    3,6 4096 1056001 /var/spool

 

특정한 사용자가 사용하고 있는 자원 목록 출력

지정한 사용자의 자원을 출력한다면 –u 옵션을 이용하여 다수의 사용자는 “,”으로 지정할  있다또한 지정한 사용자를 제외한모든 사용자의 자원 목록을 출력할  ^UID, ^ID 같이 사용해도 된다.

[root@soo0e ~]# lsof -u soo0e

COMMAND  PID  USER   FD   TYPE     DEVICE    SIZE     NODE NAME

sshd    4547 soo0e  cwd    DIR        3,2    4096        2 /

sshd    4547 soo0e  rtd    DIR        3,2    4096        2 /

sshd    4547 soo0e  txt    REG        3,7  379180   671365 /usr/sbin/sshd

sshd    4547 soo0e  mem    REG        3,2 1238928   319754 /lib/libcrypto.so.0.9.8b

(…)

 

losf –u soo0e”으로 출력한 결과 많은 파일들을 오픈하고 있음을   있는데 이때 단독으로   많은 출력 결과를 분석해야하는 문제점이 있개 때문에 명령어나 또는 PID만을 출력   있다다음은 soo0e 사용자의 PID만을 출력하여 사용하는 있는프로세스가  개인 것을 확인할  있다만일 강제로 제거한다면 kill 또는 pkill 이용하여 강제 종료할  있다.

[root@soo0e ~]# lsof -u soo0e -a -t

4547

4548

 

또한 다음과 같이 사용하고 있느 모든 명령어 대한 PID 출력할  있다.

[root@soo0e ~]# lsof -u soo0e -a -F pc0

p4547csshd

p4548cbash

 

Internet 연결에 대한 정보 출력

[root@soo0e ~]# lsof -i 4 -P

COMMAND  PID   USER   FD   TYPE  DEVICE SIZE NODE NAME

sshd    1739   root    3u  IPv4    4859       TCP *:22 (LISTEN)

named   1794  named   20u  IPv4 1066969       UDP ns.soo0e.org:53

named   1794  named   21u  IPv4 1066970       TCP ns.soo0e.org:53 (LISTEN)

named   1794  named   22u  IPv4 1066971       UDP *:53

(…)

 

TCP/IP 사용하고 있는 모든 프로토콜에 대한 정보를 출력할  있기 때문에 특정한 포트를 바인드하고 있는 프로세스나 사용자를 검색할  있다이렇게 찾아낸 프로세스를 kill 또는 pkill 이용하여 제거한다현재 22 포트를 사용하고 있는 정보를출력한다그러나 접속된 사용자만 많다면 많은 출력결과가 나오기 때문에 사용자만 별도로 출력할  있다.

옵션을 연속하여   AND 또는 OR 연산을 할지 정확하게 설정해야 원하는 결과를 출력하는데 다음은 현재222.122.156.45 호스트에서 IPV4 버전을 사용하며 22 포트에 접속되어 있는 사용자를 출력하는데 필요한 부분  사용하고 있는 사용자 ID만을 출력하고자 한다그러나 데몬은 root 권한으로 실행되기 때문에 root 실행되는 것을 제외한 실제사용자 ID 출력한다.

[root@soo0e ~]# lsof -i 4@222.122.156.45:22 -a -F0L -a -u ^root

p4547Lsoo0e

** 참고 F0L  0  숫자 이다.

 

특정한 IP 접속한 사용자의 정보를 출력하고자   “lsof –i” 또는 “netstat –antu” 이용하여 해당 IP 찾은후 “losf –i @IP” 지정한 IP 접속하여 작업하고 있는 목록을 찾을  있다.

 

특정한 프로세스에 대한 정보 출력

서버를 운영하면서 특정한 명령어가 참조하고 있는 모든 정보를 출력해야  때가 있다이때 –c 옵션을 이용하여 지정한 명령어에 대한 모든 정보를 출력하게 된다또한 PID 알고 있다면 –p 옵션을 이용할  있다그러나 많은 정보를 출력하기 때문에 특정한 패턴을 검사하여 출력한다예를 들어 bash 사용하는 사용자를 검색하된 root 제외한다.

[root@soo0e ~]# lsof -c bash -a -u ^root

COMMAND  PID  USER   FD   TYPE DEVICE    SIZE     NODE NAME

bash    4548 soo0e  cwd    DIR    3,9    4096 13008897 /home/soo0e

bash    4548 soo0e  rtd    DIR    3,2    4096        2 /

bash    4548 soo0e  txt    REG    3,2  722684   255800 /bin/bash

(…)

'컴퓨터관련 > 오늘의 공부' 카테고리의 다른 글

리눅스 사용 메모  (0) 2013.03.07