Expectを使ってコマンド入力を自動化する
Expectを使ってコマンド入力を自動化する
0.改訂履歴
1.はじめに
このドキュメントでは,expectを使って,TELNETを使って自動ログインする手順を説明する. 自動ログインを行うために,キーボード入力をエミュレートして自動的にコマンドを実行している. 対話型で利用するアプリケーションを使って自動化を行う事ができる. これを応用すれば,簡易的なマクロとして使うことができる.
なお,使用しているOSは,RedHat Linux ES上で稼働している.
2.コマンドの説明
- expectのコマンドは,以下の5つを知っていればよい.
コマンド |
説明 |
spawn |
コマンドを実行する.産むという意味. |
expect |
文字列の標準出力を待つ. |
send |
コマンドを送信する |
expect eof |
プログラムの終了を宣言. |
interact |
インタラクティブモードに移行する. |
- それぞれの使い方は,後述の実例をみれば一目瞭然である.
3.TELNETで自動ログイン
- 普通にコマンドラインからTELNETする場合は,次のようなコマンドとなる.
[ujpadmin@mercury ujpadmin]$ telnet mars1
Trying 192.168.0.3...
Connected to mars1 (192.168.0.3).
Escape character is '^]'.
Red Hat Enterprise Linux ES release 3 (Taroon Update 8)
Kernel 2.4.21-47.ELsmp on an i686
login: your_userid
Password: ■■■■■
Last login: Mon Jun 25 17:44:56 from mercury
[your_userid@mars1 your_userid]$
|
- これを自動化するには,次のようなExpectのスクリプトを作成する.
[ujpadmin@mercury ujpadmin]$ cat AutoLoginTest.sh
#!/usr/bin/expect
spawn telnet mars1
expect "login: "
send "your_userid¥r"
expect "Password: "
send "your_password¥r"
expect eof
[ujpadmin@mercury ujpadmin]$
|
[ujpadmin@mercury ujpadmin]$ ./AutoLoginTest.sh
spawn telnet mars1
Trying 192.168.0.3...
Connected to mars1 (192.168.0.3).
Escape character is '^]'.
Red Hat Enterprise Linux ES release 3 (Taroon Update 8)
Kernel 2.4.21-47.ELsmp on an i686
login: your_userid
Password: ■■■■■■
Last login: Mon Jun 25 17:55:46 from mercury
[your_userid@mars1 your_userid]$
|
- 正しくログインできた.
- しかし,しばらく放置しておくと,勝手にログアウトされる.
login: your_userid
Password:
Last login: Mon Jun 25 17:55:46 from mercury
[your_userid@mars1 your_userid]$ [ujpadmin@mercury ujpadmin]$
|
- これは,expectがタイムアウトしたためで,デフォルトでは10秒となっている.
- タイムアウト時間を設定する場合は,環境変数timeoutを設定する.
- set timeout 30 タイムアウトを30秒とする
- set timeout -1 タイムアウトしない
4.複数のサーバにログインできるようなスクリプトにしたい
- /usr/bin/expectでは,argcでパラメータ数,argv0,argv1・・・で実行時のパラメータをを取得することができる.
- それを利用して,実行時のパラメータでホスト名を指定して,ログインさせるスクリプトを作成する.
[ujpadmin@mercury ujpadmin]$ cat sus
#!/usr/bin/expect
if {$argc != 1} {
puts "Usage: $argv0 hostname "
exit
}
spawn telnet $argv
expect "login: "
send "your_userid¥r"
expect "Password: "
send "your_password¥r"
expect eof
[ujpadmin@mercury ujpadmin]$
|
- このままだと,やっぱりタイムアウトして切れてしまうので,インタラクティブモードに移行する.
[ujpadmin@mercury ujpadmin]$ cat sus
#!/usr/bin/expect
if {$argc != 1} {
puts "Usage: $argv0 hostname "
exit
}
spawn telnet $argv
expect "login: "
send "your_userid¥r"
expect "Password: "
send "your_password¥r"
interact
#expect eof
[ujpadmin@mercury ujpadmin]$
|