10

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

在此先感谢您的帮助!

4

6 回答 6

10

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

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

或者,考虑从本机 Java 代码直接连接到主机服务器,而不是运行外部应用程序。有一百万个图书馆可以做到这一点。

于 2009-02-20T17:17:29.267 回答
7

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

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

于 2009-02-20T17:22:22.250 回答
4

为什么不使用 Java ssh 客户端?这个是 BSD 许可的,这里列出了更多的客户端。

于 2009-02-20T17:25:01.557 回答
2

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

于 2009-02-20T17:18:19.203 回答
1

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

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

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

一些说明可以在这里找到

于 2011-05-06T18:26:06.670 回答
0

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

于 2009-06-09T09:52:46.707 回答