为什么'期待'即使在产量预期模式到来之后还在等待?

时间:2015-10-01 05:03:24

标签: remote-access expect

我想远程使用自动命令更新我的所有电脑。这是我的代码使用' expect'脚本:

#!/usr/bin/expect -f

set pa "paswoord"
set n1 "user1"
set n2 "user2"

set timeout 2400
spawn ssh $n1@node1
expect "password:"
send -- "$pa\r"
expect "$"
send -- "echo $pa | sudo -S apt-get dist-upgrade -y\r"
expect "$"
send -- "sudo apt-get update && sudo apt-get upgrade -y\r"
expect "$"
send -- "sudo apt-get autoremove -y\r"
expect "$"
send -- "exit\r"
expect eof
###END OF node1###

set timeout 2400
spawn ssh $n2@node2
expect "password:"
send -- "$pa\r"
expect "$"
send -- "echo $pa | sudo -S apt-get dist-upgrade -y\r"
expect "$"
send -- "sudo apt-get update && sudo apt-get upgrade -y\r"
expect "$"
send -- "sudo apt-get autoremove -y\r"
expect "$"
send -- "exit\r"
expect eof
###END OF node2###

依旧......

问题是如果我使用超时= 2400,我将不得不等待很长时间才能完成。如果我使用更短的超时,那么'期望'不等命令完成。

我想要期待'在上一个命令完成后立即运行下一个命令,如bash脚本。有可能吗?

1 个答案:

答案 0 :(得分:2)

这是因为expect "$"错了。如果您想匹配文字美元符号,则必须使用

expect "\\\$"

将与文字美元符号相匹配。

顺便说一下,你可以创建一个程序

proc startUpgrade {user host} {
    spawn ssh $user@$host
    expect "password:"
    send -- "$pa\r"
    expect "\\\$"
    send -- "echo $pa | sudo -S apt-get dist-upgrade -y\r"
    expect "\\\$"
    send -- "sudo apt-get update && sudo apt-get upgrade -y\r"
    expect "\\\$"
    send -- "sudo apt-get autoremove -y\r"
    expect "\\\$"
    send -- "exit\r"
    expect eof
}

startUpgrade "dinesh" "xxx.xx.xx.xxx"

或者,要匹配一些常见的已知提示,您可以定义类似

的变量
set prompt "#|>|:|\\\$"; # We escaped the `$` symbol with backslash to match literal '$'

使用expect时,我们必须附带-re标志,以指定它作为正则表达式。

expect -re $prompt