2012-10-05 54 views
3

使用SSH連接我想要寫的應用程序,將與兩種類型的連接的一個自定義的SSH服務器:用於幀間應用通信

  • 的同步信道,在這裏客戶鍵入命令和服務器將返回輸出
  • 用戶連接並開始讀取IO的流通道,服務器連續發佈數據。

我這樣做在Java中,我認爲Apache Mina SSHD在正確的工具。我設法編寫了一些代碼進行身份驗證(感謝網絡上的資源),並且可以在我的連接上運行/ bin/sh,所以我都設置了我的猜測。問題在於,從現在開始我被卡住了,因爲缺乏關於這些東西是如何工作的知識以及Mina如何專門工作。

基本上我需要訪問每個SSH連接的輸入和輸出流,在那之後我可以理清事情我自己,買什麼來獲取正確的方式?

我應該做一個自定義頻道?一個自定義的Shell?一組自定義的命令?

可以在任何一個點我的資源,關於這個問題的?

+1

這並不完全回答你的問題,但我會以不同的方式處理。我會將SSH連接與應用程序分開。你有沒有想過爲你所說的兩個通道中的每一個打開一個端口,然後如果客戶端不能直接訪問這些端口,你可以讓它們通過ssh連接上的'-L'標誌通過ssh連接來通道這些端口命令? – bohney

+0

@bohney:+1。更簡單,更容易設置和維護。 – Axel

+0

不知道我明白,但我基本上是爲我們使用的第三方服務編寫模擬,所以我對建築選項有點限制。另外,我將它集成到Akka應用程序中(在scala中) – Alexandre

回答

2

我已經找到了解決辦法:

首先,你必須執行命令的工廠,這是如下完成:

class CommandFactory extends Factory[Command] { 

    override def create():Command = { 
    new Command() { 
     def destroy() {} 

     def setInputStream(in: InputStream) {} 

     def setErrorStream(err: OutputStream) {} 

     def setOutputStream(out: OutputStream) {} 

     def start(env: Environment) {} 

     def setExitCallback(callback: ExitCallback) {} 
    } 
    } 
} 

然後你建立這樣的SSH服務器:

sshd.setShellFactory(new CommandFactory()) 

當然,您可以擴展實現以將所需的任何內容傳遞給命令。

命令的執行中,可以定義你的shell的行爲。

+0

上發佈我的數據,這對我非常有幫助,謝謝! – Chris

+0

「當然,您可以擴展實現,將所需的任何內容傳遞給命令。」我如何實現這一點......我需要實現我自己的服裝命令。我成功地更新了我的代碼,直到用start和其他實現的方法創建一個Command類....我的疑問是如何捕獲在ssh連接中輸入的命令,並比較它是否是我的客戶命令,如果是,做必要的行動...請急需這個幫助 –

0

這是一個後續我的評論發佈到問題本身。

允許客戶端(客戶端)訪問直接或通過同一個網絡服務器(網關)通過SSH在另一臺計算機的遠程計算機(服務器)上的端口,你只需要使用-L標誌。

從客戶機到服務器直接(端口8080的客戶機上就會隧道80在服務器上):

ssh -L 8080:localhost:80 server 

從客戶機到服務器通過客戶機上的網關(端口8080將隧道80服務器)上:

ssh -L 8080:server:80 gateway 

從手冊頁的ssh,這裏是你如何使用-L標誌:

 -L [bind_address:]port:host:hostport 
     Specifies that the given port on the local (client) host is to be 
     forwarded to the given host and port on the remote side. This 
     works by allocating a socket to listen to port on the local side, 
     optionally bound to the specified bind_address. Whenever a 
     connection is made to this port, the connection is forwarded over 
     the secure channel, and a connection is made to host port 
     hostport from the remote machine. Port forwardings can also be 
     specified in the configuration file. IPv6 addresses can be 
     specified by enclosing the address in square brackets. Only the 
     superuser can forward privileged ports. By default, the local 
     port is bound in accordance with the GatewayPorts setting. 
     However, an explicit bind_address may be used to bind the 
     connection to a specific address. The bind_address of 
     ``localhost'' indicates that the listening port be bound for 
     local use only, while an empty address or `*' indicates that the 
     port should be available from all interfaces. 
+0

謝謝,但這並不能回答我的問題:我需要將輸入和輸出流作爲java緩衝區訪問,以便我可以編寫自己的命令和輸出流。我在服務器端的想法是讀取輸入,將其解釋爲命令,處理並在輸出中寫出答案。對於流版本,我不會閱讀輸入內容,只需在輸出 – Alexandre