Telnet を自動化して RTX1210 の DHCP 状況を取得する

概要

Telnet を自動化できたため、その手順について紹介します。

今回は、YAMAHA RTX1210 のコマンドで利用しましたが、ルータに限らず Telnet 操作を自動化したい場合に応用できると思います。

f:id:yuu2634:20180608215130p:plain


今回やりたいこと

ネットワーク内で DHCP の空きアドレスが枯渇している疑惑があり、確認を自動化することが目的でした。SNMP では取得できないため、Telnet で下記操作を実行します。

$ telnet 10.0.xxx.yyy
Password: 

> console lines infinity
> show status dhcp
 (ここに DHCP 状況が出力される)
> quit

単純に show status dhcp コマンドを実行すればよいのですが、結果が長いと1画面に表示されないため console lines infinity で行数制限を事前に解除しています。


パターン1: telnet + expect

ググるとまず出てくるのは expect ですね。Password: が表示されたらパスワードを入力、> が表示されたら次のコマンドを入力、といった流れにします。

末尾に \r の改行を付けないとコマンドが送信されないため注意が必要です。

頑張ってワンライナーにするとこうなります。

$ expect -c "spawn telnet 10.0.xxx.yyy; expect Password:; send password\\r; expect >; send \"console lines infinity\\r\"; expect >; send \"show status dhcp\\r\"; expect >; send \"quit\\r\""


パターン2: telnet + echo + sleep

下記のような書き方をすることで、Telnet にコマンドを渡せます。

$ (echo "command1"; echo "command 2") | telnet 10.0.xxx.yyy

そのままではコマンド完了前に次々と送信されてしまうため、sleep で間隔を調整します。

$ (sleep 1; echo "command1"; sleep 1; echo "command 2") | telnet 10.0.xxx.yyy


これをシェルスクリプト化します。show status dhcp は量が多いと時間がかかるため、sleep の秒数をいい感じに調整します。

ワンライナーにするとこうなります。

$ (sleep 1; echo "password"; sleep 1; echo "console lines infinity"; sleep 1; echo "show status dhcp"; sleep 3; echo "quit") | telnet 10.0.xxx.yyy


結果を整形

出力される行がそこそこ多いため grep を掛けます。言語別に文言が異なります。

# English
egrep "Network address:|All:|Leased:|Usable:"

# 日本語
egrep "ネットワークアドレス|全アドレス数|割当中アドレス数|利用可能アドレス数"

この条件で絞り込むと次のような出力結果になります。

Network address: 10.100.0.0
All: 40
Leased: 12
Usable: 28
Network address: 10.200.0.0
All: 100
Leased: 85
Usable: 15
ネットワークアドレス: 10.100.0.0
スコープの全アドレス数: 40
割り当て中アドレス数: 12
利用可能アドレス数: 28
ネットワークアドレス: 10.200.0.0
スコープの全アドレス数: 100
割り当て中アドレス数: 85
利用可能アドレス数: 15


さらに sed やらを組み合わせて次のような形に落ち着きました。閾値を下回ったら Slack 通知するなどの拡張もアリです。

10.100.0.0: 28/40
10.200.0.0: 15/100


まとめ

  • Telnet 操作を自動化しました
  • RTX1210 の DHCP リース状況をコマンドで取得しました
  • expect の他に echo, sleep の組み合わせも使えます

SNMP から取れるともう少し楽だったのですが、どうも取れなさそうでコマンドから無理やり取得しました。もっと楽で美しい方法があればご連絡お待ちしています。


参考記事