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
我认为这是关于引用的。当我将expect -c "更改为单引号expect -c '时,这次它给出错误,找不到$SSH_KEY_PATH_PUB,因为它是脚本中的一个变量。所以我认为它是这样的超出范围。解决方案是什么
编辑:好的,这次最好使用单引号并且它可以工作。但是 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
')
这一次,如果通过正确,则可以完成工作,如果通过不正确,则不能完成工作。但是当传递正确时,它会写入“错误传递”阶段。它可以做什么,所以如果传递正确,它必须退出而不是继续。抱歉,我不熟悉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 单词参数可以包含混合的引号。简单的例子
'密码='"$密码"
您可以根据需要组合任意数量的引号开关,只要两个不同的引号之间没有空格,它们都会被视为同一单词或命令参数的一部分。
关于bash - 期望在 bash 中对 ssh 密码进行异常处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11966305/