2014-09-10 58 views
2

對於我正在使用的服務器技術,可以通過運行一些命令行參數手動將服務器加入集合。在某一時刻,控制檯會提示您是否要接受證書鏈,並輸入(y/n)並且該命令一直運行。我試圖自動化這個過程,但是我在響應輸入提示時碰到了一個障礙,並且在四處探聽之後聽說它可能是一個SSL事件,所以我不知道是否有不同的方式來做到這一點。如何獲取控制檯輸入以在bash腳本中使用SSL?

如果你做手工,這是它的外觀:

Joining the collective with target controller ...this may take a while 
SSL trust has not been established with the target server 
//certificate chain 
Do you want to accept the above certificate chain? (y/n) 

然而,既:

echo "y y" | bash ./script.sh 

//inside script.sh 
echo "y y" | $(command) 

結束了這種反應:

Joining the collective with target controller ...this may take a while 
SSL trust has not been established with the target server 
//certificate chain 

Input console is not available 

Aborting join collective. 

Error: 
Unable to complete the MBean operation 
Error: java.securit.cert.CertificateException: User has rejected the request to trust the 
certificate chain 

我希望有人或許能夠通過手動迴應的方式來做到這一點

回答

4

錯誤Input console is not available表明目標程序期望與真實終端通信,而不是管道(如果您嘗試將echo加入到程序中,您會得到這個結果)。

在這種情況下,您將使用類似expect的模擬真實終端(使用僞tty)的方式自動執行該程序,並且通常可以「欺騙」這樣的程序,使其相信它們正在與實際的終端進行通信。 expect將讓你輸入任意命令到程序中。

有關如何使用Expect(此處用於自動執行ssh)的示例,請參閱Bash/Expect Script for SSH

+0

我看,我假設有這樣做,則沒有原生的方式?我的限制相當嚴格,我必須編寫一個腳本,可以在「開箱即用」的機器上運行,謝謝你的解釋,儘管 – sreya 2014-09-10 18:51:09

+0

不幸的是,沒有。沒有很好的,相對便攜的使用我知道的純bash使用ptys。 – nneonneo 2014-09-10 18:53:20

+0

或者遠程命令可能不期望一個真正的終端,但你的SSH不分配tty。您可以使用選項「-t」強制執行僞tty分配 – mcoolive 2014-09-10 23:15:06

1

下面是一個基本expect例如,應該工作,每@nneonneo:

#!/usr/bin/expect 

set timeout 600 
spawn -noecho /path/to/script.sh 
expect { 
    (y/n) { 
    send -- "y\n" 
    exp_continue 
    } 
    timeout { 
    exit 1 
    } 
    eof { 
    catch wait result 
    exit [lindex $result 3] 
    } 
} 
0

我假設你正在使用WebSphere自由作爲您的服務器技術,因爲輸出是我的安裝了。反正你需要把關鍵參數是--autoAcceptCertificates

例如:

collective join defaultServer --host=controller \ 
    --port=9443 \ 
    --keystorePassword=memberPassword \ 
    --user=adminUser \ 
    --password=adminPassword \ 
    --autoAcceptCertificates 
相關問題