isaaxアドベントカレンダー2018の20日目の記事です。 この記事ではPythonプログラムからlsofコマンドを呼び出して、isaaxで常駐化させ、Raspberry Piなどリモートの端末内のポートの状況を把握する方法を解説します。 まずは、lsofer.pyについて解説します。
import datetime import time import subprocess from time import sleep cmd = ["sudo", "lsof", "-nP", "-iTCP"] while True: print(datetime.datetime.now()) subprocess.call(cmd) sleep(20)上記の様にシンプルにUNIXコマンドをPython内部で呼び出すという構成になっています。 lsofコマンドについて詳しくはこちらをご覧ください。 *極めてパワフルなコマンドなので、ヘルプオプションを読むだけでも少々時間がかかります(苦笑)。 次にRaspberry Pi内部でisaaxが司るプロセスを定義したisaax.jsonを解説します。
{ "name": "python-app", "version": "Nothing test", "author": "Nanami Setoyama", "language":"python", "license": "", "scripts": { "start": "python3 -u lsofer.py" } }基本的に重要なのは”start”以降の部分になります。 後はgitにpushしてisaaxでデプロイするだけです。 実際に実行した結果はこんな感じになります。 この様な感じでisaaxのダッシュボードで簡単にLOGを見ることができます。 ちなみにログの内容も下に貼り付けて起きます。
2018-12-20 09:50:55.543866 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 619 root 3u IPv4 59715 0t0 TCP *:22 (LISTEN) sshd 756 pi 3u IPv4 60107 0t0 TCP 192.168.0.134:22->192.168.0.125:49943 (ESTABLISHED) sshd 619 root 4u IPv6 59717 0t0 TCP *:22 (LISTEN) sshd 739 root 3u IPv4 60107 0t0 TCP 192.168.0.134:22->192.168.0.125:49943 (ESTABLISHED) isaaxd 1407 root 3u IPv4 67961 0t0 TCP 192.168.0.134:47608->40.115.254.120:1883 (ESTABLISHED) isaaxd 1407 root 21u IPv4 68686 0t0 TCP 192.168.0.134:48386->40.115.227.80:443 (ESTABLISHED) isaaxd 1407 root 5u IPv6 67032 0t0 TCP *:1226 (LISTEN) isaaxd 1407 root 19u IPv4 67035 0t0 TCP 127.0.0.1:8880 (LISTEN)isaadxが1883番ポートが使用していますが、これはisaaxのクラウドと通信をする為のMQTTで利用しているポートです。IoT以外ではあまり見かけないポート番号ですね。 今回は簡単にポートの状態についても解説しておきます。
CLOSED | ソケットが使われていない状態。(ここでいうソケットは所謂UNIXドメインソケット) |
LISTEN | ソケットが接続待ち状態。 |
SYN SENT | ソケットが接続確立のためにネゴシエーションしてる状態。 |
SYN RECV | 接続がイニシャライズ中の状態。 |
ESTABLISHED | ソケットは接続を確立して、セッションを結んでる状態(最も多く見かけますね)。 |
FIN WAIT-1 | ソケットは終了して、接続は切断中の状態。 |
FIN WAIT-2 | 接続は終了して、ソケットはリモートクライアント側から切断要求を待っている状態。 |
CLOSING | 自分と相手側の両方のソケットは終了したが、全てのデータを受信していない状態。 |
TIME WAIT | ソケットは終了して、リモートクライアント側からの切断要求が再送されるのを待っている状態。 |
CLOSE WAIT | リモートクライアント側が切断されたので、ソケットが終了するのを待っている状態。 |
LAST ACK | リモートクライアント側が切断されソケットも終了しているが、ACK(確認のための返事)が来るのを待っている状態。 |