使用Java在ssh上运行命令

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

先谢谢您的帮助!

只有当ssh连接到TTY时才会显示提示,而不是Java的情况。

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

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

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

  • 三铅
  • JTA

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

plug:请参阅使用sshj在ssh上执行命令的示例

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

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

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

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

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

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

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

有些说明可以在这里找到

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