代码之家  ›  专栏  ›  技术社区  ›  Ichorus

用Java在SSH上运行命令

  •  10
  • Ichorus  · 技术社区  · 15 年前

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

    提前感谢您的帮助!

    9 回复  |  直到 13 年前
        1
  •  11
  •   Jason Cohen    15 年前

    仅当 ssh 连接到一个TTY,它不在Java的情况下。

    可能有一种方法可以在您的 应用。这将是通过提示的方法。

    另一方面,考虑从本地Java代码直接连接到主机服务器,而不是运行外部应用程序。有 a million libraries 这样就可以了。

        2
  •  7
  •   Douglas Leeder    15 年前

    与其使用外部SSH程序,为什么不使用Java SSH库:

    我在Google上找到的是两个——这可以避免OpenSSH在防止在stdin上输入密码方面非常努力的问题——它将直接打开终端。为了工作,Expect必须非常努力地模拟tty。

        3
  •  6
  •   shikhar    14 年前

    插头:见 this 在ssh上执行命令的示例 sshj

        4
  •  4
  •   Jason Day    15 年前

    为什么不使用JAVA SSH客户端呢? This 一个是BSD许可,列出了更多的客户机 here .

        5
  •  2
  •   Ryann Graham    15 年前

    大多数具有安全意识的程序不使用stdin/stdout来捕获密码,而是捕获tty或其他等效方法。

        6
  •  1
  •   chris    15 年前

    我已经成功地使用了三头ssh客户机。我还尝试了JSCH(另一个JAVA SSH客户端)和在Linux下向本地SSH客户端进行隧道传输。Trilead是目前最好的。

        7
  •  1
  •   James    15 年前

    看看最近发布的 SSHD 基于Apache Mina项目。

        8
  •  1
  •   rogodeter    13 年前

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

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

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

    可以找到一些说明 here

        9
  •  0
  •   Bruce Blackshaw    15 年前

    可以使用运行命令 edtFTPj/PRO 以及通过sftp执行文件传输。它是Java。