使用 Java 通过 ssh 运行命令

Posted

技术标签:

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

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

提前感谢您的帮助!

【问题讨论】:

【参考方案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 库:

Trilead JTA

我在 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。

【讨论】:

以上是关于使用 Java 通过 ssh 运行命令的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Java 在远程系统上运行 SSH 命令? [关闭]

使用 JSch 通过 SSH 运行命令

Python 子进程 - 通过 SSH 运行多个 shell 命令

nohup 后台运行命令

通过 ssh 连接到远程并使用 expect 运行 git 命令

通过远程 ssh 运行完整命令 [重复]