4

所以,我netstat -lt用来获取开放端口。但是,我对某些值(如 SSH 或 22)不感兴趣,因此我希望能够排除它们。我还想将它们作为 bash 中的数组。到目前为止,我有netstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1,但它们不是一个数组,我也不排除任何东西。

4

3 回答 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 回答