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 (…) |
[출처] [펌]lsof 명령어와 사용법|작성자 참좋은날