作者 主題: [expect程式] timeout以及判斷式的問題?!  (閱讀 8804 次)

0 會員 與 1 訪客 正在閱讀本文。

barista

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
expect程式不知道有誰用過
  一個簡單的ssh程式,請問如果其中一台主機(myip1)掛掉了
  可以在程式中間就判斷他掛了,而去做某些事情嗎?
  (例如:如果掛了,我就寫個訊息到某個檔案裡說明主機目前掛掉中)
                                                                               
  #!/usr/bin/expect -f
  spawn ssh des@myip"
  expect {
        password: {send "mypasswd\n"}
  }
  expect  "$"
  send "exit\n"
                                                                               
  spawn ssh des@myip1"
  expect {
        password: {send "mypasswd1\n"}
  }
  expect  "$"
  send "exit\n"
                                                                               
  spawn ssh des@myip2"
  expect {
        password: {send "mypasswd2\n"}
}
  expect  "$"
  send "exit\n"
                                                                               
                                                                               
interact timeout 5
exit

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #1 於: 2005-04-29 13:44 »
# ddd.exp
#!/expect -f
log_file ./exp.log
set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $username@$host
expect {
password: {send "$password\n"}
-re ".*Connection timed out" : { send_user "[exec echo $(date): $host was down-G > /tmp/down-G.list]
}

#>./ddd.exp ssh-host username password
當機時(timeout) 寫入 list

不過高明點,可以用 mail, 改 send_user 那段即可
不然可以學我的, 到 www.sf.net 找 tmsnc
改一下程式 (不改也行,但你 要 expect )

#!/usr/bin/expect -f
log_file ./exp.log
set args [lindex $argv 0]
set msgs [lindex $argv 1]
spawn tmsnc
sleep 5
expect -re ".*Recieved and answered challenge.*"
sleep 5
send "/chat $args\r"
sleep 3
expect -re ".*!.*"
send "Now: [exec date]\012\015"
sleep 3
send "$msgs\r"
sleep 3
send "/quit\r"

當機時,用 MSN 送訊息

barista

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #2 於: 2005-05-02 00:45 »
引述: "abelyang"
# ddd.exp
#!/expect -f
log_file ./exp.log

log_file ./exp.log 這邊是代表什麼意思?
引述: "abelyang"

set host [lindex $argv 0]
set username [lindex $argv 1]
set password [lindex $argv 2]
spawn ssh $username@$host
expect {
password: {send "$password\n"}
-re ".*Connection timed out" : { send_user "[exec echo $(date): $host was down-G > /tmp/down-G.list]
}

.list] 最後面是不是少了 "}這符號 ?? 可是我加入後還是跑不出來耶 :x
abelyang大請再check一下..謝謝!  :)
引述: "abelyang"

#>./ddd.exp ssh-host username password
當機時(timeout) 寫入 list

不過高明點,可以用 mail, 改 send_user 那段即可
不然可以學我的, 到 www.sf.net 找 tmsnc
改一下程式 (不改也行,但你 要 expect )

#!/usr/bin/expect -f
log_file ./exp.log
set args [lindex $argv 0]
set msgs [lindex $argv 1]
spawn tmsnc
sleep 5
expect -re ".*Recieved and answered challenge.*"
sleep 5
send "/chat $args\r"
sleep 3
expect -re ".*!.*"
send "Now: [exec date]\012\015"
sleep 3
send "$msgs\r"
sleep 3
send "/quit\r"

當機時,用 MSN 送訊息

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #3 於: 2005-05-04 11:31 »
看來你只是抄別人的來用而以 ...
你自己好好 man expect 看一下, 你的問題裏面都有寫

我寫得第一段是沒有經過實驗的,但是是融會貫通後寫出來的
我相信思考邏輯就是這樣而以,問題是你自己有沒有研究

barista

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #4 於: 2005-05-04 13:36 »
引述: "abelyang"
看來你只是抄別人的來用而以 ...
你自己好好 man expect 看一下, 你的問題裏面都有寫

我寫得第一段是沒有經過實驗的,但是是融會貫通後寫出來的
我相信思考邏輯就是這樣而以,問題是你自己有沒有研究

abel大你這樣說就沒啥意義了
我幹麻抄別人的來用
我自己也是網管,遇到問題才會提出來
即使你不寫code出來,我也不會講什麼
你把方法講出來我就很感激了
因為今天的問題在於怎麼解決上述問題
但是既然你把程式碼貼出來,我理所當然的去試試看能不能run
run不出來,也許是你寫的有問題,也許是你只是寫個大概
但你並沒有說清楚不是嗎?我提出疑問有何問題?

但這不是重點,我只想澄清不是來抄襲什麼,我是來解決問題
不希望你用這種口氣來講別人

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
[expect程式] timeout以及判斷式的問題?!
« 回覆 #5 於: 2005-05-04 14:08 »
好差的口氣...
遇到問題的人是你並不是 abelyang ...

引用
看來你只是抄別人的來用而以 ...

應該是說你只是先把 abelyang 寫的範例貼上測試而已..
並沒有根據你問題等作修正...

引用
你自己好好 man expect 看一下, 你的問題裏面都有寫

abelyang 有跟你說解決的地方...就是看 expect ..

引用
不希望你用這種口氣來講別人

我想也不會有人希望你用這種口氣來回給你回應的人....
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #6 於: 2005-05-04 14:19 »
嗯~您說的沒有錯. 我是太武斷了的說法.若有得罪,請見諒.

我之所以有這樣的想法主要是因為這一句:
引用
log_file ./exp.log 這邊是代表什麼意思?

因為這個部份我覺得 man 一下就會很清楚

至於程式的部份,請您看一下 man expect 中的一段:
代碼: [選擇]
   expect {
        Password: {
            stty -echo
            send_user "password (for $user) on $host: "
            expect_user -re "(.*)\n"
            send_user "\n"
            send "$expect_out(1,string)\r"
            stty echo
            exp_continue
        } incorrect {
            send_user "invalid password or account\n"
            exit
        } timeout {
            send_user "connection to $host timed out\n"
            exit
            exit
        } -re $prompt
    }

跟您的要求不是很像 ?
至於要不要 log, 用 log_file , [exec ..] , 或 >,>> 都可以
exp_continue 就是回到 該 expect {} 的頭 (像 c 的 continue)
至於兩次 exit 則是一個要退出 spwan , 一個要退出 expect
其他的您慢慢研究看看囉  ...

不過若我做的話,若非設備 (像 Router,Switch..) ,我但都是用
在 HostA or B or C .. run 一個cron 程式, 檢查 disk/cpu/process
...再用HTTP 一次送到 web server , 若 Server 連續兩次以上
沒收到,就 Call MSN, 再未處理,就 Call SMS.
至於像設備的,大概就用 expect 或 snmp 來處理了

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #7 於: 2005-05-04 14:29 »
引述: "Darkhero"
好差的口氣...
遇到問題的人是你並不是 abelyang ...


Darkhero 兄..其實 barista 說的也沒有錯,我可以接受他的指教
您別介意. barista 並非單純的抄襲,且肯學習,思考,對於我的
"提示" 所提出的看法, 我不認為他太過,雖然乍看下可能...,但我
可以接受 barista 兄的說法.

不過我會建議 barista , 提問之前,先自問,自己盡力找過答案了嗎?
這麼對您將來的學習,會有更大的幫助.

barista

  • 可愛的小學生
  • *
  • 文章數: 11
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #8 於: 2005-05-04 14:40 »
引述: "abelyang"
嗯~您說的沒有錯. 我是太武斷了的說法.若有得罪,請見諒.

我之所以有這樣的想法主要是因為這一句:
log_file ./exp.log 這邊是代表什麼意思?
因為這個部份我覺得 man 一下就會很清楚

不好意思,又麻煩abel大在勞筆一次!我之所以有那個想法,是直覺這行應該是您自己寫的(因為不像系統指令),所以就直接#掉,壓根沒想到是man的內容.expect我也man過了,可能資質駑鈍,似懂非懂,才上網請教先進,但還是謝謝你
引述: "abelyang"

至於程式的部份,請您看一下 man expect 中的一段:
代碼: [選擇]
   expect {
        Password: {
            stty -echo
            send_user "password (for $user) on $host: "
            expect_user -re "(.*)\n"
            send_user "\n"
            send "$expect_out(1,string)\r"
            stty echo
            exp_continue
        } incorrect {
            send_user "invalid password or account\n"
            exit
        } timeout {
            send_user "connection to $host timed out\n"
            exit
            exit
        } -re $prompt
    }

跟您的要求不是很像 ?
至於要不要 log, 用 log_file , [exec ..] , 或 >,>> 都可以
exp_continue 就是回到 該 expect {} 的頭 (像 c 的 continue)
至於兩次 exit 則是一個要退出 spwan , 一個要退出 expect
其他的您慢慢研究看看囉  ...

不過若我做的話,若非設備 (像 Router,Switch..) ,我但都是用
在 HostA or B or C .. run 一個cron 程式, 檢查 disk/cpu/process
...再用HTTP 一次送到 web server , 若 Server 連續兩次以上
沒收到,就 Call MSN, 再未處理,就 Call SMS.
至於像設備的,大概就用 expect 或 snmp 來處理了

abel大真的是經驗非常豐富,從rrd大作我就已經跟您學習了,我也無惡意有那些想法,請多見諒..謝謝

Darkhero

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 3728
  • 性別: 男
    • 檢視個人資料
    • ㄚ凱隨手紀
[expect程式] timeout以及判斷式的問題?!
« 回覆 #9 於: 2005-05-04 16:14 »
也跟大家道歉...

相信大家都是善意的... ^_^ ...
或許在文字的表示上總是會少了語氣的感覺...
所以總是會容易產生誤解...
希望我們的討論是為了把問題解決,而不是爭論誰對誰錯.
『灌水才是重點,發文只是順便』
『我寧可讓不會釣魚的工程師餓死,也不想讓會餓死的工程師去攪沉公司....』
Blog: http://blog.darkhero.net/
秘密基地: http://www.darkhero.net/comic/
目前服務的網站: http://www.libook.com.tw/

abelyang

  • 酷!學園 學長們
  • 俺是博士!
  • *****
  • 文章數: 1097
    • 檢視個人資料
[expect程式] timeout以及判斷式的問題?!
« 回覆 #10 於: 2005-05-04 16:28 »
你把 expect 學好,在做網管時會很好用.
你若用 mrtg 或 rrd 時,到達 alert 值時,你就可以 call expect
(rrd 較難做,但仍可以的)來對應處理
例如,我的一段 mrtg:
代碼: [選擇]

# Threshold section @mrtg.cfg
ThreshDir: /www/htdocs/mrtg/alert/
ThreshMaxI[sg-apol-mgcd]: 1000
ThreshProgI[sg-apol-mgcd]:/www/htdocs/mrtg/alert/mail.sh

也就是 Target 的值到達 1000 時 , 就 call mail.sh



#!/bin/sh
# ThreshProgI 以 $1 target name , $2 為設定的值,本例為 1000, $3 為現在值
target=$1
alert_val=$2
curr_val=$3

now=`date "+%Y/%m/%d %H:%M:%S"`
# 寄信
echo -e "Subject:$target 可能出問題囉 \n\nDear Sir:\n 現在時間: $now\nMRTG 發現監測的系統中 $target 的 $curr_val 超過或小於 $alert_val 您所設定的警告值,請您了解情況, \nRef:http://Web_Server/mrtg/index.html\nOr http://Web_Server/mrtg/$target.html\n System Admin\n" | /usr/sbin/sendmail -oi alert_user@your_mail_server
# call 重開程式, 等於用 expect 去 restart 遠端主機的一個 deamon
/www/htdocs/mrtg/alert/2600.exp $target
# expect + php call TMSNC 做 msn alert
wget "http://IP//send_to_msn.php?txt1=MSN_account&msg=$target Problem\nhttp://Web_server/mrtg/$target.html?smt1=send" -O /tmp/msn.log