2012-09-14 42 views
2

我对java相当新,现在我想用java来运行SSH over Windows命令。如何使用Java执行

这里是我创建的代码,

Process pr1 = Runtime.getRuntime().exec("cmd /k" + "ssh [email protected]" + "&&" + "passwd"); 
Process pr = Runtime.getRuntime().exec("ls"); 
BufferedReader input = new BufferedReader(new InputStreamReader(pr.getInputStream())); 
String line=null; 

while((line=input.readLine()) != null) 
    System.out.println(line); 

我总是给出错误:

产生java.io.IOException:不能运行程序 “LS”:CreateProcess的错误= 2, 系统找不到指定的文件

有人能帮助我吗?

+2

好像你试图在Windows机器上执行'ls' ......如果这是你所期望的,它将不会在远程机器上执行。 – Tudor

+0

相反,您应该找到一种方法将ls \ n写入到ssh Process'的OutputStream中,但我不确定如何执行此操作。免费提示答案。尽管如此,为Ja​​va寻找一个SSH库可能会更好。 – Brian

+0

请参阅[这个问题](http://stackoverflow.com/questions/995944/ssh-library-for-java)。这可能比手动更好。 – Brian

回答

0

除了使用JSch(或任何其他Java SSH实现),通过环境变量传递路径可能无法正常工作,因为大多数SSH守护程序只接受来自另一侧的一小组变量(大部分与本地化或终端类型有关)。

作为ssh(或“command”,如果将JSch与ChannelExec一起使用)的参数传递给远程shell执行,您可以尝试在此命令中定义路径(如果您的默认shell是兼容的到POSIX SH):

PATH=path_needed_toRun_myProg /absPathToMyProg/myProg

您的的Runtime.exec阵列因此看起来像这样:

String[] cmd = {"/usr/bin/ssh", "someRemoteMachine", 
       "PATH=path_needed_toRun_myProg /absPathToMyProg/myProg"}; 

如果它并不难,严格的规则来使用Runtime.ex EC,然后尝试Apache的Exec的图书馆 ...

请参阅此链接:

http://commons.apache.org/exec/

1

不要打扰Runtime.exec,使用Apache Commons Exec。将它应用到你的问题就应该是这样的:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream); 
CommandLine pr1 = CommandLine.parse("cmd /k" + "ssh [email protected]" + "&&" + "passwd"); 
CommandLine pr = CommandLine.parse("ls"); 
DefaultExecutor executor = new DefaultExecutor(); 
executor.setStreamHandler(streamHandler); 

int exitValue = executor.execute(pr1); 
exitValue = executor.execute(pr); 
+0

根据DefaultExecutor JavaDoc,PumpStreamHandler已经默认使用,所以你可以跳过setStreamHandler()这一步。 –

2

其实答案可能很简单:问题是,你正在执行SSH命令,然后执行单独的命令ls这是发送到Windows控制台(而不是通过SSH),因此,如您所知,Windows没有ls命令。

您必须将它发送到SSH命令执行程序返回的Process,您可以通过存储生成的进程,检索其OutputStream并在其中写入逗号来执行此操作。当然,你将不得不使用它的InputStream来获取结果。第二个exec()根本不应该存在。

+0

您切换了流。你将命令写入'OutputStream'并从'InputStream'读取结果:3 – Brian

+0

whops,sry,修复它:S – Jack

0

你想写入进程的标准输入。

pr.getOutputStream().write("ls\n".getBytes()); 
+0

由于他在Windows上,另一个盒子是某种UNIX的风味,所以应该是什么字符编码用于将'ls \ n'变成字节? – Brian

+0

好问题。我怀疑是否有单一的正确答案。鉴于有问题的字符是7位ASCII码,很多编码会产生相同的字节。 –