k的に楽にプロセスのListenしているポートを確認し、手軽に使用ポートとサービスを出力したい

4 min read

こんにちは、無能です。

おやおや、なんかどこかで聞いたことあるような記憶があるフレーズがタイトルに使われているぞ・・・
今も時々あれって良いサイト名だよなと思う、健康診断でバッチリ低血圧60-100を叩き出した今日この頃です。
二回目に図った値がガッツリ低血圧で、流石に一回目の数値使われました。

はじめに

ふと
「使用ポートとそのサービスがなんなのかわかりやすく出力したい」
と思いました。

なぜかと言うと

  • 個人で運用している中でサーバ構成図まではいらずに手軽に確認、出力したい
  • md形式やテキストファイルで出力したい
  • 使用ポートの確認 ぶっちゃけ、自分で動かしているものが増えてきてだんだんどのポート使っていたっけな?
    となるものも多くなり、ある程度自分の欲しい情報がまとまってくればある程度スクリプト化→.md形式のファイルとして手軽に確認したい。
    ちなみになぜテキストファイルにこだわるかというと
    データの扱いが楽になる
    からです。 ここの点に関して後述として書くことにします。

シンプルにこれ一個打つだけだけ

lsof -i -P -n | grep "LISTEN" |  awk '{print $1 "," $3 "," $9}' | sort | uniq

とすると

$ lsof -i -P -n | grep "LISTEN" |  awk '{print $1 "," $3 "," $9}' | sort | uniq
pulseaudi,haturatu,*:38169
pulseaudi,haturatu,*:44409
pulseaudi,haturatu,*:4713

こんな感じで出力してくれる。
ちなみにlsofのオプションなしでも出力結果は同じなのですが、BSD版だとどうやら違うようなのでしっかりオプションはフルで入れています。

CSV化

割とファイル形式としては色々言われることが多いですが、私はCSV形式が好きです。
ぶっちゃけ、CSVファイルとして扱うときにCSVは悪くない気がします。唯一当たり前のことですがsedでカンマを置換するとかしてしまうともし文字列中に使われていたらそれも置換してしまうかなあ、と。
TSVはまだ全体的に馴染みないのでCSVがいい。(ぶっちゃけsedで置換するならカンマとタブどっちの方が誤植ないだろうか・・・)

なんか話がそれてしまいましたがとりあえず手軽にCSV化してしまえばそのままExcelにもコピペ出来るしそのまま開くだけでも可読性は高い。
シンプルに標準出力のリダイレクトに.csvとしてLibreOfficeなりでも手軽に開けます。次はTCP・UDPの情報も付与して

$ lsof -i -P -n | grep "LISTEN" |  awk '{print $1 "," $3 "," $9 "/" $8}' | sort | uniq > test.csv

Image
こんな感じになり

こうすれば
Image
割と可視化しやすいかもしれない。

ぶっちゃけ、最初の方にprintf %10sとかでスペース入れずに泥臭くprint " "で出力していたけどCSV形式にする前提のコマンドとして最終的にcolumnコマンドにパイプで渡してあげたほうがコマンド自体が分かりやすいし、見やすい気がする・・・
Image

Markdown形式にするなら

最初md形式に則って、テーブルに・・・と思ったが割とmd形式のテーブルって好きになれないところがありコピペしやすいように"```"で良いかな・・・と。
必要ならawkでprintして出力しよう。

md形式で出力したい目的はは定期的にGithubなりでプライベートレポジトリにpushさせるcronとして動かせばいつでも手軽に確認ができるからです。

他に必要なものを考える

あとはディスクの容量確認としてdf -hvmstatfreeとかになるけどもちょっとそうなるとシステム全体としてのリソース監視的な意味になるので/proc/cpuinfo/proc/meminfoあたりから情報引っ張ってくるとかですかね・・・。
DBのテーブル情報が割と可視化しやすいようにしてくれればなお良しでやるとすればwhich *である程度DB系のコマンド実行させてステータスコード0として帰ってきたものだけ指定のDB情報吐き出すようにしてあげればなお丁寧。だけどなかなか腰が重いところがある。

結構構成図とかは人によってばらつきもあり、詳細なミドルウェア製品としての設計書ももちろん必要なのはわかるのですがシステムの全体像ってなにか一つにまとまっていないと確認が大変なので個人的に管理しやすくする方法がないかなあ、と。
draw.ioみたいに手軽に作図するのも楽なんですがその作図までの確認コストも抑えて行きたいところ。

おまけ Wireguardの沈黙

ちなみにやってて思ったんですが、lsofでWireguardがUDP51820として動いているのになんで表示しないんだ?と思ったら答えがありました。
the wireguard not listening on port after started
Raspberry Pi で WireGuard + VPS
どうやらカーネルモジュールとして機能するからのようです。自分なりの解釈からするとWireguardの動作するレイヤーはレイヤー3として稼働していて、あくまで"プロセスが空いているファイルを表示"するものだから出力しないのかな、なんて考えたり。違うのか?

ちなみに赤帽さんの日本語ドキュメントはかなり分かりやすいです。
第8章 WireGuard VPN の設定
というわけで本日はここまで。なんか他に良いこと思いついたら続き書くかもしれないし、書かないかもしれない。 また、よろしくお願いします。