【问题标题】:Cannot run program "ssh": CreateProcess error=2, The system cannot find the file specified无法运行程序“ssh”:CreateProcess 错误=2,系统找不到指定的文件
【发布时间】:2016-09-14 16:01:11
【问题描述】:

我目前正在尝试从 Unix 服务器检索 JSON 文件。

我使用 JSch 进行连接,效果很好。现在我的挑战是向服务器发送一个命令(或多或少几个 cd 和 ls,所以很简单)。

问题是我遇到了一个错误,我被卡住了。

这里是servlet的代码:

import java.io.IOException;
import java.io.PrintWriter;

import static java.lang.System.*;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;

import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;

import java.lang.Runtime;

@WebServlet("/ConnexionRecette")
public class ConnexionRecette extends HttpServlet {

    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String user = "xxxx";
        String password = "xxxxxx!";
        String host = "xxxxxx";
        int port = 22;

        // String remoteFile = "xxxxxxxxxx";

        PrintWriter out = response.getWriter();
        response.setContentType("text/html");
        out.println("<html>");
        out.println("<head><title>Connect to serv test</title></head>");
        out.println("<body>");
        out.println("<br>print avant try");

        try {
            JSch jsch = new JSch();
            Session session = jsch.getSession(user, host, port);
            session.setPassword(password);
            session.setConfig("StrictHostKeyChecking", "no");
            out.println("<br>Establishing Connection...");
            session.connect();
            out.println("<br>Connection established.");
            out.println("<br>Crating SFTP Channel.");
            ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
            sftpChannel.connect();
            out.println("<br>SFTP Channel created.");
            out.println("<br> ********** Ok on serv, end of connection code, end of try. **********");


            Runtime runtime = Runtime.getRuntime();
            String[] args = { "cd .."};
            final Process process = runtime.exec(args);
        BufferedReader output = getOutput(process);
        BufferedReader error = getError(process);
        String line = "";


        while((line = output.readLine()) != null) {
            out.println(line);
        }

        while((line = error.readLine()) != null) {
            out.println(line);
        }
        process.waitFor();

    } catch (IOException e) {
        out.println("<br>Print in catch IO");
        out.println("<br>*********************<br>");
        e.printStackTrace();
        out.println("<br>*********************<br>");

    } catch (InterruptedException e) {
        out.println("<br>Print in catch Interrupted");
        out.println("<br>*********************<br>");
        out.println("<br>*********************<br>");
        e.printStackTrace();

    }
        out.println("<br>print après le try catch");
        out.println("</body>");
        out.println("</html>");
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        doGet(request, response);
    }

}

调用servlet时的错误:

无法运行程序“ssh”:CreateProcess error=2, Le fichier spécifié est introuvable

java.io.IOException: Cannot run program "cd ..": CreateProcess error=2, Le fichier spécifié est introuvable
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at ConnexionRecette.doGet(ConnexionRecette.java:92)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:622)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:729)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:292)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:240)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:207)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:212)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:141)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:616)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:528)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1100)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:687)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1520)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1476)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Unknown Source)

原因:java.io.IOException: CreateProcess error=2, Le fichier spécifié est introuvable 在 java.lang.ProcessImpl.create(本机方法) 在 java.lang.ProcessImpl.(未知来源) 在 java.lang.ProcessImpl.start(未知来源)

提前致谢!

【问题讨论】:

  • 您发布的代码似乎都没有尝试运行 ssh 程序。你确定你发布了相关的源代码?哪个特定的代码行产生了错误?
  • CreateProcessWin 特定的。嗯,我怀疑 JSch 可能会在内部调用 ssh ...
  • 另外,您确实意识到您可以一次性完成cd ../xxx/xxxx/xxx/JSON/xxxx,而不是您极其低效的单独cd 命令序列,对吧?另外,我不认为用sudo su - 前缀整个事情会做你认为它做的事情......
  • 向我们展示异常调用堆栈。
  • 关于 sudo su - :当我连接到服务器时,我需要切换到 root,否则我将无法访问我需要的文件夹,并且对于整个命令我没有知道,不是真正的 Unix Shell 专家..

标签: unix jsch


【解决方案1】:

java.io.IOException: Cannot run program "cd ..": CreateProcess error=2, Le fichier spécifié est introuvable

cd 不是程序。它是一个内部命令,用于更改正在运行的 shell 的当前目录。

每个正在运行的进程都有一个当前目录。它不能通过启动外部程序来更改。如果您想更改代码的当前目录,那么您应该使用您正在使用的语言提供的库函数。我不了解 Java,但如果您在文档中搜索 chdirchangeDirectory,我相信您会找到正确的方法。

另一方面,如果您想更改刚刚打开的远程连接上的当前目录,那么您应该通过sftpChannel 对象发出命令,或者更有可能使用其中一种方法来更改远程目录。 (再说一遍,这只是编程常识,我对Java或sftpChannel一无所知)。

【讨论】:

    猜你喜欢
    • 2011-11-09
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 2016-07-26
    • 1970-01-01
    • 2015-02-01
    • 1970-01-01
    • 2013-02-01
    相关资源
    最近更新 更多