如何使用Java exec

时间:2012-09-14 18:28:16

标签: java exec

我对java很新,现在我想用java在Windows命令上运行SSH。

这是我创建的代码,

Process pr1 = Runtime.getRuntime().exec("cmd /k" + "ssh root@host" + "&&" + "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 error = 2,   系统找不到指定的文件

有人可以帮我吗?

5 个答案:

答案 0 :(得分:2)

实际上回答可能很简单:问题是你正在执行SSH命令,然后执行一个单独的命令ls,它被发送到Windows控制台(而不是通过SSH),所以,你知道Windows没有有一个ls命令。

您必须将其发送到SSH命令的exec返回的Process,您可以通过存储生成的进程,检索其OutputStream并在那里写入commad来实现。当然,您必须使用其InputStream来获取结果。第二个exec()根本不存在。

答案 1 :(得分:1)

请勿使用Runtime.exec,请使用Apache Commons Exec。要将它应用于您的问题,它将如下所示:

ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
CommandLine pr1 = CommandLine.parse("cmd /k" + "ssh root@host" + "&&" + "passwd");
CommandLine pr = CommandLine.parse("ls");
DefaultExecutor executor = new DefaultExecutor();
executor.setStreamHandler(streamHandler);

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

答案 2 :(得分:0)

除了使用JSch(或任何其他Java SSH实现)之外,通过环境变量传递Path可能不起作用,因为大多数SSH守护程序只接受来自另一方的一小组变量(主要是相关的)本地化或终端类型)。

由于ssh(或“命令”,如果将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.exec并不严格且严格,请尝试 Apache的Exec库 ...

请参阅此链接:

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

答案 3 :(得分:0)

您想要写入进程的标准输入。

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

答案 4 :(得分:0)

请使用https://github.com/zeroturnaround/zt-exec。 Apache Commons Exec有许多缺点,你需要相当多的代码才能做到正确。这里解释了一切:https://zeroturnaround.com/rebellabs/why-we-created-yaplj-yet-another-process-library-for-java/