如何使用 netstat 只显示协议、端口和状态?

如何使用 netstat 只显示协议、端口和状态?

我用来netstat -lt | grep LISTEN列出所有正在侦听的 tcp 端口。我应该通过我的 java 应用程序使用这些数据,因此我想在 shell 中格式化输出以减少 Java 中的处理开销。我想要的是:

Protocol port status
tcp      4567 LISTEN

输出类型。有没有办法使用 netstat 来实现这一点,或者 unix 是否提供了任何其他网络应用程序来实现这一点?

我还尝试通过以下方式读取服务文件:

less /etc/services | grep tcp | cut -d '#' -f 1

但这样它就会列出所有 tcp 端口,无论它们是否打开。任何建议都会很棒!

答案1

或者读取文件 /proc/net/tcp 而不是处理运行 shell 程序的安全问题。

答案2

太长了;

printf "Protocol port status";
netstat -nlt \
  |sed -e '/LISTEN/p;d' -e '1,2d' \
  |xargs -n6 \
  |cut -d\  -f1,4,6 \
  |sed 's/ .*:/ /';

前言

这里要特别针对未来的读者和网络爬虫解决两件事。

  1. /etc/services是 IANA RFC 1340 TCP 和 UDP 端口分配号的“数据库”(例如平面文件缓存)。人们使用它来将整数端口号转换为逻辑字符串名称,反之亦然。在使用 . 访问的每个 shell 上都有关于此的手册/文档man 5 services

  2. 是的,如果使用 Java 等“高级”语言进行处理,那么Runtime.getRuntime().exec()就没有充分利用操作系统。最好从proc和文件系统读取数据sys。在 shell 和coreutils.

那不碍事。要回答这个问题,首先看一下sedxargscutexpandsed是一个流编辑器regex,与其他语言中的xargs, 等效map() with lambda,但也进行行清理,并将空白字符展开为空格。netstat还有一个只听输出标志。这些组合在一个管道中可以满足您的需求。

分解答案

命令 解释
printf 与C/C++的printf()函数相同[输出标题]
netstat -ntl 解析/proc/net/tcp绑定的侦听器,无需进行 DNS 查找
sed -e '/LISTEN/p;d' -e '1,2d' 按顺序执行两遍 sed:找到所有 LISTEN 记录,删除所有其他记录,删除第 1 行和第 2 行(来自 netstat 的标头;以防止修改输出)
xargs -n6 将输出格式化为六列空格分隔符记录
cut -d\ -f1,4,6 使用空格分隔符然后选择第 1、4 和 6 列
sed 's/ .*:/ /' 后处理第二列以剥离 IP 地址

答案3

这不包括列标题,但它以制表符分隔的格式为您提供所需的数据

netstat -lnt | tail -n+3 | awk '{print $1 "\t" $4 "\t" $6}'

在我的计算机上运行我得到以下输出

tcp     127.0.0.1:3306  LISTEN
tcp     0.0.0.0:22      LISTEN
tcp6    :::22   LISTEN

相关内容