如何知道在给定端口上正在侦听的程序?

我怀疑某个程序正在我的机器上侦听端口8000

当我运行以下命令时,我收到此错误:

 > python -m SimpleHTTPServer # Lots of python error socket.error: [Errno 98] Address already in use 

如果我使用另一个端口(默认为8000 ),则Web服务器运行正常。

如果我从命令行运行wget localhost:8000 ,它将返回404 Not Found

我可以做什么(或者有什么工具可用)来查找正在端口8000上监听的程序,以及从那里配置该程序的位置?

打开终端并输入

 lsof -i :8000 

该命令将列出该端口使用PID的应用程序。 (如果没有结果通过sudo运行,因为您可能无权访问某些进程。)

例如,使用端口8000( python3 -m http.server ):

 $ lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python3 3269 user 3u IPv4 1783216 0t0 TCP *:8000 (LISTEN) 

和端口22(SSH):

 $ sudo lsof -i :22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 998 root 3u IPv4 1442116 0t0 TCP *:ssh (LISTEN) sshd 998 root 4u IPv6 1442118 0t0 TCP *:ssh (LISTEN) 

希望有所帮助。

您可以使用netstat查看哪个进程正在侦听哪个端口。

您可以使用此命令获得完整的详细信息:

 sudo netstat -peanut 

如果您需要确切知道哪一个正在端口8000上侦听,您可以使用:

 sudo netstat -peanut | grep ":8000 " 

没有可以隐藏netstat的进程。

要通过@ 33833阐述答案,您可以获得一些非常详细的信息,例如:

 $ lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME squid3 1289 proxy 15u IPv6 14810490 0t0 TCP *:8000 (LISTEN) $ ps -fp 1289 UID PID PPID C STIME TTY TIME CMD proxy 1289 1 0 09:48 ? 00:00:00 /usr/sbin/squid3 -N -f /etc/squid-deb-proxy/squid-deb-proxy.conf 

我可以看到鱿鱼是一个过程,但它实际上是我的squid-deb-proxy占用了端口。

Java应用程序的另一个好例子:

 $ lsof -i :4242 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 3075 root 86u IPv4 12019 0t0 TCP *:4242 (LISTEN) $ ps -fp 3075 UID PID PPID C STIME TTY TIME CMD root 3075 1 15 May24 ? 3-16:07:25 /usr/local/crashplan/jre/bin/java -Dfile.encoding=UTF-8 -Dapp=CrashPlanService -DappBaseName=CrashPl 

你可以在lsof (LiSt Open Files)中看到它是java,这不是很有用。 使用PID运行ps命令,我们可以立即看到它是CrashPlan。

尝试iproute2包中的ss

 ss -nlp | grep 8000 

使用procinfo包中的socklist另一种方法:

man socklist

描述
socklist是一个Perl脚本,它为您提供所有打开的套接字列表,枚举类型,端口,inode,uid,pid,fd及其所属的程序。

sudo socklist

 type port inode uid pid fd name tcp 53 28749 0 1721 5 dnsmasq tcp 631 29190 0 2433 11 cupsd tcp 42376 82230 1000 1345 84 firefox tcp 49048 71686 1000 1345 67 firefox tcp 41248 81672 1000 1345 119 firefox tcp 54676 84558 1000 1345 73 firefox udp 56107 66258 0 3268 20 dhclient udp 40804 17857 107 679 14 avahi-daemon udp 53 28748 0 1721 4 dnsmasq udp 68 67427 0 3268 6 dhclient udp 631 19692 0 765 8 cups-browsed udp 5353 17855 107 679 12 avahi-daemon 

您可以使用nmap。

了解PC中哪些端口是开放的非常重要,这不仅对Linux有用,而且对其他操作系统也有用,Linux有很多工具可以检查哪些端口是打开的,最常见的是nmap是一个命令行工具,如果您喜欢这种方式,也存在一个Graphical frontEnd。 1

要安装它,只需按键盘上的Ctrl + Alt + T即可打开终端。 打开时,运行以下命令:

 sudo apt-get install nmap 

有关nmap和其他实用程序的更多信息,请转到此处

1来源: garron.me