为什么 cd 命令不能使用 Java JSch?

Why doesn't cd command work using Java JSch?

我正在学习 Java 和 Jsch,我可以使用 运行 其他命令但不能使用 cd。 SSHManager sendCommand 函数返回的错误代码不是 null,而是一些每次都不同的不可读字符串(也许这意味着它是 null 不熟悉 Java 的内部工作原理)。

知道为什么不吗?此处有类似问题 JSch - Why doesn't CD work? 但未得到解答。

我不会在此处复制和粘贴整个 SSHManager class - 有用的答案以及我正在尝试遵循的完整代码。 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

这个问题在评论中有答案。 sendCommand 中的每个命令都使用它自己的 'pipe',因此它会断开连接并在每个命令中重新开始。

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

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

但是正确的做法是使用session,比如

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

我的开源 API Maverick Synergy 有一个高级 API 可以在 shell 中执行多个命令。它目前专为 bash 类型的 shells.

设计并与之配合使用

通过 SSH“执行”通道(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。