UJP - 技術情報1

Life is fun and easy!

不正IP報告数

Okan Sensor
 
メイン
ログイン
ブログ カテゴリ一覧

Expectを使ってコマンド入力を自動化する

Expectを使ってコマンド入力を自動化する


0.改訂履歴

  • 2007.06.25 新規作成

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]$ 
  • ちなみに,¥rは,改行.
  • 実行してみる.
[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]$ 
  • 以上.


広告スペース
Google