使用Java在ssh上运行命令

时间:2009-02-20 17:14:55

标签: java ssh openssh

Scenerio:我想通过ssh从Java程序在远程机器上运行命令(我在开发机器上使用OpenSSH)。我也想通过传递密码而不是按照'期望'设置密钥来建立ssh连接 问题:当尝试执行'expect'之类的密码登录时,使用ProcessBuilder创建的Process似乎看不到密码提示。当运行常规的非ssh命令(例如'ls')时,我可以获得流并与它们进行交互就好了。我将标准错误和标准输出合并到一个带有redirectErrorStream(true);的流中,所以我没有错过标准错误...当我使用'-v'选项运行ssh时,我看到流中的所有日志记录但我没有看到提示。这是我第一次尝试使用ProcessBuilder这样的东西。我知道使用Python,Perl或者好的OL会更容易,但是我的老板想在现有的Java程序中利用我们想要的东西(远程日志文件和运行脚本),所以我有点卡住了。 / p>

提前感谢您的帮助!

9 个答案:

答案 0 :(得分:11)

只有在ssh连接到TTY时才会显示提示,而不是Java。

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

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

答案 1 :(得分:7)

为什么不使用Java ssh库,而不是使用外部ssh程序:

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

答案 2 :(得分:6)

plug:请参阅使用this

在ssh上执行命令的sshj示例

答案 3 :(得分:4)

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

答案 4 :(得分:2)

大多数具有安全意识的程序不使用stdin / stdout来捕获密码,它们捕获TTY或某种等效方法。

答案 5 :(得分:1)

我使用了trilead ssh客户端取得了很大的成功。我也尝试过jsch(另一个java ssh客户端)并隧道到linux下的本机ssh客户端。 Trilead是迄今为止最好的。

答案 6 :(得分:1)

看一下最近发布的SSHD,它基于Apache MINA项目。

答案 7 :(得分:1)

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

您可能需要考虑为此设置密钥,因此您可以在没有密码的情况下在计算机之间执行ssh命令。

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

可以找到一些说明here

答案 8 :(得分:0)

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