Scenerio:我想通过ssh从Java程序在远程机器上运行命令(我在开发机器上使用OpenSSH)。我也想通过传递密码而不是按照'期望'设置密钥来建立ssh连接
问题:当尝试执行'expect'之类的密码登录时,使用ProcessBuilder创建的Process似乎看不到密码提示。当运行常规的非ssh命令(例如'ls')时,我可以获得流并与它们进行交互就好了。我将标准错误和标准输出合并到一个带有redirectErrorStream(true);
的流中,所以我没有错过标准错误...当我使用'-v'选项运行ssh时,我看到流中的所有日志记录但我没有看到提示。这是我第一次尝试使用ProcessBuilder这样的东西。我知道使用Python,Perl或者好的OL会更容易,但是我的老板想在现有的Java程序中利用我们想要的东西(远程日志文件和运行脚本),所以我有点卡住了。 / p>
提前感谢您的帮助!
答案 0 :(得分:11)
只有在ssh
连接到TTY时才会显示提示,而不是Java。
可能有一种方法可以在ssh
应用程序的命令行中提供密码。这将是超越提示的方式。
或者,考虑从本机Java代码直接连接到主机服务器,而不是运行外部应用程序。有a million libraries可以做到这一点。
答案 1 :(得分:7)
为什么不使用Java ssh库,而不是使用外部ssh程序:
我找到了两个谷歌 - 这将避免openssh将非常努力地阻止在stdin上输入密码的问题 - 它将直接打开终端。期望必须非常努力地模拟tty以便工作。
答案 2 :(得分:6)
答案 3 :(得分:4)
答案 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。