私は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つのことがあります。
/etc/services
IANA RFC 1340 TCPおよびUDPポート割り当て番号の「データベース」(たとえば、フラットファイルキャッシュ)。人々はそれを使用して整数ポート番号を論理文字列名にまたはその逆に変換します。を使用してアクセスするすべてのシェルには、これに関するマニュアル/文書がありますman 5 services
。はい、Javaなどの「高水準」言語で作業している場合は、オペレーティング
Runtime.getRuntime().exec()
システムを最大限に活用できません。proc
そしてファイルシステムからデータを読み取ることをお勧めしますsys
。シェルとcoreutils
。
それは問題ではありません。この質問に答えるには、まずsed
、とをxargs
見てください。は他の言語と同等のストリームエディタですが、行クリーンアップを実行し、スペース文字をスペースに拡張します。リスニング専用出力フラグもあります。これはあなたの要件を満たすために1つのパイプラインにまとめられています。cut
expand
sed
regex
xargs
map() with lambda
netstat
答えを分解する
注文する | 説明する |
---|---|
printf |
C/C++ printf() 関数と同じ [出力タイトル] |
netstat -ntl |
/proc/net/tcp DNSルックアップなしでバインドされたリスナーを確認する |
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