내가 생각하는 것은 청취 포트 목록을 얻은 다음 다른 TCP 연결에서 제거하면 모든 나가는 연결입니다. ss (소켓 상태) 명령은 "Local Address : Port"및 "Peer Address : Port"열을 출력합니다. "Peer Address : Port"열이 아닌 "Local Address : Port"열에서 수신 포트를 제거해야합니다. 그렇지 않으면 발신 연결이 누락 될 수 있습니다. 따라서 \s{2}+
grep의 ": $ port"문자열 뒤에 "Local Address : Port"열 뒤에있는 공백과 일치하도록 사용하고 있습니다. 해당 열 뒤에는 두 개 이상의 공백이 있습니다. 여기서 "Peer 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 utility, iproute2-ss111117)은 다른 출력 형식을 가지므로 awk에서 $ 4 대신 $ 3을 사용해야 할 수도 있습니다. 또한 참고 ss -tln
하고 ss -tn state listening
다른 출력을 제공합니다. YMMV.
호스트의 IP를 알 필요가없는 약간 더 우아한 솔루션을 찾았으며 ss -tn state established dst :*
잘 작동합니다. 위의 명령 줄을 수정했습니다.