我如何知道正在打开 tcp 端口的进程名称?

Ben*_*min 6 networking centos lsof tcp netstat

我有两台Linux服务器。假设它们是CS
C是客户S

在我的S机器上,我打字。

$ netstat -an | grep 已建立
tcp 0 0 192.168.1.220:3306 C:57010 已 建立

然后我可以知道C现在正在连接。
C机器中,我也想知道打开57010端口并连接服务器的进程名称。我怎样才能做到这一点?当然,我有 root 权限。SC

War*_*ung 10

一种方式是说lsof -i:57010 -sTCP:ESTABLISHED。这会遍历内核的打开文件句柄表,查找使用该端口已建立 TCP 连接的进程。(网络套接字是 *ix 类型系统上的文件句柄。)您可以-sTCP:LISTEN在服务器端使用来仅过滤掉侦听器套接字。

由于工作方式lsof,它只能看到您的用户拥有的进程,除非您以 root 身份运行它。它也相当低效,因为典型的 *ix 系统在任何给定时间都会打开大量文件句柄。netstat另一个答案中给出的方法更快,通常访问要求较低。

lsof然而,该方法有一个很大的优势:并非所有 *ix 类型的操作系统都具有netstat用于在输出中包含进程名称的标志,lsof而已移植到您可能使用的每个 *ix 类型的操作系统中netstat例如,OS X就是这种方式。它有一个-p选项,但它的作用与netstat -pLinux不同。

对于像您问题中的那个不常见的端口号,您通常可以在不添加lsof's-s标志的情况下逃脱,因为给定的机器不太可能同时连接到端口并侦听它的程序。添加端口号(如 HTTP 的 80)会很有帮助,在这种情况下,您可能会有多个程序同时使用该端口。

幸运的是,该-s标志在许多情况下是可选的,因为该用法仅适用于lsof4.81 及更高版本。在旧版本中,-s完全意味着别的东西!这是 2008 年的复古变化,但它仍然可以出人意料地咬人。lsof例如,RHEL 5 附带4.78。


sca*_*cai 8

您可以netstat -anp | grep 57010在服务器C上使用。但这只有在中间没有任何防火墙将端口57010映射到另一个端口时才有效。

  • @Benjamin 如果您有进程 ID nnn 那么`ps waux | grep nnn` 会给你很多信息。有关更多信息,请使用 `cat /proc/nnn/cmdline` 尽管空格已被删除(实际上我认为它们被 \0 替换),因此不容易阅读。 (3认同)

Sté*_*las 5

只是为了完整性:

使用ss新的 Linux 网络实用工具集 ( iproute2):

ss -tp sport = :57010 dst 192.168.1.220
Run Code Online (Sandbox Code Playgroud)