netstatを使用してプロトコル、ポート、およびステータスのみを表示する方法は?

netstatを使用してプロトコル、ポート、およびステータスのみを表示する方法は?

私はnetstat -lt | grep LISTENすべてのリスニングTCPポートを一覧表示するために使用します。 Javaアプリケーションを介してこのデータを使用する必要があるため、Javaでの処理オーバーヘッドを減らすためにシェルで出力フォーマットを指定したいと思います。私が望むもの:

Protocol port status
tcp      4567 LISTEN

出力タイプ。 netstatを使ってこれを達成する方法はありますか?それともUnixでこれを達成するための他のネットワークアプリケーションを提供していますか?

また、以下を介してサービスファイルを読みました。

less /etc/services | grep tcp | cut -d '#' -f 1

ただし、これにより、開いているかどうかに関係なく、すべてのTCPポートが一覧表示されます。どんな提案でもいいでしょう!

答え1

または、シェルプログラムの実行に関するセキュリティの問題に対処する代わりに、/proc/net/tcp ファイルをお読みください。

答え2

長すぎる。

printf "Protocol port status";
netstat -nlt \
  |sed -e '/LISTEN/p;d' -e '1,2d' \
  |xargs -n6 \
  |cut -d\  -f1,4,6 \
  |sed 's/ .*:/ /';

ヘッダー

将来の読者とWebクローラーのためにここで特別に扱うべき2つのことがあります。

  1. /etc/servicesIANA RFC 1340 TCPおよびUDPポート割り当て番号の「データベース」(たとえば、フラットファイルキャッシュ)。人々はそれを使用して整数ポート番号を論理文字列名にまたはその逆に変換します。を使用してアクセスするすべてのシェルには、これに関するマニュアル/文書がありますman 5 services

  2. はい、Javaなどの「高水準」言語で作業している場合は、オペレーティングRuntime.getRuntime().exec()システムを最大限に活用できません。procそしてファイルシステムからデータを読み取ることをお勧めしますsys。シェルとcoreutils

それは問題ではありません。この質問に答えるには、まずsed、とをxargs見てください。は他の言語と同等のストリームエディタですが、行クリーンアップを実行し、スペース文字をスペースに拡張します。リスニング専用出力フラグもあります。これはあなたの要件を満たすために1つのパイプラインにまとめられています。cutexpandsedregexxargsmap() with lambdanetstat

答えを分解する

注文する 説明する
printf C/C++ printf() 関数と同じ [出力タイトル]
netstat -ntl /proc/net/tcpDNSルックアップなしでバインドされたリスナーを確認する
sed -e '/LISTEN/p;d' -e '1,2d' sed を順番に 2 回実行します。すべてのLISTENレコードを見つけて、他のすべてのレコードを削除し、1行と2行を削除します(netstatのヘッダー、出力の変更を防ぐ)。
xargs -n6 出力をスペースで区切られた6列のレコード様式として指定する
cut -d\ -f1,4,6 スペース区切り記号を使用して列1、4、6を選択します。
sed 's/ .*:/ /' 2番目の列を後処理してIPアドレスを削除する

答え3

これには列ヘッダーは含まれていませんが、タブで区切られた形式で必要なデータが提供されます。

netstat -lnt | tail -n+3 | awk '{print $1 "\t" $4 "\t" $6}'

マイコンピュータで実行すると、次の結果が表示されます。

tcp     127.0.0.1:3306  LISTEN
tcp     0.0.0.0:22      LISTEN
tcp6    :::22   LISTEN

関連情報