我对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, 系统找不到指定的文件
有人可以帮我吗?
答案 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库 ...
请参阅此链接:
答案 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/