lost and found ( for me ? )

expect コマンド: プロセス監視

telnet での一連の処理を作成できる。( xx を送信して、xx という応答を待機して,,, )
例えば、これを使用してプロセス監視などに使用できる。

[root@arizona ~]# cat /etc/fedora-release
Fedora release 11 (Leonidas)

[root@arizona ~]# uname -r
2.6.30.10-105.2.23.fc11.x86_64

[ expect パッケージのインストール ]

[root@arizona ~]# yum install -y expect.x86_64

[ autoexpect コマンドで、expect コマンドを使用したスクリプトの元ネタを作成 ]

autoexpect コマンドを使用すると script.exp というファイルに結果が出力される。
これを修正していくと楽。

[root@arizona ~]# autoexpect telnet 127.1 80
autoexpect started, file is script.exp
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
GET / HTTP1.0

HTTP/1.1 200 OK
Date: Tue, 23 Feb 2010 01:12:20 GMT
Server: Apache/2.2.13 (Fedora)
Last-Modified: Tue, 23 Feb 2010 01:12:13 GMT
ETag: "4b027d-0-4803a3d5ff540"
Accept-Ranges: bytes
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Connection closed by foreign host.
autoexpect done, file is script.exp


- 結果ファイルは script.exp に出力される

[root@arizona ~]# egrep -v "^#" script.exp

set force_conservative 0 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}

set timeout -1 <- タイムアウト。-1 はずっと待つ。
spawn telnet 127.1 80 <- telnet を実施
match_max 100000
expect -exact "Trying 127.0.0.1...\r\r <- -exact は文字列完全一致 ( "xxx" に記載されている文字列が完全一致 )
Connected to 127.1.\r\r
Escape character is '^\]'.\r\r
"
send -- "GET / HTTP1.0\r" <- telnetで接続後、GETを送信
expect -exact "GET / HTTP1.0\r
"
send -- "\r"
expect eof <- End of file


[ スクリプトを実行 ]

[root@arizona ~]# ./script.exp
spawn telnet 127.1 80
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
GET / HTTP1.0

HTTP/1.1 200 OK
Date: Tue, 23 Feb 2010 01:17:25 GMT
Server: Apache/2.2.13 (Fedora)
Last-Modified: Tue, 23 Feb 2010 01:12:13 GMT
ETag: "4b027d-0-4803a3d5ff540"
Accept-Ranges: bytes
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Connection closed by foreign host.

[ 調整 ]

set force_conservative 1

文字を送信するときに少し間隔をあける
入力が早すぎるのをふせぐのが目的。

-exact の完全文字列のところを修正。
-exact をと削除。文字列が含まれていればOK

- タイムアウト処理

set timeout -1 だと、応答がない場合ずっと待ち続ける
set timeout 3 に変更

- エラーの処理

タイムアウトしたときの処理。
Failed を表示して終了

proc abort {} {
send_error "Failed\n"
exit 1
}

#set timeout -1
set timeout 3
spawn telnet 127.1 80
match_max 100000

default abort = タイムアウトしたときの処理
または、
Escape character is '^\]'.\r\r をまつ

expect {
default abort
"Escape character is '^\]'.\r\r"
}

send -- "GET / HTTP1.0\r"
expect {
default abort
"GET / HTTP1.0\r"
}

send -- "\r"

timeout abort は timeout したとき abort する
または
End of File を待つ。

expect {
timeout abort
eof
}

- 引数の設定

set host [lindex $argv 0]
set port [lindex $argv 1]

#set timeout -1
set timeout 3
#spawn telnet 127.1 80
spawn telnet $host $port

引数を指定して実行

[root@arizona ~]# ./script.exp 192.168.1.150 80
spawn telnet 192.168.1.150 80
Trying 192.168.1.150...
Connected to 192.168.1.150.
Escape character is '^]'.
GET / HTTP1.0

HTTP/1.1 200 OK
Date: Tue, 23 Feb 2010 01:45:12 GMT
Server: Apache/2.2.13 (Fedora)
Last-Modified: Tue, 23 Feb 2010 01:12:13 GMT
ETag: "4b027d-0-4803a3d5ff540"
Accept-Ranges: bytes
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Connection closed by foreign host.
[root@arizona ~]#
[root@arizona ~]# ./script.exp 127.1 80
spawn telnet 127.1 80
Trying 127.0.0.1...
Connected to 127.1.
Escape character is '^]'.
GET / HTTP1.0

HTTP/1.1 200 OK
Date: Tue, 23 Feb 2010 01:45:24 GMT
Server: Apache/2.2.13 (Fedora)
Last-Modified: Tue, 23 Feb 2010 01:12:13 GMT
ETag: "4b027d-0-4803a3d5ff540"
Accept-Ranges: bytes
Content-Length: 0
Connection: close
Content-Type: text/html; charset=UTF-8

Connection closed by foreign host.
[root@arizona ~]#

cron で適当にまわす。メールでアラートを追加すると汎用性があがる。
メールのアラートはまたの機会に。

#!/usr/bin/expect -f
set force_conservative 1 ;# set to 1 to force conservative mode even if
;# script wasn't run conservatively originally
if {$force_conservative} {
set send_slow {1 .1}
proc send {ignore arg} {
sleep .1
exp_send -s -- $arg
}
}

proc abort {} {
send_error "Failed\n"
exit 1
}

set host [lindex $argv 0]
set port [lindex $argv 1]

set timeout 3
spawn telnet $host $port
match_max 100000
expect {
default abort
"Escape character is '^\]'.\r\r"
}

send -- "GET / HTTP1.0\r"
expect {
default abort
"GET / HTTP1.0\r"
}

send -- "\r"
expect {
timeout abort
eof
}


No comments:

Post a Comment

Note: Only a member of this blog may post a comment.