Bash 期望:“;缺少闭合大括号“;和发送命令失败
我正在尝试运行一个expect脚本,该脚本将SSHs发送到另一个本地设备以安装和运行python脚本。 所有变量都在脚本之外定义:Bash 期望:“;缺少闭合大括号“;和发送命令失败,bash,shell,ssh,expect,Bash,Shell,Ssh,Expect,我正在尝试运行一个expect脚本,该脚本将SSHs发送到另一个本地设备以安装和运行python脚本。 所有变量都在脚本之外定义: set prompt "$SSHuser@$SSHname:~$" spawn ssh -o \"StrictHostKeyChecking no\" $SSHuser@$SSHhost expect { "*assword" { send "$SSHpassword\r"
set prompt "$SSHuser@$SSHname:~$"
spawn ssh -o \"StrictHostKeyChecking no\" $SSHuser@$SSHhost
expect
{
"*assword"
{
send "$SSHpassword\r"
exp_continue
}
"$prompt"
{
send "sudo su"
expect
{
"*assword"
{
send "$SSHpassword\r"
exp_continue
}
"$prompt"
{
send "apt update && apt upgrade -y && apt install net-tools -y && apt install python3-pip -y"
expect "$prompt"
{
send "wget -O script.py https://SOMEURL"
}
}
}
}
}
但是,我不断得到以下输出/错误:
missing close-brace
while executing
"{"
couldn't read file "sur
expect
{
*assword
{
send REDACTEDPASSWORD
exp_continue
}
{
send -- apt": no such file or directory
spawn ssh -o StrictHostKeyChecking no USERNAME@192.168.1.173
USERNAME@192.168.1.173's password:
我已经计算了括号并使用了突出显示工具,我没有看到任何缺少的括号。
我也不明白为什么它一直把“send”sudo su\r“读作“sur”。
我的预期敞口仍然相当有限。
如果您能帮助我理解这里出了什么问题,我将不胜感激。Tcl强制您使用,因为换行符是命令终止符
作为注释,expect代码不必嵌套得太深
set prompt "$SSHuser@$SSHname:~$"
spawn ssh -o "StrictHostKeyChecking no" $SSHuser@$SSHhost
expect {
"*assword" {
send "$SSHpassword\r"
exp_continue
}
"$prompt"
}
send "sudo su"
expect {
"*assword" {
send "$SSHpassword\r"
exp_continue
}
"$prompt"
}
send "apt update && apt upgrade -y && apt install net-tools -y && apt install python3-pip -y"
expect "$prompt"
send "wget -O script.py https://SOMEURL\r"
expect "$prompt"
# assuming you want to exit here
send "exit\r"
expect eof
本质上,每个spawn或send后面都应该有一个expect。在
expect
行的末尾需要一个反斜杠,这样下一行就被视为同一个命令的一部分。有关如何解析tcl的详细信息,请参阅。我不确定是否可以嵌套expect
这样的调用,但总体上我对tcl比较熟悉您是否考虑过使用ansible?有一些ansible模块,如expect或apt。使用ansible,您可以使用ssh连接在远程计算机上执行python脚本。如果您使用ssh公钥身份验证并正确设置sudo,则无需再使用expect
。查看我的,您可以使用它来rite Expect脚本仅包含shell代码。