2017-03-27 13 views
0

JSF를 사용하여 TFTP 서버에 라우터의 구성을 보내려고합니다. Main 클래스로 코드를 테스트 할 때 작동하지만이 코드를 버튼 액션에 통합하려고하면 작동하지 않습니다.JSch에서 SSH를 통해 실행되는 명령에 입력/부속 명령 제공 JSF 사용

11 : 53 : 25,279 INFO [표준 출력 (기본 작업-11) 설립 연결 ...

11시 53분 이이 출력입니다

public Void SendConfigViaTftp(Router r) { 
     int port=22; 
     String name = r.getRouterName(); 
     String ip=r.getRouterIP(); 
     String password =r.getRouterPassword(); 
     try 
      { 
      JSch jsch = new JSch(); 
      Session session = jsch.getSession(name, ip, port); 
       session.setPassword(password); 
       session.setConfig("StrictHostKeyChecking", "no"); 
      System.out.println("Establishing Connection..."); 
      session.connect(); 
       System.out.println("Connection established."); 


       ChannelExec channelExec = (ChannelExec)session.openChannel("exec"); 

       InputStream in = channelExec.getInputStream(); 
      channelExec.setCommand("enable"); 

     channelExec.setCommand("copy run tftp:"); 
     OutputStream out = channelExec.getOutputStream(); 

     channelExec.connect(); 

     System.out.println("Copy."); 
     out.write(("192.168.18.1 \n").getBytes()); 
     System.out.println("IP."); 
     out.write(name.getBytes()); 
     System.out.println("name."); 
     out.flush(); 
     out.close(); 


       session.disconnect(); 
       return true; 


       } 
     catch(Exception e){System.err.print(e); 

     } 


} 

내 세션 빈 코드 : 25,516 정보 [표준 출력] (기본 작업 -11) 연결이 설정되었습니다.

11 : 53 : 25,578 정보 [표준 출력] (기본 작업 -11) 복사.

11 : 53 : 25,578 정보 [표준 출력] (기본 작업 -11) IP.

11 : 53 : 25,578 정보 [표준 출력] (기본 작업 -11) 이름입니다.

<p:commandButton value="Sauvegarder(TFTP)" action="#{ListBean.sauvegardeTFTP(rtr)}" update=":routeurs" ><f:ajax disabled="true"/></p:commandButton> 

나는 문제가 내 JSF 응용 프로그램의 OutputStream에 문제가 있음을 확신 내 버튼의 코드입니다. 어떤 사람이 나를 도울 수 있습니까?

답변

0

귀하는 문제를 디버깅하는 데 사용할 수있는 정보를 제공하지 않았습니다. "그것은 작동하지 않는다"문제 설명이 아니다.


어쨌든, 하나의 명백한 문제가 명령 출력을 읽는 코드를 제거하고 당신이 끝까지 명령을 기다리는 다른 방법으로 대체하지 않았다고한다. 따라서 명령이 끝나기 전에 연결이 종료되고 명령이 종료됩니다. 당신이 세션을 닫기 전에

는 채널에 대한

대기가 폐쇄 될 :

while (!channelExec.isClosed()) Thread.sleep(100); 

또는 유지 당신은 command output stream reading code from your original question (어디서든 출력을 전달할 필요가 없습니다) :

InputStream in = channelExec.getInputStream(); 

// ... 

BufferedReader reader = new BufferedReader(new InputStreamReader(in)); 
String line; 
while ((line = reader.readLine()) != null) 
{ 
} 

session.disconnect(); 
+0

그것은 때 작동 난 기본 자바 클래스에서 그것을 테스트 버튼을 행동에 통합 할 때 그것을 테스트합니다. 설명에, 그것은 out.print()를 포함하는 줄 주석 것 같습니다. 시스템은 이러한 행을 실행하지 않으며 오류를 표시하지 않습니다. – user6624302

+0

그러나 우연의 일치 일 수 있습니다. 연결이 얼마나 빨리 종료되는지에 따라 다릅니다. 간단한 경쟁 조건. 적어도 내 제안을 시도 했니? –

+0

나는 시도했다. 그러나 여기 나는 출력의 내용을 읽는 것에 신경 쓰지 않았다. 단지 명령을 삽입하고 싶다. while ((line = reader.readLine())! = null)을 사용하면 출력 내용을 복구 할 수 있습니다. 여기에있는 문제는 Jsf 출력 스트림이 나를 위해 작동하지 않습니다. – user6624302