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

希望在bash中对ssh密码进行异常处理,bash,shell,expect,Bash,Shell,Expect,代码在我的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\"; send -- "\r" expect eof ") #

代码在我的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\";  
     send -- "\r"
     expect eof
    ")

#echo "$VAR"
但它给出了错误

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"
我认为这是关于引用的。当我将expect-c“改为单引号expect-c”时,这一次出现了找不到$SSH_KEY_PATH_PUB的错误,因为它是脚本中的一个变量。因此我认为它超出了范围。解决方案是什么

编辑:好的,这一次最好是单引号,它可以工作。但它可以做什么,如果条款

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


这一次,如果pass正确,它就可以完成任务,如果pass不正确,它就不能完成任务。但是当pass正确时,它会写入“错误的pass”阶段。如果pass正确,它必须退出,而不能继续。很抱歉,我不熟悉expect及其语法。您需要退出expect的其他用法字符串中的字符

 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参数可以包含引号的组合。简单例子

'密码='“$password”

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

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