2
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

我认为这是关于引用。当我将期望 -c " 更改为单引号期望 -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

')

这一次,如果通过是好的,它会成功,如果通过不正确,它不会。但是当通行证正确时,它会写入“错误通行证”阶段。它可以做什么所以如果通过正确它必须退出而不是继续。对不起我不熟悉期望及其语法

4

1 回答 1

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

'密码='"$密码"

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

于 2012-08-15T08:54:06.060 回答