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