调用从shell脚本expectscript:
expect "/copySSHKey.exp <machine> <password> </.ssh/id_rsa.pub path>"
Expect脚本:
#!/usr/bin/expect -f
set machine [lrange $argv 0 0]
set ip [lrange $argv 1 1]
set pass [lrange $argv 2 2]
set path [lrange $argv 3 3]
set timeout -1
spawn ssh-keygen -R ${machine}
spawn ssh-copy-id -i ${path} [email protected]${machine}
match_max 100000
expect {
sleep 10
"password" {
send -- "$pass\r"
send -- "\r"
sleep 1
send_user " SSH key copied to $machine\n"
}
"$machine's" {
send_user " SSH key copied to $machine\n"
}
"password:*" {
send -- "$pass\r"
send -- "\r"
sleep 1
send_user " SSH key copied to $machine\n"
}
"machine" {
sleep 1
send_user " SSH key copied to $machine\n"
}
}
interact
你能澄清你的意思吗(re:“只有stdout的结尾被记录,而不是所有的stdout”)?什么exac tly在你的输出中,你期望*在你的输出中有什么,你如何检查? (通常,人们会使用'echo $ result'来模糊实际内容)。 –
如果我写: echo $ result 只显示最后一行的一部分。 – 77140B
'declare -p result'通常是查看变量实际内容的更好方法 - echo有很多方法可以搞砸。如果有隐藏字符混淆的可能性,'printf'%q \ n'“$ result”'同样是一个改进。但是,如果您*要*使用'echo',至少应避免忽略引号:'echo“$ result”',而不是'echo $ result'。 –