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

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

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

我在我的S机器上打字。

$ netstat -an | grep 已建立
tcp 0 0 192.168.1.220:3306 号码:57010 已确立的

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

答案1

一种方法是说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。

答案2

您可以netstat -anp | grep 57010在服务器上使用C。但这仅在没有任何防火墙映射端口的情况下才有效57010到另一个。

答案3

只是为了完整性:

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

ss -tp sport = :57010 dst 192.168.1.220

相关内容