2013-11-28 2 views
1

Я выполняю команду rm через ssh, используя библиотеку jsch. Команда отправляется и выполняется правильно. Но когда файл я хочу удалить, не найден в каталоге, я получаю сообщение об ошибке следующим образом:ssh через java, ошибка магазина в переменной

No such file or directory 

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

В настоящее время отображается это сообщение, когда выполняются следующие:

((ChannelExec)channel).setErrStream(System.err); 
InputStream in=channel.getInputStream(); 
channel.connect(); 

после channel.connect() отображается MESG сообщение об ошибке. Как я могу сохранить его в переменной, скажем, строку и распечатать ее после завершения?

Ниже приведен основной класс.

 String SSHHOST = "127.0.0.1"; 
     int SSHPPORT = 22; 
     String SSHPUSER = "user"; 
     String SSHPPASS = "pass";  
      StringBuilder result = new StringBuilder(); 
     System.out.println("Connecting To Server "+SSHHOST); 
     JSch jsch = new JSch(); 
     Session session=jsch.getSession(SSHPUSER, SSHHOST, 22); 
      session.setConfig("StrictHostKeyChecking", "no"); 
      session.setPassword(SSHPPASS); 
      session.connect(); 
      Channel channel=session.openChannel("exec"); 
      ((ChannelExec)channel).setCommand("find /home/test/DC* -print -exec rm {} \\;|wc -l"); 
      channel.setInputStream(null);       
      ByteArrayOutputStream bos = new ByteArrayOutputStream(); 
      ((ChannelExec)channel).setErrStream(bos) ;    
      ((ChannelExec)channel).setErrStream(System.err);    
      InputStream in=channel.getInputStream(); 
      channel.connect();   
      String result2 = bos.toString();      
      System.out.println(result2); 
      byte[] tmp=new byte[1024]; 
      while(true) 
      { 
       while(in.available()>0) 
       { 
       int i=in.read(tmp, 0, 1024); 
       if(i<0)break; 
       out=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(); 
      int status = channel.getExitStatus();   
      System.out.println(out.trim()); 
      if (channel.getExitStatus() == 0) 
      { 
       System.out.println("Perso file purging process completed successfully."); 
       System.out.println("exit-status: "+channel.getExitStatus()); 
       System.out.println("Number of perso files deleted : "+out);     
      } 
      else 
      { 
       System.out.println("Perso file purging process completed with errors."); 
      } 

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

ответ

0

я был в состоянии хранить ошибку в файле с помощью FileOutputStream

FileOutputStream fos = null; 
File file = new File("errors.txt"); 
try 
{ 
    fos = new FileOutputStream(file); 
} 
catch(IOException ioe) 
{ 
    System.err.println("redirection not possible: "+ioe); 
    System.exit(-1); 
} 
PrintStream ps = new PrintStream(fos);    
((ChannelExec)channel).setErrStream(ps); 
2

Это немного догадки от меня, но .....

Вы, кажется, настройки потока ошибок вашего объекта канала к System.err вашего приложения - если вы не перенастроить систему .err вашего приложения, чтобы указать на другое место, это будет консоль.

Каковы аргументы setErrStream? Если это OutputStream, вы можете заставить его написать ByteArrayOutputStream, а затем построить строку из этого?

+0

Аргумент OutputStream. можете ли вы указать, как написать ByteArrayOutputStream, а затем построить строку из этого? – Shann

+0

Что-то вроде: ByteArrayOutputStream bos = новый канал ByteArrayOutputStream(); (канал ChannelExec) .setErrStream (bos); InputStream in = channel.getInputStream(); channel.connect(); Строковый результат = bos.toString(); – DaveH

+0

Я обновил код. но я все еще не могу получить сообщение об ошибке. Я разместил основной класс в вопросе. – Shann

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