2

我对 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: Cannot run program "ls": CreateProcess error=2, 系统找不到指定的文件

有人可以帮我吗?

4

5 回答 5

2

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

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

于 2012-09-14T18:33:58.787 回答
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);
于 2012-09-14T18:31:36.547 回答
0

除了使用JSch(或任何其他 Java SSH 实现)之外,通过环境变量传递路径可能不起作用,因为大多数 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/

于 2012-09-14T18:32:11.507 回答
0

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

pr.getOutputStream().write("ls\n".getBytes());
于 2012-09-14T18:35:17.750 回答
0

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

于 2018-03-11T06:20:07.023 回答