我花了很多时间开发一个应用程序,它将使用JSch并通过ssh连接到远程机器来执行一些命令行操作。但是我了解到这些操作也可以在localhost上执行(我的应用程序在localhost上运行)。现在......我懒得重写所有的代码,说实话,我感觉很糟糕,因为我真的很依赖JSch。有没有办法欺骗JSch连接到localhost或者以某种方式告诉它只使用localhost,即使代码说不然? :)
P.S。如果不可能的话,为什么普通的Proccess类不支持setOutputStream和setErrStream,就像JSch一样,但只有getInputStream和getErrorStream?
答案 0 :(得分:4)
只要本地计算机运行SSH服务器(并且您的应用程序具有必要的登录凭据),您也可以使用JSch连接到本地计算机 - 只需指示localhost
(或{{1 }})作为连接的主机名。
127.0.0.1
或sudo
或su
等内容。)
JSch在相应的RunAs
方法之上实现setOutputStream
和setErrStream
- 它在内部使用类似于PipedInputStream的东西,并在这些流之间使用单独的线程来挖掘数据。 / p>
由于JSch是开源的,你可以简单地看看它是如何完成的(如果我没记错的话,在get...
类中),并将相关的方法复制到你的类中,为{{{{{{ 1}}。
有没有办法告诉JSch不要加密数据?
您可以使用Channel
密码,例如没有加密。默认情况下,在所有通用客户端和服务器中禁用此功能(因为它会破坏SSH的一半用途),但使用正确的配置可以启用它。在JSch中你可以使用
Process
(此配置选项是客户端支持的所有选项的列表 - 有关所有支持的值,请参阅the documentation of setConfig
。服务器通常会选择它也支持的此列表中的第一个。强制不加密(或取消连接),仅列出none
。)
我不知道如何在SSH服务器中启用它 - 阅读服务器的文档。 (如果可能的话,只为localhost启用它。)
建议使用它的方法是仅在身份验证后切换到session.setConfig("cipher.s2c", "none,..."); // server to client
session.setConfig("cipher.c2s", "none,..."); // client to server
密码(因此身份验证仍然是加密的),但对于localhost,这可能不是必需的。 (更改配置后,您可以使用none
切换密码(和密钥)。)