我只是学习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
问题在评论中有一个答案。 sendCommand
中的每个命令都使用自己的“管道”,因此它会断开连接并在每个命令中重新开始。
一种快速的解决方案是在一个sendCommand
中发送多个命令,例如:
out = ssh.sendCommand("cd Desktop; mkdir test; ls; logout");
但是正确的方法是使用会话,例如https://stackoverflow.com/a/9269234/290036
我回答了类似的问题Using java jcabi SSH client (or other) to execute several commands in shell
我的开源API Maverick Synergy具有高级API,可在Shell中执行多个命令。它目前设计用于bash型shell,并可以很好地工作。
使用sendCommand
执行的每个命令都在其自己的“ exec”通道中(在其自身的外壳中)执行。因此,这些命令不会互相影响。
要在同一外壳中执行多个命令,只需使用服务器外壳的适当语法。大多数* nix服务器使用分号或双“&”号(具有不同的语义)。
在您的情况下,双与号会更合适。
cd Dekstop && mkdir test && ls
另请参见Multiple commands using JSch。
尽管您想读取命令输出,但是在区分一个命令的输出结束并开始以下命令的输出时会遇到问题。仅当您想检查命令退出代码时才使用。
然后最好以不需要上下文的方式在其自己的“ exec”通道中执行每个命令。在您的情况下,这意味着使用完整路径:
mkdir Desktop/test
ls Desktop