2011-07-21 142 views
5

我需要能夠從Java程序ssh到遠程服務器,並從那裏SSH到另一臺服務器。我有我的客戶端上的兩臺服務器的憑據。如何使用JSch SSH到另一個SSH服務器後面的服務器?

命令將作爲常規字符串(無用戶輸入)從應用程序內自動傳遞。我需要能夠在第二臺服務器上運行這些自定義命令,並能夠根據輸出和一些簡單的邏輯來確定在運行時發出什麼命令。

我可以使用JSch做到這一點,如果是的話,我應該從哪裏開始研究? (示例,信息)

========================================= ====================

新增:

異常線程 「main」 com.jcraft.jsch.JSchException: UnknownHostKey:主機。淨。 RSA密鑰指紋是'blahblahblah'

到目前爲止,我通過修改known_hosts文件並在其中手動添加主機來解決此問題。 我可以通過設置某個選項來繞過這個小問題,告訴JSch當這個YES-NO問題被詢問時自動按YES。

回答

10

要連接到防火牆後面的第二個服務器,原則上有兩個選項。

這個天真的應該是在第一臺服務器上(來自exec通道)調用ssh,指出正確的服務器。這需要使用JSch進行代理轉發,並且不提供JSch API來訪問第二臺服務器,而只提供ssh命令行。

更好的方法是使用到第一臺服務器的連接來建立TCP隧道,並使用此隧道連接到第二臺服務器。 JSch Wiki包含一個ProxySSH class(以及一些示例代碼),它允許將JSch會話用作第二個JSch會話的隧道。 (免責聲明:本課程主要由我撰寫,並得到了JSch作者的一些支持。)

當您連接到第二臺服務器時,請使用shell通道或一系列exec通道來執行您的命令。 (見Shell, Exec or Subsystem Channel在JSch維基的概述,以及Javadocs瞭解詳情。)


爲了您未知主機密鑰問題:

安全版本將收集所有主機密鑰(以安全的方式),然後將它們放入known_hosts文件中。 (如果你只是信任提供給你的密鑰,那麼你很容易受到中間人攻擊,如果你的網絡中沒有這個問題,那麼它是物理上安全的,對你有好處。)

方便版本設置configuration optionStrictHostKeyCheckingno - 這將未知的主機密鑰添加到主機密鑰文件:

JSch.setConfig("StrictHostKeyChecking", "no"); 

(您也可以將其設置單獨的會話,如果你只想設置爲代理會話而不是隧道會話,或者將其替換爲與yesaskask的隧道會話 - 那裏的MITM危險可能會更大。)

A 中間路徑可以實際詢問用戶(然後應該將指紋與某個列表進行比較) - 爲此,請執行UserInfo接口並將該對象提供給會話。 (該JSch維基包含example implementation using Swing JOptionPanes,而如果您的客戶端程序與GUI的系統上運行,你可以簡單地使用。)

對於接受主機密鑰的保存工作,你必須使用JSch.setKnownHosts方法與文件名參數,而不是帶有InputStream參數的那個 - 否則,每次重新啓動客戶端時都必須重複接受。

+0

工程太棒了!我可以使用同一個網關訪問該網關後面的兩個或更多不同的SSH服務器嗎? –

+0

nvm,是的,你可以。 –

+0

@Martin:是的,我以這種方式使用它(訪問隱藏在單個網關後面的大約23臺服務器)。 –