java SWT для подключения к удаленному серверу с помощью Jcraft JSch

Я работаю над инструментом для подключения к удаленному серверу с помощью jcraft.JSch (ssh для сервера Unix) и возврата вывода и отображения его вывода (что-то вроде замазки, но я не заинтересован в Plink или любая сторонняя вещь). Код работает нормально, когда входные выходы каналов System.in и System.out, а программа представляет собой просто консольное Java-приложение. Но когда я пытаюсь использовать элементы управления SWT, возникла проблема, как описано в Как сопоставить System.out и System.in с элементами управления SWT

Итак, я считаю, что это кое-что из тегов INFO и ERR (с которыми я займусь позже), в любом случае я изменил подход. теперь я подаю команды через ввод текста SWT. он отлично работает для однолинейных выходов. но не для многострочного.

введите здесь описание изображения

Код, который запускает соединение с оболочкой и отправляет команды, выглядит следующим образом.

        public void widgetSelected(SelectionEvent e) {
        String command=CmdText.getText();
        System.out.println("runButton.widgetSelected:Command Obtained by buton is:"+command);
        if ( command.equals("") )
        {
           MessageDialog.openInformation(dialogShell,"Information","Please Eneter a Command!");
           return;
        }
        else if (command.contains("@"))
        {
            channel=CommandHandler.openshell();
            LogText.append("Connected to - :"+command+"\n>");
        }
        else
        {
            LogText.append(command+"\n");
            String outputstring="";
            try
            {
                 BufferedReader dataIn = new BufferedReader(new InputStreamReader(channel.getInputStream()));
                 DataOutputStream dataOut = new DataOutputStream(channel.getOutputStream());  

                 dataOut.writeBytes(command+"\n");
                 dataOut.flush();

                 String line="";
                 outputstring=""+line;
                 while ( line != null) {
                     try
                     {
                        line = dataIn.readLine();
                        line = dataIn.readLine();
                        LogText.append("<CommandResult>:"+line+"\n");
                        return;
                     }
                     catch (IOException e1) { B24IDEConsole.WriteLog("RemoteCall.connect_execute", e1.getMessage()); }
                     outputstring=outputstring+line;
                 }
            }
            catch(Exception e1){ B24IDEConsole.WriteLog("RemoteCall.connect_execute", e1.getMessage()); }
            LogText.append("<EndOfCommand>:"+outputstring+"\n");
        }
    }

Когда я удаляю return в цикле while, диалоговое окно и eclipse (запускающее диалоговое окно) перестают отвечать, и я должен убить их обоих.

Любая помощь приветствуется, спасибо за ваше время.


person Nauduri Venkata Ravi Rama Sast    schedule 24.08.2015    source источник
comment
Похоже, вам нужно запустить команду в фоновом потоке и использовать Display.asyncExec для передачи вывода в текстовый элемент управления.   -  person greg-449    schedule 24.08.2015
comment
Спасибо за комментарий, но вы предлагаете, чтобы я начал shell (в фоновом режиме) выполнить команду и exit и отобразил результат в SWT ?. если так, я не могу этого сделать, потому что пользователь мог установить некоторые переменные среды или код возврата какой-либо предыдущей команды, который будет утерян, если я это сделаю. что я наблюдал без return, так это то, что я могу читать все выходные строки, но как только это будет сделано. и когда я пытаюсь прочитать больше (с помощью dataIn.readLine ()), поток отладки исчезает, и окно eclipse (то, которое я отлаживаю) перестает отвечать. пожалуйста посоветуй.   -  person Nauduri Venkata Ravi Rama Sast    schedule 24.08.2015


Ответы (1)


В приведенном выше коде мне не хватало двух вещей.

  1. getOutputStream и getInputStream вызывались после channel.connect, в то время как в документации Jsch говорится, что это не должно быть ref: http://epaul.github.io/jsch-documentation/simple.javadoc/com/jcraft/jsch/Channel.html
  2. dataIn.available - лучший тест, доступны ли какие-либо другие данные с сервера или нет. благодаря отправке команд на сервер через канал оболочки JSch.

обновленный код

                 InputStream dataIn = CommandHandler.getdatain();
                 OutputStream dataOut = CommandHandler.getdataout();
                 //dataOut.write(command.getBytes()+"\n");
                 byte[] inputbytes = command.getBytes();
                 dataOut.write(inputbytes,0,inputbytes.length);
                 dataOut.flush();
                 while (true) {
                        boolean readoutput=false;
                        while (dataIn.available() > 0) {
                            readoutput=true;
                            byte[] buffer=new byte[1024];
                            int i = dataIn.read(buffer, 0, 1024);
                            if (i < 0) {
                                System.out.print("No more data available!");//It is printing the response to console
                                break;
                            }
                            LogText.append(new String(buffer, 0, i));
                            //LogText.append(":"+new String(buffer, 0, i)+"\n>");
                            System.out.print(new String(buffer, 0, i));//It is printing the response to console
                        }
                        System.out.println(dataIn.available()+"done");
                        if ( readoutput )
                        {
                            if ( dataIn.available() == 0 )
                            {
                                System.out.print("Read all the data and no nore is available, hence exiting!\n");//It is printing the response to console
                                break;
                            }
                        }
                        if ( channel.isClosed() ) {
                            System.out.println("exit-status: " + channel.getExitStatus());
                            break;
                        }
                        try{Thread.sleep(1000);}catch(Exception ee){}
                 }

обрыв по-прежнему является проблемой, но, похоже, на данный момент это можно исправить.

person Nauduri Venkata Ravi Rama Sast    schedule 27.08.2015