【发布时间】:2012-07-12 19:44:58
【问题描述】:
所以,我使用netstat -lt 来获取开放端口。但是,我对某些值(如 SSH 或 22)不感兴趣,因此我希望能够排除它们。我还想将它们作为 bash 中的数组。到目前为止,我有 netstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1,但它们不是数组,我也不排除任何东西。
【问题讨论】:
所以,我使用netstat -lt 来获取开放端口。但是,我对某些值(如 SSH 或 22)不感兴趣,因此我希望能够排除它们。我还想将它们作为 bash 中的数组。到目前为止,我有 netstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1,但它们不是数组,我也不排除任何东西。
【问题讨论】:
尝试使用ss 命令,它会替换netstat。
ss -atu | awk '{print $5}' | awk -F: '{print $NF}'
ss 命令为您提供本地计算机上的所有 TCP 和 UDP 端口(唯一具有端口的套接字)。第一个 awk 提取包含本地地址和端口号的列。第二个awk 只取冒号后面的最后一个字段;如果您的机器上有 IPv6 套接字,这是必要的,其 IP 地址也将包含冒号。
完成此操作后,您可以grep 取出您不想要的端口。此外,有关过滤器的信息,请参阅ss 手册页引用的文档,这可以让您从ss 的输出中过滤掉不需要的套接字。
【讨论】:
awk 命令简化为一个简单的命令,但我能想到的最短命令是:ss -atu | awk '{ old=FS; FS=":"; $0=$5; print $NF; FS=old }'。
在您的声明周围添加($()):
port=($(netstat -ltn | sed -rne '/^tcp/{/:(22|25)\>/d;s/.*:([0-9]+)\>.*/\1/p}'))
过滤端口 22 和 25。
【讨论】:
echo $port 作为下一行,它打印出来的只是“活动”。此外,它无法排除某些值。
echo ${port[@]} 是一个数组,按要求
${array[*]} 与 ${array[@]} 比较,如 $* 与 $@ 比较
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'
【讨论】: