我正在尝试在远程计算机上安装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}"
答案 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}"
这样做是什么
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