我需要使用 ProcessBuilder 和 USERID/PASSWORD 组合从 JAVA 程序生成 SSH 连接。
我已经使用 Ganymed、JSch、JAVA Processbuilder 和 Expect 脚本(还有 Expect4J)、JAVA ProcessBuilder 和 SSHPASS 脚本以及 SSH 共享 key 成功实现了 SSH 连接。
目前安全性不是问题,我所追求的是能够以编程方式支持 SSH 连接的各种组合。
我的问题是 SSH 抛出的密码提示不在 STDIN/STDOUT 上(我相信在 tty 上)。这是我要克服的最后一个障碍。
我的问题是有没有办法拦截 SSH 密码请求并从我的 JAVA 代码中提供它?
请注意,这是一个非常狭窄的问题(以上所有信息都是为了保证答案不会太宽泛)。
这是我正在尝试的示例代码:
import java.io.*;
import java.util.*;
public class ProcessBuilderTest {
public static void main(String[] args) throws IOException, Exception {
ProcessBuilder pb = new ProcessBuilder(
"/usr/bin/ssh",
"nyuser@myserver.com",
"export NOME='Jennifer Lawrence'; echo $NOME"
);
pb.redirectErrorStream(); //redirect stderr to stdout
Process process = pb.start();
InputStream inputStream = process.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream));
String line = null;
while((line = reader.readLine())!= null) {
System.out.println(line);
}
process.waitFor();
}
}
但是,当我运行它时,我得到了这个:
[memphis BuilderTest]# java ProcessBuilderTest
myuser@myserver's password:
输入密码后,我得到了剩余的输出:
Jennifer Lawrence
[memphis BuilderTest]#
同样,具体问题是: 有没有办法使用 PasswordAuthentication 方法(不能使用其他方法)生成外部 ssh 客户端(OpenSSH、Tectia SSH、SecureCRT 等)使用 JAVA ProcessBuilder 接口(interface)(不能使用其他语言)的过程,拦截/捕获密码从我的 JAVA 代码中提供密码提示和响应/交互(这样用户就不需要输入密码)?
最佳答案
假设您在 Linux 上运行,您需要了解伪 ttys。密码提示在 tty 设备上。您将需要构建一个针对伪 tty 运行的单独进程,而不是仅仅继承您的 tty 设备,然后您可以拦截密码提示。
这是一个中等复杂的过程。
有一个库支持其中的一些:http://www.ganymed.ethz.ch/ssh2/FAQ.html .如果它可用,您可能会发现阅读它的源代码很有启发性。
关于java - 如何在 Java 程序中拦截 SSH 密码请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20727724/