期望在bash中对ssh密码进行异常处理

时间:2012-08-15 08:39:35

标签: bash shell 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\";  
     send -- "\r"
     expect eof
    ")

#echo "$VAR"

代码在我的bash脚本函数中运行。当密码错误时我需要一个例外。我的方式是;

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."
     send user "Wrong pass"
     exit
     send -- "\r"
     expect eof
    ")

#echo "$VAR"

但它给出了错误

couldn't read file "denied,": no such file or directory

我认为这是关于quotoing。当我将expect -c“更改为单引号期望-c'时,这次它给出了无法找到$ SSH_KEY_PATH_PUB的错误,因为它是script.SO中的一个变量。我认为它去了超出范围。解决方案是什么

编辑:好的这次最好有单引号并且它有效。但if if子句可以做什么;

 AR=$(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."
 send user "Wrong pass"
 exit
 send -- "\r"
 expect eof

“)

这一次,如果传球是好的,它就会发挥作用,如果传球不正确则没有。但是当传球正确时,它会写出“错误的传球”阶段。它可以做什么,所以如果传递是正确的,它必须退出而不是继续。我不熟悉期望及其语法

1 个答案:

答案 0 :(得分:2)

您需要转义“字符串中的字符

”的其他用法
AR=$(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.\"
    send user \"Wrong pass\"
    exit
    send -- \"\r\"
    expect eof
")

或者您可以切换到使用单引号,但是您需要退出引号以扩展变量

 AR=$(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."
    send user "Wrong pass"
    exit
    send -- "\r"
    expect eof
')

基本上,在单个命令参数中切换用于引用命令的引用类型。这是有效的,因为bash word参数可以包含混合引号。简单的例子

'口令=' “$密码”

并且您可以根据需要组合尽可能多的引号开关,只要两个不同的引号之间没有空格,它们都将被视为同一个单词或命令参数的一部分。