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
“)
这一次,如果传球是好的,它就会发挥作用,如果传球不正确则没有。但是当传球正确时,它会写出“错误的传球”阶段。它可以做什么,所以如果传递是正确的,它必须退出而不是继续。我不熟悉期望及其语法
答案 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参数可以包含混合引号。简单的例子
'口令=' “$密码”
并且您可以根据需要组合尽可能多的引号开关,只要两个不同的引号之间没有空格,它们都将被视为同一个单词或命令参数的一部分。