Почему выполнение нескольких команд через канал оболочки не выполняется последовательно и последовательно?(JSch) - PullRequest
0 голосов
/ 28 января 2019

Я в процессе запуска сценария оболочки на удаленном сервере, используя Jsch, где мне удалось продвинуться (спасибо за ответ на вопрос здесь ), но мой код все еще имеет несколько проблем.

  1. Он не запускает команды последовательно и последовательно, используя метод printscreen.println ().
  2. Моя программа хорошо выполняет команды оболочки в режиме отладки с некоторыми точками останова, но не выполняет команды в режиме выполнения илибез точек отладки.

команды в методе runScript в методе ps.println (), которые последовательно не выполняются последовательно.также метод printResilt () не может печатать (выполнять) команды в режиме выполнения.

    public void runScript(Channel channel) throws Exception {
    // Gets an InputStream for this channel. All data arriving in as messages from the remote side can be read from this stream.
    try {

        OutputStream ops = channel.getOutputStream();
        PrintStream ps = new PrintStream(ops, true);

        channel.setOutputStream(System.out, true);

        // Execute the command
        channel.connect();

        InputStream in = channel.getInputStream();

        ps.println("sudo su - sudouser");
        ps.println("ksh -x \"/path/to/script/shellscript.sh\" arg1  arg2 arg3 arg4 arg5 arg6  arg7");
        ps.println("exit");
        ps.close();

        printResult(in, channel);
    }
    catch(IOException ioExp) {
        ioExp.printStackTrace();
    }


//retrieve the exit status of the remote command corresponding to this channel
 //int exitStatus = channelExec.getExitStatus();

    //Safely disconnect channel and disconnect session. If not done then it may cause resource leak
    channel.disconnect();
    session.disconnect();
}
 /**
    * @param input
    * @param channel
    */
   private static void printResult(InputStream in,
                                   Channel channel) throws Exception
   {
      int SIZE = 1024;
      byte[] tmp = new byte[SIZE];
      while (true) {
          try {
              Thread.sleep(1000);
          } catch (Exception ee) {}
          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()) {
               if(in.available() > 0) {
                  int i = in.read(tmp, 0, 1024);
                  System.out.print(new String(tmp, 0, i));
               } 
              System.out.println("exit-status: " + channel.getExitStatus());
              break;
          }

      }
   }

Основной метод:

public class App 
{

public static void main( String[] args ) throws Exception
{   
    try
    {
        SFTPUploader sftpUploader = new SFTPUploader();
        ChannelSftp sftpChannel = sftpUploader.connectServer();

        //close sftp channel after upload
        sftpUploader.closeChannel(sftpChannel);

        //open executable channel
        Channel channel = sftpUploader.openChannel("shell");

        //execute shell script
        sftpUploader.runScript(channel);
    }
    catch(SftpException e) {
        e.printStackTrace();
    }
    catch(JSchException jschExp) {
        jschExp.printStackTrace();
    }
 }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...