2017-08-02 56 views
2

我试图使用bash脚本将密码发送到远程服务器。这工作得很好,直到我们被要求将密码更改为更复杂的密码,并且其中一个新密码包括$字符(即[email protected]$sw0rd)。

我已经包含了片段,不再工作:

password="'[email protected]$sw0rd'" 

spawn ssh "[email protected]$device" 
expect { 
    "*no)?" {send "yes\r"} 
    "*assword:" {send "$password\r"} 
    "*assword:" {send "$password\r"} 
} 

发送密码时,都会在远程系统试图找到变量$sw0rd

我知道这个问题是可以在密码中的字符$,但有没有办法做到这一点不改变我们所有的远程服务器上的这一个密码,一个不包括$人物?

我已经尝试了不同的方式来存储$字符:

password='[email protected]$sw0rd' 
[email protected]$sw0rd 
password="'[email protected]\$sw0rd'" 
password="[email protected]\$sw0rd" 
password='[email protected]\$sw0rd' 
[email protected]\$sw0rd 

这些都没有工作。

请帮忙。

+0

听起来像它可能是一个**远程系统的问题** –

+1

你可以包含更多的代码?如果你的代码实际上是'password =“无论如何”;期待<< eof; spawn ssh“$ deviceType @ $ device”; ...;那么这会产生巨大的差异。目前代码似乎部分是Bash和部分TCL,因此不能运行或代表问题。 –

回答

4

当您使用spawn命令时,您可能实际上有expect脚本而不是bash脚本。这应该在expect工作:

set password [email protected]\$sw0rd 

当然,你也可以选择使用expect来运行该脚本,或者通过在顶部加入#!/usr/bin/env expect或直接在终端使用expectexpect <SCRIPT>

+0

或者,使用Tcl的非插值引号:'set password {P @ $ sw0rd}' –

0

@ArkadiuszDrabczyk有你回答。

您需要使用exp_continue让您的登录工作,虽然:

spawn ssh "[email protected]$device" 
expect { 
    "*no)?" {send "yes\r"; exp_continue} 
    "*assword:" {send "$password\r"; exp_continue} 
    "*your prompt pattern here" 
} 
# ... carry on with the script 

exp_continue让你留在目前的预期命令,并继续寻找其他的模式。你确实需要别的东西来期望让你突围。

相关问题