1

如何通过 ssh 在远程机器上运行应用程序?

我尝试使用 JSCH,这样:

    Properties props = new Properties();
    props.put("StrictHostKeyChecking", "no");

    String host = "111.111.11.111";
    String user = "myuser";
    String pwd = "mypass";
    // int port = 22;

    JSch jsch = new JSch();
    Session session = jsch.getSession(user, host);
    session.setConfig(props);
    session.setPassword(pwd);
    session.connect();

    System.out.println(session.getServerVersion());
    System.out.println("Conected!");

    // String command = "ps -ef;date;hostname";

    String command = "myapplication  someFileAsParameter";
    Channel channel = session.openChannel("exec");
    ((ChannelExec) channel).setCommand(command);

    // channel.setInputStream(System.in);
    channel.setInputStream(null);

    ((ChannelExec) channel).setErrStream(System.err);

    InputStream in = channel.getInputStream();

    channel.connect();

我有这个:

bash:myapplication:找不到命令

当尝试通过 shell 执行此命令时,工作正常。

不一定需要是JSCH,可以是任何东西。

4

1 回答 1

4

对于未来的读者:正如讨论所示,原因是 JSch 连接到与普通 SSH 不同的服务器(其中一个有文件,而另一个没有)。我仍然在这里给出我的答案,因为它包含一些有用的(我认为)针对类似问题的调试想法。但请记住:首先检查您是否连接到正确的计算机


原则上,如果您使用 JSch,这就是这样做的方法。如果您收到错误消息bash: myapplication: command not found,这意味着路径中没有myapplication二进制文件。(使用普通命令行时,您将收到相同的错误消息ssh。)

在您的普通外壳中尝试which myapplication(或type myapplication),以查看它的位置。然后echo $PATH >&2用作命令,以查看您的 exec 通道使用的路径。这可能与从您的普通 shell 执行时有所不同。如果是这样,请使用命令名称中的完整路径,或者修复您的设置。(看看路径是设置在~/.bashrc~/.profile还是。只有其中一些文件会在交互式登录和非交互式登录上执行 -/etc/profile我认为通道将是非交互式的。)/etc/bash.bashrcexec

于 2011-06-29T21:36:59.037 回答