使用JavaJSCH库一个接一个地执行多个命令

使用JavaJSCH库一个接一个地执行多个命令,java,jsch,Java,Jsch,我正在寻找一种解决方案,来解决需要按顺序一个接一个地执行的命令集。同样,只有在上一个命令完成执行后,才能执行一个命令 String command="cd /home/; ls-ltr;" java.util.Properties config = new java.util.Properties(); config.put("StrictHostKeyChecking", "no"); JSch jsch = new JSch();

我正在寻找一种解决方案,来解决需要按顺序一个接一个地执行的命令集。同样,只有在上一个命令完成执行后,才能执行一个命令

String command="cd /home/; ls-ltr;"
java.util.Properties config = new java.util.Properties(); 
            config.put("StrictHostKeyChecking", "no");
            JSch jsch = new JSch();
            Session session=jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.setConfig(config);
            session.connect();
            System.out.println("Connected");

            Channel channel=session.openChannel("exec");
            ((ChannelExec)channel).setCommand(command);
            channel.setInputStream(null);
            ((ChannelExec)channel).setErrStream(System.err);

            InputStream in=channel.getInputStream();
            channel.connect();
            byte[] tmp=new byte[1024];
            while(true){
              while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
              }
              if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
              }
              try{Thread.sleep(1000);}catch(Exception ee){}
            }
              if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
              }
              try{Thread.sleep(1000);}catch(Exception ee){}
            }

            System.out.println("DONE");
String命令=“cd/home/;ls ltr;”
java.util.Properties config=new java.util.Properties();
配置放置(“检查”、“否”);
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户,主机,22);
session.setPassword(密码);
session.setConfig(config);
session.connect();
System.out.println(“已连接”);
Channel=session.openChannel(“exec”);
((ChannelExec)channel).setCommand(command);
channel.setInputStream(空);
((ChannelExec)channel.setErrStream(System.err);
InputStream in=channel.getInputStream();
channel.connect();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);

如果(i我将实现从“exec”更改为“shell”,并在每个命令之间使用“&&&”更新命令。现在,只有在前一个命令完全执行之后,才能执行以下命令。即“&&&”的工作方式是,基于前一个命令的成功状态,即检查退出状态,该状态应为“0”否则将不执行以下命令

更新代码:

try{    
            java.util.Properties config = new java.util.Properties(); 
            config.put("StrictHostKeyChecking", "no");
            JSch jsch = new JSch();
            Session session=jsch.getSession(user, host, 22);
            session.setPassword(password);
            session.setConfig(config);
            session.connect();
            System.out.println("Connected");

            Channel channel=session.openChannel("shell");
            OutputStream ops = channel.getOutputStream();
            PrintStream ps = new PrintStream(ops, true);

             channel.connect();
             ps.println(command1 + "&&" + command2 + "&&" + command3 +"&&" +command4);
            InputStream in=channel.getInputStream();
            byte[] tmp=new byte[1024];
            while(true){
              while(in.available()>0){
                int i=in.read(tmp, 0, 1024);
                if(i<0)break;
                System.out.print(new String(tmp, 0, i));
              }
              if(channel.isClosed()){
                System.out.println("exit-status: "+channel.getExitStatus());
                break;
              }
              try{Thread.sleep(1000);}catch(Exception ee){}
            }
            channel.disconnect();
            session.disconnect();
            System.out.println("DONE");
        }catch(Exception e){
            e.printStackTrace();
        }
试试{
java.util.Properties config=new java.util.Properties();
配置放置(“检查”、“否”);
JSch JSch=新的JSch();
Session Session=jsch.getSession(用户,主机,22);
session.setPassword(密码);
session.setConfig(config);
session.connect();
System.out.println(“已连接”);
Channel=session.openChannel(“shell”);
OutputStream ops=channel.getOutputStream();
PrintStream ps=新的PrintStream(ops,true);
channel.connect();
ps.println(command1+“&&&+command2+”&&“+command3+”&&+command4);
InputStream in=channel.getInputStream();
字节[]tmp=新字节[1024];
while(true){
while(in.available()>0){
inti=in.read(tmp,0,1024);

如果(i您可以使用一个又一个命令,方法是在命令后面附加&。例如

jschUtil.openChannel("exec");
jschUtil.getExecSshChannel().setCommand("cd /root/Test1/Test2 && mkdir Neel");

在这里,目录Neel将在Test2内部创建。如果您创建两个单独的通道,或者一个接一个地使用命令,这是不可能的。

在目标系统上创建一个shell脚本并调用它?是的,我只是尝试使用shell。但我不确定在执行前一个命令后如何执行一个命令。
>ls-ltr/home/
将只是一个命令…脚本应该做什么?您能描述一下您的脚本最终应该做什么吗?我将实现从“exec”更改为shell,并在每个命令之间用“&&&”更新命令。现在,只有在前一个命令完全执行之后,才能执行以下命令。即“&&”其工作方式是,基于上一个命令的成功状态,即检查退出状态,该状态应为“0”,否则将不会执行以下命令。