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]$ 
					 |