linux - 我如何确定哪个进程正在打开某个 tcp 端口?

标签 linux ssh netstat fuser

我通常使用fuser 命令来检查pid 打开特定的tcp 端口,如下所示

fuser 22/tcp //To get pid opening the 22 tcp port

我有一个运行嵌入式 Linux 的引用板。 它已经为 ssh 连接打开了 22 个 tcp 端口。 但是 fuser 不显示任何关于 22 端口的输出。 所以我尝试了另一个 ssh 守护进程来打开 322 端口,然后尝试使用 fuser 检查 pid,它工作正常。

root@imx6qsabreauto:~# netstat -nlt | grep 22
tcp        0      0 0.0.0.0:4224            0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:322             0.0.0.0:*               LISTEN
tcp        0      0 :::322                  :::*                    LISTEN
tcp        0      0 :::22                   :::*                    LISTEN

root@imx6qsabreauto:~# fuser 322/tcp
351

root@imx6qsabreauto:~# ps -ef | grep 351
root       351     1  0 01:46 ?        00:00:00 /usr/sbin/dropbear -r /etc/dropbear/dropbear_rsa_host_key -p 322 -B

root       379   315  0 02:11 ttymxc3  00:00:00 grep 351


root@imx6qsabreauto:~# fuser 22/tcp
==> This output nothing !!

如何确定哪个进程正在打开 tcp 22 端口。 (在董事会中,lsof 命令不可用,并且..netstat 没有-p 选项。)

最佳答案

我已经安装了 /proc 并且安装了 bashreadlink, 你可以编写一个解析/proc/net/tcp的bash小脚本,然后扫描/proc/*/fd/找到对应的socket。

我对嵌入式linux不太熟悉,但是如果你找不到readlink,它可能包含在busybox中。

/proc/net/tcp 类似于

sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode
0: 00000000:4E7A 00000000:0000 0A 00000000:00000000 00:00000000 00000000     0        0 13128 1 ffff8800cf960740 99 0 0 10 0

local_addressHOST:PORT 的十六进制字符串,因此当您要搜索tcp 22 端口时,脚本会搜索:0016

一旦它在 local_address 中找到包含 :0016 的行, inode是对应的套接字号。

然后它使用readlink 命令搜索具有套接字号的/proc/*/fd/*

#!/bin/bash
PORT="$1"
HEX_PORT=$(printf %04X $PORT)
INODE=""
if ! [ "$PORT" ];then
  echo "usage $0 [PORT]"
  exit
fi
while read num host_port _ _ _ _ _ _ _ inode _; do
  if [[ $host_port =~ :"$HEX_PORT"$ ]];then
    INODE=$inode
  fi
done < /proc/net/tcp
if ! [ "$INODE" ];then
  echo "no process using $PORT"
  exit
fi
for fn in /proc/[1-9]*/fd/*; do
  if [ "$(readlink $fn)" = "socket:[$INODE]" ];then
    tmp=${fn%/fd*}
    echo ${tmp#/proc/}
  fi
done

关于linux - 我如何确定哪个进程正在打开某个 tcp 端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30746009/

相关文章:

linux - 使用分隔符拆分日志文件以保持数据完整性

c - ELF 二进制文件的运行时修补

linux - 无法使用 key 文件

apache - 如何保护公共(public)和私有(private) Rails 应用程序的管理区域

ssh - 如何向没有密码生成的 OpenSSH 私钥添加密码?

c -/proc/net/tcp Solaris 11 下的替代方案

tcp - 什么时候打开TCP连接?

linux - 在 yocto 上安装 python-twisted

linux - 控制台中缺少 Debian 启动消息

linux - 详细了解linux上netstat -an输出