2011-08-18 44 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:我添加了一些关于非密码的东西。 –

相关问题