所以,我netstat -lt
用来获取开放端口。但是,我对某些值(如 SSH 或 22)不感兴趣,因此我希望能够排除它们。我还想将它们作为 bash 中的数组。到目前为止,我有netstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1
,但它们不是一个数组,我也不排除任何东西。
问问题
1315 次
3 回答
3
尝试使用ss
替换netstat
.
ss -atu | awk '{print $5}' | awk -F: '{print $NF}'
该ss
命令为您提供本地计算机上的所有 TCP 和 UDP 端口(唯一具有端口的套接字)。第一个 awk 提取包含本地地址和端口号的列。第二个awk
只取冒号后面的最后一个字段;如果您的机器上有 IPv6 套接字,这是必要的,其 IP 地址也将包含冒号。
完成此操作后,您可以grep
删除不需要的端口。ss
此外,有关过滤器的信息,请参阅手册页引用的文档,这可以让您从ss
.
于 2012-07-12T20:13:43.430 回答
2
($())
在您的声明周围添加:
port=($(netstat -ltn | sed -rne '/^tcp/{/:(22|25)\>/d;s/.*:([0-9]+)\>.*/\1/p}'))
过滤端口 22 和 25。
于 2012-07-12T19:56:27.197 回答
0
a=( `netstat -ltn --inet | sed -r -e '1,2d''s/tcp[^:]+://g' | cut -d' ' -f1 | sed -e '1,2d' | grep -v "22\|33\|25"` )
如果您的 netstat 版本打印了这样的标题,则第二个 sed 命令会删除标题。我将“Active”和“Proto”作为前两行。使用 grep 过滤不需要的端口。将 -n 添加到 netstat 以查看端口号而不是名称。--inet 是强制使用 ipv4,否则您可能会看到 IPv6,这可能会混淆您的脚本。
顺便说一句,不确定你需要一个数组。通常只有当您要处理您拥有的值的子集时才需要数组。如果您处理所有值,则会有更简单的构造,但不确定您要做什么。
问候。
更新:您可以使用带有两个操作的单个 sed 命令,而不是两个单独的调用:
sed -r -e '1,2d' -e 's/tcp[^:]+://g'
于 2012-07-12T20:06:28.423 回答