分类: LINUX
2008-10-09 10:58:44
【专家网独家】问:我该如何发现哪种服务正在某个特定端口上监听呢?我如何发现哪一个程序正在一个特定端口上监听呢?
答:在*NIX系统中,你可以使用下面的任何一个命令来得到在一个特定端口上监听的列表。
Lsof:其功能是列示打开的文件,包括监听端口。
netstat :此命令象征性地展示各种与有关的数据和信息的内容。
Lsof命令示例
你可以输入下面的命令来查看端口:
# lsof -Pnl +M -i4
你可以输入下面的命令来查看协议下的端口列示:
# lsof -Pnl +M -i6
此例输出:
这里我们不妨解释一 下。第一栏是,它给出了程序名称的有关信息。请注意标题的细节。例如,第二行的gweather* 命令从美国 NWS(140.90.128.70)获取天气的报告信息,包括交互天气信息网络和其它的天气服务。在这里,我们解释一下命令各个参数。
1. -P :这个选项约束着网络文件的端口号到端口名称的转换。约束转换可以使lsof运行得更快一些。在端口名称的查找不能奏效时,这是很有用的。
2. -n : 这个选项约束着网络文件的端口号到主机名称的转换。约束转换可以使lsof的运行更快一些。在主机名称的查找不能奏效时,它非常有用。
3. -l :这个选项约束着用户ID号到登录名的转换。在登录名的查找不正确或很慢时,这个选项就很有用。
4. +M :此选项支持本地TCP和端口映射程序的注册报告。
5. -i4 :仅列示IPv4协议下的端口。
6. -i6 : 仅列示IPv6协议下的端口。
Netstaty命令举例
请输入下面的命令:
# netstat -tulpn
或者是
# netstat -npl
请看输出结果::
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:6881 0.0.0.0:* LISTEN 6908/python
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 5562/cupsd
tcp 0 0 127.0.0.1:3128 0.0.0.0:* LISTEN 6278/(squid)
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 5854/exim4
udp 0 0 0.0.0.0:32769 0.0.0.0:* 6278/(squid)
udp 0 0 0.0.0.0:3130 0.0.0.0:* 6278/(squid)
udp 0 0 0.0.0.0:68 0.0.0.0:* 4583/dhclient3
udp 0 0 0.0.0.0:6881 0.0.0.0:* 6908/python
请注意,最后一栏给出了关于程序名称和端口的信息。在这里,我们解释一下各参数的含义:
-t : 指明显示TCP端口
-u : 指明显示UDP端口
-l : 仅显示监听套接字(所谓套接字就是使应用程序能够读写与收发通讯协议()与资料的程序)
-p : 显示标识符和程序名称,每一个套接字/端口都属于一个程序。
-n : 不进行DNS轮询(可以加速操作)
关于/etc/services文件
/etc/services是一个纯ASCII文件,它可以提供互联网服务的友好文本名称,还有其默认分配的端口号和协议类型。每一个网络程序都要进入这个文件得其服务的端口号(和协议)。你可以借助于cat命令或less命令等来查看这个文件:
$ cat /etc/services
$ 110 /etc/services
$ less /etc/services
当我们用netstat -an的时候,我们有时候可以看到类似的输出:
udp 0 0 0.0.0.0:32768 0.0.0.0:*
但是查找/etc/services又没有这个端口的相关说明,怎么办呢?这个是不是黑客程序?
有没有办法查看究竟什么程序监听在这个端口?<
使用lsof -i :32768就可以看到:
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
rpc.statd 603 root 4u IPv4 953 UDP *:32768
rpc.statd 603 root 6u IPv4 956 TCP *:32768 (LISTEN)
原来是rpc的程序。
使用lsof -i :port就能看见所指定端口运行的程序,同时还有当前连接。