Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么';t cd命令使用javajsch工作?_Java_Ssh_Jsch - Fatal编程技术网

为什么';t cd命令使用javajsch工作?

为什么';t cd命令使用javajsch工作?,java,ssh,jsch,Java,Ssh,Jsch,我只是在学习Java和Jsch,我可以让它运行其他命令,但不能运行cd。SSHManager sendCommand函数返回的错误代码不是null,而是一些每次都不同的无法读取的字符串(可能这意味着它是null,但对Java的内部工作方式不太熟悉) 知道为什么吗?这里有类似的问题,但没有答案 我不会在这里复制和粘贴整个SSHManager类,这是一个有用的答案,其中包含我试图遵循的完整代码 示例代码如下: import SSH.SSHManager; public class src {

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

知道为什么吗?这里有类似的问题,但没有答案

我不会在这里复制和粘贴整个SSHManager类,这是一个有用的答案,其中包含我试图遵循的完整代码

示例代码如下:

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已经存在于根目录中):


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

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

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

但是正确的方法是使用会话,例如我回答了一个类似的问题


我的开源API有一个高级API,可以在一个shell中执行多个命令。它目前是为bash类型的shell设计的,并且可以很好地与之配合使用。

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

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

在您的情况下,双与号更合适

cd桌面&&mkdir测试&&ls
另见


不过,如果您想读取命令输出,您将无法区分一个命令的输出在哪里结束,以下命令的输出在哪里开始。仅当您希望检查命令退出代码时才允许

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

mkdir桌面/测试
ls桌面
另见



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

不,这不是正确的方法。shell会话不应用于自动化。这最终会给你带来很多问题。
out = ssh.sendCommand("cd Desktop; mkdir test; ls; logout");