将开放端口作为数组获取

时间:2012-07-12 19:44:58

标签: bash sed awk grep netstat

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

3 个答案:

答案 0 :(得分:2)

在您的对帐单周围添加($())

port=($(netstat -ltn | sed -rne '/^tcp/{/:(22|25)\>/d;s/.*:([0-9]+)\>.*/\1/p}'))

过滤端口22和25.

答案 1 :(得分:2)

尝试使用ss命令替换netstat

ss -atu | awk '{print $5}' | awk -F: '{print $NF}'

ss命令为您提供本地计算机上的所有TCP和UDP端口(唯一具有端口的套接字)。第一个awk提取包含本地地址和端口号的列。第二个awk仅占用冒号后面的最后一个字段;如果您的计算机上有IPv6套接字,则必须这样做,其IP地址也将包含冒号。

完成此操作后,您可以grep输出您不想要的端口。另外,请参阅ss手册页引用的文档以获取有关过滤器的信息,这些信息可能会让您从ss的输出中过滤掉不需要的套接字。

答案 2 :(得分: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可能会混淆你的脚本。

btw不确定你需要一个数组。通常只有当你要处理你拥有的值的子集时才需要数组。如果你处理所有的值,那么有更简单的结构,但不确定你将要做什么。

问候。

更新:您可以使用单个sed命令来执行两个操作,而不是两个单独的调用:

sed -r -e '1,2d' -e 's/tcp[^:]+://g'