linux TCL expect

請問一個有關TCL的expect的問題

expect很好用,在linux底下,可以幫助我們完成一些自動化的工作

但目前有一個需求是

先自動化,中間需要回到手動,然後再回到自動化

目前知道好像有個叫interact可以用,但下了interact之後,

不知如何回到自動化expect下,

所以想請問expect跟interact怎麼切換?

Update:

補充一下,我是要執行某個程式(script)

這個script前面跟後面可以expect來自動化

但中間有些部分,一定要手動完成

而目前不知道如何從expect切至interact,再從interact切回expect

Update 2:

先謝謝你的回答。

這樣是ok,但進入interact mode之後,想再跳回原來的程式

繼續進行expect mode的工作時,該如何做?

另外,我不是寫c++,是要寫linux script ( /bin/sh ),

不過這對於從interact再跳回來的方式應該沒有影響吧?!

Update 3:

expect "Username: "

interact {

 "\r" {

  send "\r"

  return

 }

}

"\r"應該是enter的應

Update 4:

該是enter的意思

如果用其它,例如:數字、字母、加減號…等

這一段的意思還是不太懂

能不能解釋一下

經常收到invalid command name的訊息

Update 5:

我用一個\還是不行,我練習的小程式如下

test

----------------------------------

read -p "user=" usr

read -p "password=" pw

echo "user=$usr password=$pw"

---------------------------------------

Update 6:

a

------------------------------

#! /usr/bin/expect

spawn ./test

expect

"user="

interact {

  "\r" {

   send "\r"

  return

}

  }

Update 7:

expect {

"password=" { send "111111\r" }

}

expect eof

----------------------------------------

Update 8:

執行expect a,結果如下

spawn ./test

user=asd

invalid command name "usr="

while executing

""user=""

(file "./a" line 4)

[root@EE Desktop]# asd

bash: asd: command not found

[root@EE Desktop]#

Update 9:

把expect和 "user="弄成同一行,執行結果如下:

spawn ./test

user=extra characters after close-quote

while executing

"interact {

  "\\r" {

   send "\\r"

  return

} "

(file "./a" line 4)

Update 10:

檢查出來了!是在第5行少了個空白@@

但如果改成用括號就會都變成手動,滿奇怪的???

更進階的問題…看之後試的情形再向您請教!

Update 11:

搞定範例題之後,開始套用在主要程式

但從interact mode跳回expect mode時,卻沒有成功,出現以下訊息

expect: spawn id exp4 not open

請問是什麼問題?

Update 12:

檢查出來了!

但有新的問題想請教

手動的部分,會一些重複多次且不固定次數的相同訊息

只有1次時,很正常

2次以上,就會出現 command not found的訊息而中止

請問該怎麼修改?

1 Answer

Rating
  • 其威
    Lv 7
    9 years ago
    Favorite Answer

    例如一隻這樣的程式,幾乎什麼也不做...

    #include <iostream>

    #include <string>

    int main()

    {

    std::string username, password;

    std::cout << "Username: ";

    std::cin >> username;

    std::cout << "Password: ";

    std::cin >> password;

    std::cout << "Hello " << username << ", your password was " << password << "." << std::endl;

    }

    配合這樣的 expect script:

    #!/usr/bin/expect

    spawn ./expect_login

    expect "Username: "

    send "asdf"

    expect "Password: "

    interact

    在他看到 Password 的時候,會等待你的輸入。

    例如你輸入 asdf 然後按下 enter,他就會把你輸入的東西丟給程式。

    於是就會看到

    Hello asdf, your password was asdf

    這樣的輸出。

    2011-06-24 15:32:29 補充:

    嗯,抱歉,要設定 return 的條件。

    改成這樣好了,讓他提醒你手動輸入 username,然後自動補 password:

    #!/usr/bin/expect

    spawn ./expect_login

    expect "Username: "

    interact {

     "\r" {

      send "\r"

      return

     }

    }

    expect "Password: "

    send "fdsa"

    expect eof

    2011-06-29 04:26:30 補充:

    一個 \ 就好了,不要打兩個 \。

    2011-06-29 12:05:47 補充:

    expect

    "user="

    這兩行... expect 跟 "user=" 中間不能分行。

    否則就得加上大括號。

    2011-06-29 12:34:46 補充:

    extra characters after close-quote while executing

    ...

    (file "./a" line 4)

    請檢查你的檔案的第四行前後,是否有打錯東西。

    例如該空格沒空、引號、括號沒括好... 等等。

    2011-07-01 14:40:47 補充:

    有兩個可能

    1. 程式在執行到該行的時候已經結束

    2. 程式沒有正確 spawn

Still have questions? Get your answers by asking now.