期望bash表达式出错

时间:2012-10-11 08:36:24

标签: bash ssh expect

我在我的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"

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

1 个答案:

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

希望这有助于=)