在SSH之后使用Expect

时间:2018-01-18 15:19:50

标签: bash expect

我正在尝试在远程计算机上安装pkg文件。在ssh中使用expect时遇到问题。使用实际密码或变量$ pass

时无法传递密码
#!/bin/bash
agentpath="/Users/vigneshganapathy/Downloads/FS-Agent"
pass="xxx"
expect -c "spawn ssh -o StrictHostKeyChecking=no shyamkarthikv@192.168.57.33
      expect \"*?assword:\" {send \"$pass\r\"; exp_continue}
      spawn sudo installer -pkg \"/tmp/FS-Agent/FS-Agent.pkg\" -target \"/\"
      expect \"*?assword:\" {send \"xxx/r\"; exp_continue}"

2 个答案:

答案 0 :(得分:1)

这对我来说看起来不像是一个正确的期望脚本。一般来说,使用expect脚本而不是试图将它全部放在参数中是一个好主意。

spawn ssh -o StrictHostKeyChecking=no shyamkarthikv@192.168.57.33
expect \"*?assword:\" 
{send \"$pass\r\"; exp_continue}
spawn sudo installer -pkg \"/tmp/FS-Agent/FS-Agent.pkg\" -target \"/\"
expect \"*?assword:\" 
{send \"xxx/r\"; exp_continue}"

这样做是什么

  • 在192.168.57.33
  • 上启动ssh-session
  • 在本地计算机上启动sudo installer

这几乎肯定不是你想要的。我认为你想要的是:

#!/usr/bin/expect

eval spawn ssh -o StrictHostKeyChecking=no shyamkarthikv@192.168.57.33
expect "ord:"
send "$env(PASSWORD)\r";
expect "~"
send "sudo installer -pkg /tmp/FS-Agent/FS-Agent.pkg -target /\r"
expect "ord:"
send "$env(PASSWORD)\r";

确保在调用shell中导出变量PASSWORD

答案 1 :(得分:1)

here- documents是将来自另一种语言的代码嵌入到shell脚本中的好方法:引用heredoc单词(expect <<'END_EXPECT'),单引号整个文档。这使您无需逃避一切。

我使用环境将变量从shell传递给expect

我假设您要在远程主机上执行“installer”命令,在这种情况下,您希望send不是spawn它。

#!/bin/bash
agentpath="/Users/vigneshganapathy/Downloads/FS-Agent"
export pass="xxx"

expect <<'END_EXPECT'
    spawn ssh -o StrictHostKeyChecking=no shyamkarthikv@192.168.57.33
    expect { 
        "*?assword:" {
            send "$env(pass)\r"
            exp_continue
        }
        somePatternThatMatchesYourPrompt
    }
    set timeout -1  ;# in case it takes a long time to complete
    send "sudo installer -pkg /tmp/FS-Agent/FS-Agent.pkg -target / \r"
    expect { 
        "*?assword:" {
            send "$env(pass)\r"
            exp_continue
        }
        somePatternThatMatchesYourPrompt
    }
    set timeout 2
    send "exit\r"
    expect eof
END_EXPECT