【问题标题】:Why doesn't cd command work using Java JSch?为什么 cd 命令不能使用 Java JSch 工作?
【发布时间】:2020-06-21 19:08:54
【问题描述】:

我只是在学习 Java 和 Jsch,我可以让它运行其他命令,但不能运行 cd。 SSHManager的sendCommand函数返回的错误码不是null,而是一些每次都不一样的不可读字符串(可能是null,对Java的内部工作不太熟悉)。

知道为什么不?类似的问题在这里JSch - Why doesn't CD work?,但没有回答。

我不会在此处复制和粘贴整个 SSHManager 类 - 此处包含我正在尝试遵循的完整代码的有用答案。 Run a command over SSH with JSch

示例代码如下:

import SSH.SSHManager;
public class src
{
    int ERROR = 0;
    public static void main(String[] args)
    {
        String username = "debian";
        String password = "temppwd";
        String ipadd = "192.168.7.2";
        SSHManager ssh = new SSHManager(username, password, ipadd, "");
        ssh.connect();

        String out = "";

        //this doesn't work, printing output as bytes to show how weird it is
        out = ssh.sendCommand("cd Desktop");
        System.out.println(out.getBytes());

        //some other test commands
        out = ssh.sendCommand("mkdir test");
        System.out.println(out);
        out = ssh.sendCommand("ls");
        System.out.println(out);
        ssh.sendCommand("logout");
    }
}

Eclipse 控制台的输出(bin 和 Desktop 已经在根目录中):

[B@b065c63

bin
Desktop
test

【问题讨论】:

    标签: java ssh jsch


    【解决方案1】:

    通过 SSH“exec”通道(SSHManager.sendCommand 后面的内容)执行的每个命令都在其自己的 shell 中执行。所以这些命令相互之间没有影响。

    要在同一个 shell 中执行多个命令,只需使用服务器 shell 的适当语法。大多数 *nix shell 使用分号或双与号(具有不同的语义)。

    在你的情况下,双与号会更合适。

    cd Desktop && mkdir test && ls
    

    另见Multiple commands using JSch


    但是,如果您想读取命令输出,您将难以区分,其中一个命令的输出结束并且以下命令的输出开始。仅当您想检查命令退出代码时才允许。

    那么最好以不需要上下文的方式在自己的“exec”通道中执行每个命令。在您的情况下,这意味着使用完整路径:

    mkdir Desktop/test
    
    ls Desktop
    

    另见How to perform multiple operations with JSch


    此外,由于您将只使用文件操作,因此您实际上根本不应该执行 shell 命令。使用标准 SSH API 进行文件操作,即 SFTP。

    【讨论】:

      【解决方案2】:

      这个问题在 cmets 中有一个答案。 sendCommand 中的每个命令都使用它自己的“管道”,因此它会断开连接并在每个命令中重新开始。

      一种快速的解决方案是在一个sendCommand 中发送多个命令,例如:

      out = ssh.sendCommand("cd Desktop; mkdir test; ls; logout");
      

      但正确的做法是使用会话,比如https://stackoverflow.com/a/9269234/290036

      【讨论】:

      • 不,这不是正确的方法。不应将 shell 会话用于自动化。这最终会给你带来很多问题。
      【解决方案3】:

      我回答了类似的问题Using java jcabi SSH client (or other) to execute several commands in shell

      我的开源 API Maverick Synergy 有一个高级 API 可以在一个 shell 中执行多个命令。它目前是为 bash 类型的 shell 设计的,并且可以很好地工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-09-06
        • 2016-10-09
        • 2013-10-25
        • 1970-01-01
        • 2017-01-02
        • 2013-01-28
        • 2019-12-29
        • 2012-11-02
        相关资源
        最近更新 更多