2011-08-18 78 views
0

我花了很多時間開發一個應用程序,它將使用JSch並通過ssh連接到遠程機器來執行一些命令行操作。但是我瞭解到這些操作也可以在本地主機上執行(我的應用程序在本地主機上運行)。現在......我懶得重寫所有的代碼,說實話我感覺不好,因爲我真的很重視JSch。有沒有一種方法可以讓JSch連接到本地主機,或者以某種方式告訴它只是使用本地主機,即使代碼另有說明? :)我可以使用Jsch僞造ssh連接到本地主機嗎?

P.S.如果不可能,常規的Proccess類怎麼不支持像JSch那樣的setOutputStream和setErrStream,但只有getInputStream和getErrorStream?

回答

4

只要你的本地機器有一臺運行SSH服務器(和你的應用程序有必要的登錄憑據),您可以使用JSch連接到本地計算機,太 - 只是表明localhost(或127.0.0.1)作爲主機名爲連接。

雖然這會產生一些開銷,因爲您正在加密和解密所有數據,而這在本地執行某些命令並不是必須的。 (在另一方面,這將允許您以其他用戶,對此你,否則將需要在Windows下像sudosu,或者RunAs運行命令。)

JSch上的頂部實現setOutputStreamsetErrStream相應的get...方法 - 它在內部使用類似於PipedInputStream的東西,以及在這些流之間鏟取數據的獨立線程。

由於JSch是開源的,你可以簡單地看一下如何做到這一點(在Channel類,如果我沒記錯的話),並複製相關的方法向類中做同樣的事情了Process

有沒有辦法告訴JSch不要加密數據?

您可以使用none密碼,例如,沒有加密。這在所有通用客戶端和服務器上都是禁用的(因爲它違背了SSH的一半目的),但通過正確的配置,您可以啓用它。在JSch你可以使用

session.setConfig("cipher.s2c", "none,..."); // server to client 
session.setConfig("cipher.c2s", "none,..."); // client to server 

(這個配置選項的客戶端支持所有選項的列表 - 見the documentation of setConfig所有受支持的值,服務器通常會選擇這個名單,它也支持的第一個。強制不加密(或取消連接),僅列表none。)

我不知道如何在SSH服務器中啓用此功能 - 請閱讀服務器的文檔。 (並且如果可能的話,僅對本地主機啓用它。)

推薦使用它的方式是僅在認證後切換到none密碼(因此認證仍然是加密的),但對於本地主機,這可能不是必需的。 (您可以使用session.rekey()在更改配置後切換密碼(和密鑰)。)

+0

有沒有辦法告訴JSch不要加密數據? –

+0

我意識到ssh是爲了加密,但仍然 –

+0

@Martin:我添加了一些關於非密碼的東西。 –

相關問題