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