1

我花了很多时间开发一个应用程序,该应用程序将使用 JSch 并通过 ssh 连接到远程机器以执行一些命令行操作。但是我了解到这些操作也可以在本地主机上执行(我的应用程序在本地主机上运行)。现在......我懒得重写所有代码,老实说,我感觉很糟糕,因为我真的很喜欢 JSch。有没有办法欺骗 JSch 连接到 localhost 或者以某种方式告诉它只使用 localhost 即使代码另有说明?:)

PS如果不可能,为什么常规的Proccess类不支持像JSch那样的setOutputStream和setErrStream,而只支持getInputStream和getErrorStream?

4

1 回答 1

6

只要您的本地计算机运行着 SSH 服务器(并且您的应用程序具有必要的登录凭据),您也可以使用 JSch 连接到您的本地计算机 - 只需将localhost(或127.0.0.1) 指示为连接的主机名。

但是,这会产生一些开销,因为您正在加密和解密所有数据,这对于在本地执行某些命令并不是真正必要的。(另一方面,这将允许您以另一个用户的身份运行命令,否则您将需要类似sudoorsuRunAsWindows 下的东西。)

JSch在相应的方法之上实现了setOutputStreamand ——它在内部使用类似于 PipedInputStream 的东西和一个在这些流之间铲起数据的单独线程。setErrStreamget...

由于 JSch 是开源的,您可以简单地查看这是如何完成的(在Channel课堂上,如果我没记错的话),然后将相关方法复制到您的类中,该类对Process.

有没有办法告诉 JSch 不要加密数据?

您可以使用none密码,例如不加密。这在所有通用客户端和服务器中默认禁用(因为它破坏了 SSH 的一半用途),但通过正确的配置,您可以启用它。在 JSch 你可以使用

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

(此配置选项是客户端支持的所有选项的列表 - 请参阅文档以setConfig获取所有支持的值。服务器通常会选择它也支持的列表中的第一个。强制不加密(或取消连接),仅列出none。)

我不知道如何在 SSH 服务器中启用此功能 - 请阅读您的服务器文档。(如果可能,仅对 localhost 启用它。)

使用它的推荐方法是仅在身份验证后才切换到none密码(因此身份验证仍然是加密的),但对于 localhost 这可能不是必需的。(您可以session.rekey()在更改配置后使用来切换密码(和密钥)。)

于 2011-08-18T13:28:27.447 回答