根据已知的一个端口号,以telnet默认端口号23为例,去查找系统中监听该端口号的进程,主要可以通过下面3种方式。
netstat
使用
netstat
可以查看系统网络状态,
-p
参数可以显示对应的进程信息
pid/process
$ netstat -anp |grep ":23" tcp 0 0 192.168.1.1:23 0.0.0.0:* LISTEN 3698/utelnetd tcp 0 0 192.168.1.1:23 192.168.1.10:10381 ESTABLISHED 3698/utelnetd
从上面的信息中可以看到两条信息:
监听23端口的进程是pid为 3698
的utelnetd
目前存在一个已连接的client,client IP为 192.168.1.10
,tcp连接端口为10381
lsof
$ lsof |grep utelnetd 3698 /usr/sbin/utelnetd /dev/console 3698 /usr/sbin/utelnetd /dev/console 3698 /usr/sbin/utelnetd /dev/null 3698 /usr/sbin/utelnetd socket:[12882] 3698 /usr/sbin/utelnetd socket:[349364]
可以看出,
utelnetd
打开了5个文件,对应5个fd(file descriptor)。前面3个分别对应标准输入stdin,标准输出stdout和标准错误输出stderr;接着的两个socket对应的就是netstat
显示的1个socket server和1个socket client。注:socket:[12882]信息中12882对应的是
inode
信息,后面proc
信息中可以印证。
proc
除了上面两个指令外,
proc
文件系统中的信息也是非常常用的,根据已经的进程pid3698
,我们可以查看进程已打开的所有文件以及socket信息。查看文件描述符
$ ls -l /proc/3698/fd/ lr-x------ 1 root root 64 Dec 20 07:57 0 -> /dev/console l-wx------ 1 root root 64 Dec 20 07:57 1 -> /dev/console l-wx------ 1 root root 64 Dec 20 07:57 2 -> /dev/null lrwx------ 1 root root 64 Dec 20 07:57 3 -> socket:[12882] lrwx------ 1 root root 64 Dec 20 07:57 4 -> socket:[349364]
前3个0,1,2对应的就是stdin,stdout和stderr;3,4对应的就是两条socket连接。
查看socket信息
$ cat /proc/3698/net/tcp sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000:0D05 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 13663 1 de008000 100 0 0 10 0 1: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 28897 1 de008500 100 0 0 10 0 2: 00000000:0035 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 28962 1 de008f00 100 0 0 10 0 3: 0101A8C0:0017 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 12882 1 dcd20000 100 0 0 10 0 4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 28898 1 de008a00 100 0 0 10 0 5: 0101A8C0:0017 0A01A8C0:288D 01 00000000:00000000 00:00000000 00000000 0 0 349364 1 de00b700 24 8 25 10 -1
这个文件显示的是当前进程相关的tcp连接信息,目前我们仅考虑端口号为23的连接,由于当前数据均为16进制,所以grep时使用23的16进制数17
$ grep "17\|sl" /proc/3698/net/tcp sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 3: 0101A8C0:0017 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 12882 1 dcd20000 100 0 0 10 0 5: 0101A8C0:0017 0A01A8C0:288D 01 00000000:00000000 00:00000000 00000000 0 0 349364 1 de00b700 24 8 25 10 -1
可以看到两个信息,先看其一,local_address为
0101A8C0:0017
,解析如下:01 01 A8 C0: 0017