我在我的bash脚本中使用了以下expect命令来设置无密码ssh连接。
VAR=$(expect -c '
spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP "'
expect "*?assword:*"
send "'"$REMOTE_HOST_PASSWD"'\r";
expect {
"Permission denied, please try again." {
exit '"$WRONG_PASSWORD"'
}
}
')
我希望密码字符串为“?assword:”以便发送密码。但是,无论我为expect块写什么,它都可以工作。如果我写的话
expect "xxxx"
expect "yyyy"
它也有效,所以我认为它不会进入那个块?。解决方案是什么
答案 0 :(得分:1)
可能是在匹配之前,它到达蒸汽结束或发生超时。即使找不到匹配项,期望返回并继续执行,发送密码。
在期望手册的COMMAND
下,我们有一个解释expect
命令的部分:
waits until one of the patterns matches the output of a spawned process, a
specified time period has passed, or an end-of-file is seen.
要解决此问题,您应该将发送代码放在expect的正文中:
VAR=$(expect -c '
spawn ssh-copy-id -i '"$SSH_KEY_PATH_PUB $REMOTE_HOST_USER@$REMOTE_HOST_IP "'
expect "*?assword:*" {
send "'"$REMOTE_HOST_PASSWD"'\r"
}
expect {
"Permission denied, please try again." {
exit '"$WRONG_PASSWORD"'
}
}
')
希望这有助于=)