2016-07-14 7 views
1

Ich habe eine Anforderung, bei der ich mich auf einem Unix-Server anmelden, Benutzer wechseln, einige Befehle ausführen und dann die von diesen Befehlen erstellten Dateien scp auf einen anderen Server scp. Ich bin in der Lage, eine Verbindung mit dem Server, sudo Login und Ausführen von Befehlen ausführen, aber ich kann nicht scp Dateien direkt auf einen anderen Remote-Server.Dateiübertragung zwischen Remote-Servern mit Jsch

Ich benutze Jsch Glas für diese. Unten ist mein Code.

public void executeChannel (Session Sitzung, String-Befehl, String pwd, List-Datei) throws Exception {

logger.info("************************Start of executeChannel() method*****************************"); 
    Channel channel = session.openChannel("exec"); 

    // below line avoids "sudo: no tty present and no askpass program" error 

    ((ChannelExec) channel).setPty(true); 

    // this line ensures password prompt is not displayed after sudo user 
    /** 
    * -S The -S (stdin) option causes sudo to read the password from the standard input instead of the terminal device. 
    * -p The -p (prompt) option allows you to override the default password prompt and use a custom one. 
    */ 

    String filename = file.toString().replace("[", "").replace("]", "").replace(",", ""); 
    System.out.println("sudo -S -p '' "+command+" "+filename+" server2:/dir1/dir2/dir3/"); 

    ((ChannelExec)channel).setCommand("sudo -S -p '' "+command+" "+filename+" server2:/dir1/dir2/dir3/"); 

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

    InputStream in = channel.getInputStream(); 
    OutputStream out=channel.getOutputStream(); 

    BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

    channel.connect(); 
    out.write((pwd+"\n").getBytes()); 


    byte[] tmp=new byte[1024]; 
    while(true){ 
     logger.info("start of while(true) method, is channel connected? "+channel.isConnected()); 

     br.readLine(); 
     while(br.readLine() != null){ 
      System.out.println("channel.isConnected() "+channel.isConnected()); 
      int i = in.read(tmp, 0, 1024); 

      if(i<0) break; 

      System.out.println("printing putty console: \n"+new String(tmp,0,i)); 
     } 
     if (channel.isClosed()){ 
      System.out.println("Exit Status:- "+channel.getExitStatus()); 
      break; 
     } 

     try{ 
      Thread.sleep(1000); 
     } 
     catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    out.flush(); 
    br.close(); 
    System.out.println("DONE"); 

} 

command = sudo su -pentaho; cd/dir1/dir2 /; ls -lrt; scp Beim Ausführen des obigen Codes werden Befehle bis ls -lrt korrekt ausgeführt und ich kann die Ausgabe sehen. Danach hängt der Code jedoch. Es gibt keine Ausnahme, die durch den Code ausgelöst wird, daher weiß ich nicht, was passiert.

Jede Hilfe würde sehr geschätzt werden.

Antwort

0

Es stellte sich heraus, dass ich die Ausgabe der Putty-Konsole nicht richtig druckte. Ich habe das Problem herausgefunden. Lösung war, den Befehl zu ändern.

Entfernen von sudo -S -p 'aus dem Befehl und Ersetzung ursprünglichen Befehls mit Sudo su - Benutzer -c "meine Befehle" hat den Trick.