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