#なぜ自動化する?
例えばtelnetでsmtpの疎通確認をするとき、telnetは対話型のコマンドなので、
telnet 192.168.1.1 25
と接続し、正常に接続できることを確認したら、手入力でquitと入力し、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にパイプで渡している。
サブシェルではsleepが必要。sleepしなければ、実行が速すぎてtelnetにわたる前に実行されてしまう。
sleepを何秒にするべきかは実際に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
#応用
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.
#
#弱点
sleepを使っておりますので、もちろんマシン負荷やネットワーク状況によって反応速度の変化が大きい環境では、
コマンドの組み合わせがちぐはぐになってうまく実行されない可能性もあります。(=毎回の動作保証はない)
よって、あくまで人の目がある状況下での半自動化用途に最適かと思います。
完全に自動化するならexpect等コンソールの反応を識別できるものを利用したほうがよいと思います。