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

标签 bash shell expect

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/

相关文章:

bash - 如何将由不同分隔符分隔的两个不同列提取到同一行中

linux - 从另一个文件添加列

shell - sed 括号表达式和捕获组

linux - 无法从 bash 运行 Expect 脚本

bash,从午夜开始以毫秒为单位获取当前时间

Python子进程: Unable to Escape Quotes

algorithm - 是否可以使用统一差异来推断编辑距离?

Bash - sed 替换文本

linux - 如何知道进程是否正在等待 stdin?

java - 如何使用 ExpectJ 工具在 java 代码中运行 Unix shell 脚本?