2017-08-02 63 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讓你留在目前的預期命令,並繼續尋找其他的模式。你確實需要別的東西來期望讓你突圍。

相關問題