假设我们有这个方法来为另一台机器制作一个ssh。如何将机器终端的输出返回主机
public void getSSHreply()
{
Process p;
// Set up the arguments for ProcessBuilder
String[] cmd =
{
"/usr/bin/ssh",
"someRemoteMachine", //This machine will authenticate with keys, hence no pw needed
"./myprog",
};
try
{
p = Runtime.getRuntime().exec(cmd);
//How would I redirect stdout back to host machine?
StringBuffer s = new StringBuffer();
BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));
while (input.readLine() != null)
{
s.append(input.readLine() + "\n");
}
System.out.println(s.toString());
}
catch (IOException e)
{
System.err.println("Failed to read & or start ");
}
}
答案 0 :(得分:0)
不幸的是你做不到。最简单的方法可能是读取p的inputStream和errorStream(通常在两个独立的线程中)。
我相信您的直接问题是因为您使用的是BufferedReader - 所以当SSH显示“密码:”提示符(没有终止换行符)时,Bufferedreader将不会向您的input.readLine返回任何内容( )打电话。
最简单的方法是一次读取一个字符的输入(当然不是最有效的)。
您也可能想要读取stderr流,这就是为什么您可能需要几个线程。
答案 1 :(得分:0)
Process
对象包含获取STDOUT
,STDERR
和STDIN
流的方法。 (例如getOutputStream()
)。
您可能需要查看commons-exec以便更方便地启动和管理外部程序,其中包含StreamPumper
等工具来重定向数据。