使用Java通过ssh运行命令

10
情境:我想从Java程序通过ssh在远程机器上运行命令(开发机器上使用OpenSSH)。 我还想通过传递密码而不是像“expect”一样设置密钥来建立ssh连接。 问题:尝试执行类似于“expect”的密码登录时,使用ProcessBuilder创建的进程似乎无法看到密码提示符。 当运行常规非ssh命令(例如'ls')时,我可以很好地获取流并与其交互。 我正在将标准错误和标准输出合并为一个流,并且使用redirectErrorStream(true);进行操作,因此在标准错误中不会错过它...当我使用'-v'选项运行ssh时,我可以在流中看到所有日志记录,但我没有看到提示符。 这是我第一次尝试像这样使用ProcessBuilder。 我知道使用Python、Perl或好老的expect会更容易,但我的老板希望在现有的Java程序中利用我们要获取的内容(远程日志文件和运行脚本),所以我有点困扰。
谢谢您的帮助!
6个回答

10

当使用ssh连接到TTY时,提示可能仅会显示,但在Java的情况下不是这样。

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

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


2
对于“交替”(称之为“alternately”),加2分;如果不先去那里(称之为“alternately”),则扣1分。但是,Net仍然是+1分 :) - Bill K
我推荐使用 Paramiko for Java,其巧妙命名为 Jaramiko - http://www.lag.net/jaramiko/。它最初是 Python 编写的,已经被移植到了 Java 上。当老板松口后,这将使得使用 Python 版本变得更加容易 :) - popcnt

7
不要使用外部ssh程序,为什么不使用Java ssh库: 这是我在谷歌上找到的两个库,它们可以避免openssh会很努力地防止在stdin上输入密码的问题 - 它将直接打开终端。expect必须非常努力地模拟一个tty才能工作。

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

2

大多数安全意识较高的程序不使用stdin/stdout来捕获密码,而是捕获TTY或一些等效方法。


1
回应其他人的建议,使用Java SSH库。但是想评论一下Cohen的回复。在建立连接时通过命令行发送密码是不安全的,也不被许多sshd服务器允许(基于配置)。
您可能需要考虑为此设置密钥,以便可以在机器之间执行ssh命令而无需密码。
基本步骤: - 使用openssh创建密钥对(我已经做了RSA,但现在有更好的方法) - 在源机器的主文件夹中创建一个名为.ssh的目录 - 在目标机器的主文件夹中创建一个名为.ssh的目录 - 将私钥保存在源机器的.ssh文件夹中 - 将公钥复制到名为authorized_keys的文件中,放在目标机器的.ssh文件夹中
一些说明可以在这里找到。

0
你可以使用edtFTPj/PRO运行命令,同时通过SFTP进行文件传输。这是Java语言编写的。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接