1

我想使用 Tcl/expect 自动执行以下交互,脚本启动并且什么也不做期望命令不能期望命令的所有输出

#!/usr/bin/expect

set timeout 10
set user username1
set password password@123

spawn  ssh $user@10.100.55.33
expect "Password:"
send "$password\r"
expect eof
send "cv mk ghassan-test-5\r"
sleep 45
expect "ok" { send "cv set ghassan-test-5\r" }
sleep 20
expect -gl "Ok" { send "cv rbset ghassan-test-5\r" }
expect eof
sleep 20
expect -gl "Ok" { send "cv ls\r" }
sleep 10
expect eof
send "exit\r

send "cv mk ghassan-test-5\r"命令运行,输出如下

$ cv mk ghassan-test-4
数据库正在写入磁盘,请稍候。
写入数据库文件可能需要几分钟...
行

下一个命令没有运行,没想到“ ok

expect "ok" { send "cv set ghassan-test-5\r" }

但如果我期望minutes它运行

expect "minutes" { send "cv set ghassan-test-5\r" }

" ok" 输出需要一分钟才能显示

请任何人有同样的问题请帮助我

4

1 回答 1

1

expect "somepattern" {somecommands} "anotherpattern" {othercommands}如果您在超时之前收到相应的模式,则只会运行其中一个脚本。如果发生超时并且您没有脚本,则不会执行任何操作。设置timeout为 -1 以无限期等待,或执行以下操作:

set timeout 300
...
expect {
  "ok" {
    send "cv set ghassan-test-5\r"
  }
  timeout {
    error "This is taking too long!"
  }
}

这些解决方案都不会处理意外的 EOF。您可能也应该为此添加一个模式脚本。http://www.tcl.tk/man/expect5.31/expect.1.html

PS:我认为您的睡眠命令是不必要的,您的expect eof命令也是如此(它们可能只是超时)。

于 2013-05-05T16:12:55.510 回答