【发布时间】:2013-12-22 08:51:43
【问题描述】:
我需要使用 ProcessBuilder 和 USERID/PASSWORD 组合从 JAVA 程序生成 SSH 连接。
我已经使用 Ganymed、JSch、JAVA Processbuilder 和 Expect 脚本(也包括Expect4J)、JAVA ProcessBuilder 和 SSHPASS 脚本以及 SSH 共享密钥的组合成功实现了 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 接口(无法使用其他语言)的进程,拦截/捕获密码从我的 JAVA 代码中提示并响应/交互提供该密码(因此用户无需键入)?
【问题讨论】:
-
你为什么要用这么多不同的方式来实现它?!
-
我的团队正在创建基于 JAVA 的工具供基础架构团队使用,每个团队都有自己的做事方式(它是一家全球性公司),我们不能通过强制标准或模式。
-
嗯,密码提示以无法被拦截的方式完成是有原因的。原因是程序或脚本中的硬编码密码是不可取的,至少可以这么说。
-
@Ingo,我同意密码不得在任何地方进行硬编码,这不是我们所做的,我可以给你举的一个例子是我们的一些用户(操作员)在一个可能通过许多服务器产生的会话的开始,我们的系统将该信息加密保存在内存中,并在需要时使用它,但是,就像我说的,一些操作将在许多不同国家的服务器中进行/执行,受到许多不同的法规并由许多不同的支持小组维护....因此几乎不可能执行标准。
-
@Ingo 这正是我需要的 :-)