あなたがやりたいと思うのは、リスニングポートのリストを取得し、それらを他のTCP接続から削除することです。それがすべての発信接続になります。ss(ソケットステータス)コマンドは「ローカルアドレス:ポート」および「ピアアドレス:ポート」列を出力します。「ピアアドレス:ポート」列ではなく、「ローカルアドレス:ポート」列からリスニングポートを削除する必要があります。そうしないと、発信接続に失敗する場合があります。それを実現するため\s{2}+
に、grepの「:$ port」文字列の後ろで「Local Address:Port」列の後ろにあるスペースと一致するように使用しています。その列の後ろに2つ以上の空白があります。「ピアアドレス:ポート」には1つのスペースがあり、次に改行(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で$ 4の代わりに$ 3を使用する必要があります。またss -tln
、ss -tn state listening
異なる出力が得られることに注意してください。これは、私にとっては少し直感に反します。YMMV。
ホストのIPを知る必要のない、わずかにエレガントなソリューションが見つかりましたが、ss -tn state established dst :*
うまく機能します。上記のコマンドラインを変更しました。