【问题标题】:Running commands over ssh with Java使用 Java 通过 ssh 运行命令
【发布时间】:2010-10-08 21:35:03
【问题描述】:

场景:我想通过 ssh 从 Java 程序在远程机器上运行命令(我在我的开发机器上使用 OpenSSH)。我还想通过传递密码来建立 ssh 连接,而不是像使用“期望”那样设置密钥。
问题:当尝试执行密码登录等“期望”时,使用 ProcessBuilder 创建的进程似乎看不到密码提示。当运行常规的非 ssh 命令(例如“ls”)时,我可以获得流并与它们进行很好的交互。我将标准错误和标准输出与redirectErrorStream(true); 组合到一个流中,因此我不会在标准错误中错过它...当我使用“-v”选项运行 ssh 时,我看到了流中的所有日志记录,但我看不到提示。这是我第一次尝试将 ProcessBuilder 用于这样的事情。我知道使用 Python、Perl 或良好的期望会更容易,但我的老板想利用我们试图在现有 Java 程序中取回的内容(远程日志文件和运行脚本),所以我有点卡住了。

提前感谢您的帮助!

【问题讨论】:

    标签: java ssh openssh


    【解决方案1】:

    提示可能仅在ssh 连接到 TTY 时显示,而在 Java 中则不会。

    可能有一种方法可以在您的ssh 应用程序的命令行中提供密码。这将是通过提示的方法。

    或者,考虑从本机 Java 代码直接连接到主机服务器,而不是运行外部应用程序。 a million libraries 可以做到这一点。

    【讨论】:

    • +2 代表交替,-1 代表不先去那里(称之为“交替”。网络仍然是 +1 :)
    • 我推荐 java 的 paramiko,巧妙地称为 jaramiko - lag.net/jaramiko。最初在 Python 中,已移植到 Java。当老板放手时,会更容易使用python版本:)
    【解决方案2】:

    与其使用外部 ssh 程序,不如使用 Java ssh 库:

    我在 google 上找到了两个 - 这将避免 openssh 将非常努力地阻止在 stdin 上输入密码的问题 - 它将直接打开终端。 expect 必须非常努力地模拟一个 tty 才能工作。

    【讨论】:

      【解决方案3】:

      为什么不使用 Java ssh 客户端? This 一个是 BSD 许可的,还有更多的客户端列出 here

      【讨论】:

        【解决方案4】:

        大多数具有安全意识的程序不使用标准输入/标准输出来捕获密码,它们会捕获 TTY 或其他等效方法。

        【讨论】:

          【解决方案5】:

          回应其他人使用 Java SSH 库的建议。但想评论科恩的回应。在建立连接时通过命令行发送密码是不安全的,并且许多 sshd 服务器也不允许(基于配置)。

          您可能希望为此设置密钥,以便无需密码即可在机器之间执行 ssh 命令。

          基本步骤 - 使用 openssh 创建密钥对(我已经完成了 RSA,但我知道现在有更好的方法) - 在 SOURCE 机器上的主文件夹中创建一个 .ssh 目录 - 在目标机器上的主文件夹中创建一个 .ssh 目录 - 将您的私钥保存在源计算机的 .ssh 文件夹中 - 将您的公钥复制到目标的 .ssh 文件夹中名为 authorized_keys 的文件中

          一些说明可以找到here

          【讨论】:

            【解决方案6】:

            您可以使用edtFTPj/PRO 运行命令,也可以通过 SFTP 执行文件传输。它是 Java。

            【讨论】:

              最近更新 更多