我用来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/ .*:/ /';
前言
这里要特别针对未来的读者和网络爬虫解决两件事。
/etc/services
是 IANA RFC 1340 TCP 和 UDP 端口分配号的“数据库”(例如平面文件缓存)。人们使用它来将整数端口号转换为逻辑字符串名称,反之亦然。在使用 . 访问的每个 shell 上都有关于此的手册/文档man 5 services
。是的,如果使用 Java 等“高级”语言进行处理,那么
Runtime.getRuntime().exec()
就没有充分利用操作系统。最好从proc
和文件系统读取数据sys
。在 shell 和coreutils
.
那不碍事。要回答这个问题,首先看一下sed
、xargs
、
cut
和expand
。sed
是一个流编辑器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