我有两台Linux服务器。假设它们是C
和S
。
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 -p
Linux 上不同。
lsof
对于像您问题中的端口号这样的不常见端口号,您通常可以在不添加's标志的情况下逃脱-s
,因为给定的计算机不太可能有程序连接到该端口并侦听该端口。添加端口号(例如 HTTP 的 80)会很有帮助,因为您可能会同时有多个程序使用该端口。
幸运的是,该-s
标志在许多情况下是可选的,因为该用法仅适用于lsof
4.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