希望在bash中对ssh密码进行异常处理
代码在我的bash脚本中的一个函数中工作。当密码错误时,我需要一个异常。我的方式是希望在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 ") #
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
')