为什么 'Expect' 即使在输出中出现预期模式后仍在等待?

Why 'Expect' is waiting even after the arrival of expected pattern in output?

我想使用自动命令远程更新我所有的电脑。这是我使用 '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###

等等...

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

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

因为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