Telnet を自動化して RTX1210 の DHCP 状況を取得する
RTX1210 に対する Telnet 操作を自動化できたため、その手順を解説します。
今回は、YAMAHA RTX1210 のコマンドで利用しましたが、ルータに限らず Telnet 操作を自動化したい場合に応用できると思います。
今回やりたいこと
ネットワーク内で 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 から取れるともう少し楽だったのですが、どうも取れなさそうでコマンドから無理やり取得しました。もっと楽で美しい方法があればご連絡お待ちしています。