如何知道什么程序正在侦听给定端口?

yan*_*sal 455 networking webserver sockets

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

当我运行以下命令时,出现此错误:

> python -m SimpleHTTPServer
# Lots of python error
socket.error: [Errno 98] Address already in use
Run Code Online (Sandbox Code Playgroud)

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

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

我可以做什么(或有哪些工具可用)来查找正在侦听端口的程序8000,以及该程序的配置位置?

rɑː*_*dʒɑ 427

打开你的终端并输入

lsof -i :8000
Run Code Online (Sandbox Code Playgroud)

该命令将使用 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)
Run Code Online (Sandbox Code Playgroud)

和端口 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)
Run Code Online (Sandbox Code Playgroud)

希望有帮助。

  • 这也适用于 OSX 的价值..... (4认同)
  • 添加 `-s TCP:LISTEN` 将结果限制为实际侦听套接字及其进程。 (3认同)
  • 如果您搜索端口 8000,它会返回“PID 1889”吗?笏 (2认同)
  • @Imray 该示例搜索端口 8881。PID 列包含进程 ID,NAME 列包含端口。 (2认同)

Ant*_*uez 422

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

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

sudo netstat -peanut
Run Code Online (Sandbox Code Playgroud)

如果您需要确切知道哪个正在监听端口 8000,您可以使用以下命令:

sudo netstat -peanut | grep ":8000 "
Run Code Online (Sandbox Code Playgroud)

没有可以从 netstat 隐藏的进程。

  • `netstat -peanut` 比 `netstat -taupen` 更容易记住! (136认同)
  • 好一个!- 刚刚编辑了答案以反映您的评论。谢谢你。 (10认同)
  • 'fuser -k 8000/tcp' 释放该端口 (5认同)
  • 如果在“PID/程序名称”列中看到破折号而不是进程名称,则您忘记添加“sudo” (4认同)

小智 177

要详细说明@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
Run Code Online (Sandbox Code Playgroud)

我可以在那里看到鱿鱼是过程,但实际上是我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
Run Code Online (Sandbox Code Playgroud)

您可以在lsof(LiSt Open Files) 中看到它是 java,这没什么帮助。ps使用 PID运行命令,我们可以立即看到它是 CrashPlan。

  • 在一个命令中:`lsof -t -i :8000 | xargs ps -fp` (10认同)
  • 我不得不为`sudo`加上前缀,但在那之后它对我有用。谢谢。 (8认同)
  • 注意:没有 `sudo` 你不会得到错误,你不会得到任何响应。 (4认同)

小智 14

ssiproute2包中尝试:

ss -nlp | grep 8000
Run Code Online (Sandbox Code Playgroud)

  • `ss` 也有自己的过滤功能:`ss -nlp '( sport = :8000 )'`。 (5认同)

chu*_*rag 9

由于社区的低点,我无法在这里发表评论。如果没有sudo上述所有命令,将不会为您提供进程 ID/程序名称。

因此,您需要输入以下内容:

sudo lsof -i :8000
Run Code Online (Sandbox Code Playgroud)

或者

sudo netstat -lntup
Run Code Online (Sandbox Code Playgroud)

您可以通过 或我最喜欢的助手检查这些man命令详细help信息


use*_*.dz 8

使用socklistfromprocinfo包的另一种方法:

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
Run Code Online (Sandbox Code Playgroud)