4

だから、私はnetstat -lt開いているポートを取得するために使用しています。ただし、特定の値 (SSH や 22 など) には関心がないので、それらを除外できるようにしたいと考えています。また、それらを bash の配列として取得したいと考えています。これまでのところnetstat -lt | sed -r 's/tcp[^:]+://g' | cut -d' ' -f1、それらは配列ではなく、何も除外していません。

4

3 に答える 3

3

ssを置き換えるコマンドを使用してみてくださいnetstat

ss -atu | awk '{print $5}' | awk -F: '{print $NF}'

このssコマンドは、ローカルマシン上のすべてのTCPおよびUDPポート(ポートを持つ唯一のソケット)を提供します。最初のawkは、ローカルアドレスとポート番号を含む列を抽出します。2つ目awkは、コロンに続く最後のフィールドのみを取ります。これは、マシンにIPv6ソケットがあり、そのIPアドレスにもコロンが含まれている場合に必要です。

これを実行するgrepと、不要なポートを削除できます。また、ssフィルターの詳細については、manページで参照されているドキュメントを参照してください。これにより、の出力から不要なソケットをフィルターで除外できる場合がありますss

于 2012-07-12T20:13:43.430 に答える
2

($())あなたの声明の周りに追加してください:

port=($(netstat -ltn | sed -rne '/^tcp/{/:(22|25)\>/d;s/.*:([0-9]+)\>.*/\1/p}'))

ポート 22 および 25 のフィルタリング。

于 2012-07-12T19:56:27.197 に答える
0
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'
于 2012-07-12T20:06:28.423 に答える