だから、私はnetstat -lt
開いているポートを取得するために使用しています。ただし、特定の値 (SSH や 22 など) には関心がないので、それらを除外できるようにしたいと考えています。また、それらを bash の配列として取得したいと考えています。これまでのところnetstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1
、それらは配列ではなく、何も除外していません。
3 に答える
ss
を置き換えるコマンドを使用してみてくださいnetstat
。
ss -atu | awk '{print $5}' | awk -F: '{print $NF}'
このss
コマンドは、ローカルマシン上のすべてのTCPおよびUDPポート(ポートを持つ唯一のソケット)を提供します。最初のawkは、ローカルアドレスとポート番号を含む列を抽出します。2つ目awk
は、コロンに続く最後のフィールドのみを取ります。これは、マシンにIPv6ソケットがあり、そのIPアドレスにもコロンが含まれている場合に必要です。
これを実行するgrep
と、不要なポートを削除できます。また、ss
フィルターの詳細については、manページで参照されているドキュメントを参照してください。これにより、の出力から不要なソケットをフィルターで除外できる場合がありますss
。
($())
あなたの声明の周りに追加してください:
port=($(netstat -ltn | sed -rne '/^tcp/{/:(22|25)\>/d;s/.*:([0-9]+)\>.*/\1/p}'))
ポート 22 および 25 のフィルタリング。
a=( `netstat -ltn --inet | sed -r -e '1,2d''s/tcp[^:]+://g' | cut -d' ' -f1 | sed -e '1,2d' | grep -v "22\|33\|25"` )
2 番目の sed コマンドは、お使いのバージョンの netstat がヘッダーを出力する場合、ヘッダーを削除します。最初の 2 行に「Active」と「Proto」があります。不要なポートをフィルタリングするには、grep を使用します。-n を netstat に追加すると、名前の代わりにポート番号が表示されます。--inet は ipv4 を強制するためのものです。そうしないと、IPv6 が表示され、スクリプトが混乱する可能性があります。
ところで、配列が必要かどうかわかりません。通常、配列は、持っている値のサブセットで作業する場合にのみ必要です。すべての値で作業する場合、より単純な構造がありますが、何をしようとしているのかわかりません。
よろしく。
更新: 2 つの別々の呼び出しではなく、2 つの操作で単一の sed コマンドを使用できます。
sed -r -e '1,2d' -e 's/tcp[^:]+://g'