2013-12-13 5 views
0

У меня есть код для подключения к удаленному серверу через ssh и отправки ему двух или более команд (например: cd /export/home/ops/bin и "./viewlinkload -time 20131205-19"), но я 'видеть, что команда выполнена и не получает результатов.Отправить команду через ssh и прочитать выходные результаты

Мне нужно вернуть результат с сервера и отобразить его.

Это код команды посыла:

try { 
    command = "cd /export/home/ops/bin"; 
    command1="./viewlinkload –time 20131205-19"; 

    session.startShell(); 
session.getOutputStream().write(command.getBytes()); 
     ChannelInputStream in = session.getInputStream(); 
     ChannelOutputStream out = session.getOutputStream(); 
     InputStream inputStream = session.getInputStream(); 
     BufferedReader bufferedReader = new BufferedReader(
      new InputStreamReader(inputStream)); 
     StringBuilder stringBuilder = new StringBuilder(); 
     String line; 

     while ((line = bufferedReader.readLine()) != null) { 
      stringBuilder.append(line); 
      stringBuilder.append('\n'); 
     } 
     System.out.println("ke qua" + stringBuilder.toString()); 
     // return stringBuilder.toString(); 
} catch (IOException e) { 
    // TODO Auto-generated catch block 
    e.printStackTrace(); 
} 

Если я изменяю команда "LS \ п" После того, как последняя запись приостановить на «в то время как ((строка = bufferedReader.readLine())! = NULL) »и не бегать. Помогите мне. Спасибо всем.

+0

Любое исключение, что значение ' result', почему вы используете два входных потока 'in' и' inputStream'? –

ответ

3

Jsch имеет несколько отличных примеров в каталоге примеров, в частности, вы можете найти интерес, который называется Exec. Вы также можете быть заинтересованы в Shell

Это слегка измененная версия, которая пропускает информацию из командной строки и запрашивает информацию пользователя и команду и просто пытается напрямую подключиться к удаленному компьютеру и выполнить команду ls.

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import com.jcraft.jsch.UserInfo; 
import java.io.InputStream; 
import java.util.Properties; 

public class TestShell { 

    public static void main(String[] arg) { 
     try { 
      JSch jsch = new JSch(); 

      Session session = jsch.getSession("username", "computer", 22); 

      Properties config = new Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      session.setConfig(config); 

      // Skip prompting for the password info and go direct... 
      session.setPassword("happybunnyslippers"); 
      session.connect(); 

      String command = "ls"; 

      Channel channel = session.openChannel("exec"); 
      ((ChannelExec) channel).setCommand(command); 

      ((ChannelExec) channel).setErrStream(System.err); 

      InputStream in = channel.getInputStream(); 

      System.out.println("Connect to session..."); 
      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) { 
       } 
      } 
      channel.disconnect(); 
      session.disconnect(); 
     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
} 

Я испытал это на моем окне Windows, подключенного к одному из моих Mac коробки без каких-либо проблем

Обновленные с взломан например Shell

В основном, это взломанный пример, основанный на Shell пример.

Для этого используется пользовательский OutputStream для мониторинга изменений, отправляемых с удаленного компьютера, и которые могут выдавать команды. Это довольно просто, потому что все, что я делаю, ждет, когда $ будет отправлен в выходной поток, а затем выдает следующую команду.

Это не займет слишком много работы, чтобы изменить его таким образом, чтобы на основе текущего индекса команды/команды, вы могли бы сделать по-разному разборе ...

import com.jcraft.jsch.*; 
import java.awt.*; 
import java.io.IOException; 
import java.io.OutputStream; 
import java.io.PipedInputStream; 
import java.io.PipedOutputStream; 
import javax.swing.*; 

public class TestShell { 

    public static void main(String[] arg) { 

     try { 

      JSch jsch = new JSch(); 
      String host = null; 

      final Session session = jsch.getSession("user", "remotecomputer", 22); 
      session.setPassword("fluffybunnyslippers"); 

      session.setConfig("StrictHostKeyChecking", "no"); 
      session.connect(30000); // making a connection with timeout. 

      final Channel channel = session.openChannel("shell"); 

      PipedInputStream pis = new PipedInputStream(); 
      final PipedOutputStream pos = new PipedOutputStream(pis); 

      channel.setInputStream(pis); 
      channel.setOutputStream(new OutputStream() { 

       private int cmdIndx = 0; 
       private String[] cmds = { 
        "ls\n", 
        "cd ..\n", 
        "ls\n", 
        "exit\n" 
       }; 

       private String line = ""; 

       @Override 
       public void write(int b) throws IOException { 
        char c = (char) b; 
        if (c == '\n') { 
         logout(line); 
         System.out.print(line); 
         line = ""; 
        } else { 
         line += c; 
         logout(line); 
         if (line.endsWith("$ ")) { 
          String cmd = cmds[cmdIndx]; 
          cmdIndx++; 
          pos.write(cmd.getBytes()); 
         } 
        } 
       } 

       public void logout(String line) { 
        if (line.startsWith("logout")) { 
         System.out.println("...logout..."); 
         channel.disconnect(); 
         session.disconnect(); 
         System.exit(0); 
        } 
       } 
      }); 

      channel.connect(3 * 1000); 

     } catch (Exception e) { 
      System.out.println(e); 
     } 
    } 
} 
+0

Выполняет команду мультиплексирования ??? Я использую j2ssh библиотеку, но это ошибка, когда я получаю inputreader и читаю его. jsch может это сделать ??? Thanks – Quochg

+0

Что вы подразумеваете под «multiplex command»? – MadProgrammer

+0

yep. Я хочу поставить 2 или более 2 команды. в настоящее время я хочу отправить первую команду: «cd/export/home/ops/bin» после «./viewlinkload -time 20131205-19». Вторая команда - это идентификатор команды. Сначала команда - dir. Помогите мне Спасибо – Quochg

Смежные вопросы