我认为您想要做的是获取侦听端口的列表,然后将其从任何其他TCP连接中删除,然后就是所有传出连接。ss(套接字状态)命令输出“本地地址:端口”和“对等地址:端口”列,我们需要从“本地地址:端口”列而不是“对等地址:端口”列中删除侦听端口,否则,您可能会错过一些传出连接。因此,要实现这一点,我需要\s{2}+
在grep中的“:$ port”字符串后面使用“ Local Address:Port”列后面的空格进行匹配;该列后面有两个或多个空格,其中“对等地址:端口”有一个空格,然后有一个换行符(grrr ...应该只有一个换行符,IMO,\s+
\s{2}+
。)通常,我可能会尝试使用ss的过滤功能,例如使用ss -tn state established '(sport != :<port1> and sport !=:<port2>)' src <ip address>
。但是,看起来该字符串的长度是有限制的,它在我有很多侦听端口的系统上被炸毁了。所以我试图用grep做同样的事情。我相信以下方法会起作用:
FILTER=$(ss -tn state listening | gawk 'NR > 1 {n=split($3,A,":"); B[NR-1]=A[n]} END {for (i=1; i<length(B); i++) printf ":%s\\s{2}+|", B[i]; printf ":%s\\s{2}+", B[i]}')
ss -tn state established dst :* | grep -P -v "$FILTER"
请注意,这取决于您使用的ss的版本,较旧的版本(例如:ss实用程序,iproute2-ss111117)具有不同的输出格式,因此在awk中可能必须使用$ 3而不是$ 4。还要注意ss -tln
,并ss -tn state listening
为您提供了不同的输出,这是一个有点反直觉给我。YMMV。
我发现了一个稍微优雅的解决方案,不需要知道主机的IP,就ss -tn state established dst :*
可以很好地工作,我修改了上面的命令行。