0

我在我的 bash 脚本中使用了以下期望命令,以设置无密码 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 "xxxx"
expect "yyyy"

它也有效,所以我认为它没有进入那个块?解决方案是什么

4

1 回答 1

0

可能是在进行比赛之前,比赛已经结束或发生超时。即使没有找到匹配项,expect 也会返回并继续执行,发送密码。

在期望手册中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.

要解决这个问题,您应该将发送代码放在期望的正文中:

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"' 
     }
 }
 ')

希望这会有所帮助=)

于 2012-10-11T11:43:31.727 回答