我想远程使用自动命令更新我的所有电脑。这是我的代码使用' 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脚本。有可能吗?
答案 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