telnetを自動化したい!
本番リリース作業をする際にtelnet自動化をしましたのでご紹介いたします。
例えばtelnetでsmtpの疎通確認をするとき、telnetは対話型のコマンドなので、
telnet 192.168.1.1 25
と接続し、正常に接続できることを確認したら、手入力でquitと入力し、telnet接続を終了していました。
しかしながらこれ本番作業の度にやるのは結構手間です。
確認対象のメールサービスが複数あるとさらに時間がかかります。
そこでサブシェルでtelnetへの入力を用意しておき、telnetに渡してみた。
telnetを自動化する際のコマンド
(sleep 0.5;echo quit) | telnet 192.168.1.1 25
なお、サブシェルが完了したらtelnet接続は終了するため、quitをわざわざ仕込む必要はない模様。
実行例
# (sleep 1;echo quit) | telnet localhost 25 Trying ::1... Connected to localhost. Escape character is '^]'. 220 test.localdomain ESMTP Postfix Connection closed by foreign host. #
telnetコマンド説明
最初にかっこ内でサブシェルでコマンドを作成しておき、それをtelnetにパイプで渡している。
サブシェルではsleepが必要。sleepしなければ、実行が速すぎてtelnetにわたる前に実行されてしまう。
sleepを何秒にするべきかは実際にtelnetしてみてどれくらいで反応が返ってくるかで決める。
こうすることで、今まで何回かの手入力が必要だったtelnetでの疎通確認が、
ワンライナーで実現できました。
telnet自動化の改良
220が接続成功の意味なので、grepで強調表示してみた。
# (sleep 1;echo quit) | telnet localhost 25 | grep 220 --color 220 test.localdomain ESMTP Postfix Connection closed by foreign host. #
(実際には220が赤色強調表示される。)
一度に複数のメールサービスの疎通確認したい場合、以下のように3つ一度にコピーして貼り付けすれば一気に実行できる。
(sleep 0.5;echo quit) | telnet 192.168.1.1 25 (sleep 0.5;echo quit) | telnet 192.168.1.2 25 (sleep 0.5;echo quit) | telnet 192.168.1.3 25
telnet自動化の応用
smtpに限らずtelnetで接続できるものには何でも応用できる。
例えばスイッチにログインし、インターフェース情報を取ってきてみた。
# (sleep 1;echo <ユーザ名>; sleep 1; echo <パスワード>;sleep 1;echo show ip int bri fa 0/1;sleep 1) | telnet 192.168.1.1 23 Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. User Access Verification Username: admin Password: Switch>show ip int bri fa 0/1 Interface IP-Address OK? Method Status Protocol FastEthernet0/1 unassigned YES unset up up Switch>Connection closed by foreign host. #
telnet自動化の弱点
sleepを使っておりますので、もちろんマシン負荷やネットワーク状況によって反応速度の変化が大きい環境では、
コマンドの組み合わせがちぐはぐになってうまく実行されない可能性もあります。(=毎回の動作保証はない)
よって、あくまで人の目がある状況下での半自動化用途に最適かと思います。
完全に自動化するならexpect等コンソールの反応を識別できるものを利用したほうがよいと思います。