2016-02-21 5 views
0

Jsch в режиме оболочки Я хочу последовательно выполнять команды. Я попытался использовать приведенный ниже код. Проблема с кодом - это код ожидания readLine(). Может ли кто-нибудь предложить решение. Если вы можете, пожалуйста, исправить приведенный ниже кодПоследовательный запуск и вывод команды АОH

Примечание: я хочу, чтобы выполнить команды в режиме оболочки только

public class SSHClient1 { 

    private Session session; 
    private ChannelShell channel; 
    private String username = ""; 
    private String password = ""; 
    private String hostname = ""; 

    public SSHClient1(String username, String password, String hostname) throws Exception { 
     super(); 
     this.username = username; 
     this.password = password; 
     this.hostname = hostname; 
     startSession(); 
     intializeChannel(); 
    } 

    private void startSession() throws Exception{ 
     if(session == null || !session.isConnected()){ 
      session = connect(hostname,username,password); 
     } 
    } 

    private void intializeChannel() throws Exception{ 
     if(channel == null || !channel.isConnected()){ 
      try{ 
       channel = (ChannelShell)session.openChannel("shell"); 
       channel.setPty(false); 
       channel.connect(); 
      }catch(Exception e){ 
      } 
     } 
    } 

    private Session connect(String hostname, String username, String password) throws Exception{ 
     JSch jSch = new JSch(); 
     try { 
      session = jSch.getSession(username, hostname, 22); 
      Properties config = new Properties(); 
      config.put("StrictHostKeyChecking", "no"); 
      session.setConfig(config); 
      session.setPassword(password); 
      session.connect(); 
      System.out.println("Connected successfully to host "+ hostname); 
     }catch(Exception e){ 
     } 
     return session; 
    } 

    public void executeCommands(List<String> commands) throws Exception{ 
     PrintStream out = null; 
     try{ 
      out = new PrintStream(channel.getOutputStream()); 
      for(String command : commands){ 
       out.println(command); 
       out.flush(); 
       printResult(); 
      } 

     }catch(Exception e){ 
     } finally{ 
      if(out != null) 
       out.close(); 

     } 
    } 

    private void printResult() throws IOException{ 
     try{ 
      InputStream in = channel.getInputStream(); 
      String line = ""; 
      BufferedReader br =new BufferedReader(new InputStreamReader(in)); 
      while((line = br.readLine()) != null){ 
       System.out.println(line); 
      } 
     }catch(Exception e){ 
     } 

    } 


    public void close(){ 
     if(channel != null) 
      channel.disconnect(); 
     if(session != null) 
      session.disconnect(); 
    } 


    public static void main(String[] args) throws Exception{ 

     SSHClient1 ssh = new SSHClient1("admin", "password", "192.168.2.9"); 
     List<String> commands = new ArrayList<String>(); 
     commands.add("enable"); 
     commands.add("configure terminal"); 
     commands.add("show running-config"); 
     ssh.executeCommands(commands); 
     ssh.close(); 

    } 
} 

если я изменить два метода выше кода я смог достичь того, чего я хочу, то проблема с подходом заключается в том, что мне нужно поместить Thread.sleep после создания буфера, иначе он ничего не напечатает.

public void executeCommands(List<String> commands) throws Exception{ 
     PrintStream out = null; 
     try{ 
      out = new PrintStream(channel.getOutputStream(),true); 
      for(String command : commands){ 
       out.println(command); 
       out.flush(); 
       printResult(); 
      } 
     }catch(Exception e){ 
     } finally{ 
      if(out != null) 
       out.close(); 

     } 
    } 

    private void printResult() throws IOException{ 
     try{ 
      InputStream in = channel.getInputStream(); 
      BufferedReader br =new BufferedReader(new InputStreamReader(in)); 
      Thread.sleep(10000); 
      boolean ready = false; 
      int c = 0; 
      StringBuilder line = new StringBuilder(); 
      while((ready = br.ready()) == true){ 
       ready = br.ready(); 
       c = br.read(); 
       System.out.print(String.valueOf((char)c)); 
      } 
     }catch(Exception e){ 
     } 
    } 

ответ

1

, если упаковка команды является вариант, вы можете сделать:

# cat /usr/bin/your-enable 
#!/bin/bash 
enable 
echo "#END#" 

изменения основного (пример):

commands.add("/usr/bin/your-enable"); 

изменение printResult:

while((line = br.readLine()) != null){ 

    if (line.equals("#END#")) { 
     break; 
    } else { 
     System.out.println(line); 
    } 
} 

Надежда помогает.

+0

Yair в моем случае это невозможно. –

+0

, поэтому вы можете добавить новую команду, которая будет разделять ваши команды: «echo» # END # »« и использовать тот же код в printResult. вам придется отправлять 2 команды каждый раз, прежде чем читать. –

+0

Я не работаю на Linux-машине. его маршрутизатор с поддержкой ssh, который имеет только несколько команд. Во-вторых, в моем случае команда br.readLine сама приостанавливает –

0

Удалось найти решение. Положил занятое вращение, пока не достигнет значения br.ready(). Нам также нужно поставить Thread.sleep также перед тем, как поставить цикл занятости

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