Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/flash/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 期望:“;缺少闭合大括号“;和发送命令失败_Bash_Shell_Ssh_Expect - Fatal编程技术网

Bash 期望:“;缺少闭合大括号“;和发送命令失败

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"

我正在尝试运行一个expect脚本,该脚本将SSHs发送到另一个本地设备以安装和运行python脚本。 所有变量都在脚本之外定义:

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代码。