【问题标题】:Can I use Jsch to fake ssh connection to the localhost?我可以使用 Jsch 伪造到 localhost 的 ssh 连接吗?
【发布时间】:2011-08-21 00:03:46
【问题描述】:

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

附:万一不可能,为什么常规的Proccess类不支持像JSch那样的setOutputStream和setErrStream,而只支持getInputStream和getErrorStream??

【问题讨论】:

    标签: java ssh jsch


    【解决方案1】:

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

    不过,这会产生一些开销,因为您正在加密和解密所有数据,而在本地执行某些命令并不是真正需要的。 (另一方面,这将允许您以其他用户的身份运行命令,否则您需要在 Windows 下使用 sudosuRunAs 之类的东西。)

    JSch 在相应的 get... 方法之上实现了 setOutputStreamsetErrStream - 它在内部使用类似于 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 服务器中启用此功能 - 请阅读您服务器的文档。 (如果可能,请仅对 localhost 启用它。)

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

    【讨论】:

    • 有没有办法告诉JSch不要加密数据?
    • 我意识到 ssh 是用来加密的,但仍然
    • @Martin:我添加了一些关于无密码的东西。
    • 谢谢。你认为我想要做的是一个不好的做法吗?意思是我应该重写代码而不是 ssh-ing 到 localhost?
    • 仅当您向 SSH 服务器添加依赖项(以及一些不那么安全的设置)时,这是一种不好的做法。另一方面,它允许您非常轻松地切换到远程访问。我会尝试将 setOutputStream 方法从 JSch 克隆到 Process,以便能够重用与您的 JSch 频道交互时使用的相同代码。
    最近更新 更多