2014-07-31 2 views
0

Я хотел бы загрузить файл с сервера sftp с помощью класса Runtime of Java. Я не могу использовать такую ​​библиотеку, как Jsch или SSHJ, потому что мне нужно использовать опцию -B для увеличения размера буфера. Я пытался с этим кодом до сих пор:Отправьте команду SFTP с помощью runtime.exec

public void download(String source, String destination,String port, String user, String host){ 
    Runtime runtime = Runtime.getRuntime(); 
    String cmd = "sftp -oPort=" + port + " -B 150000 "+ user + "@" + host + ":" + source + " " + destination; 

    String[] args = { "/bin/sh", "-c", cmd }; 
    try { 
     long startTime = System.currentTimeMillis(); 
     log.info("cmd: "+ cmd); 
     final Process process = runtime.exec(args); 
     process.waitFor(); 
     long stopTime = System.currentTimeMillis(); 
     long elapsedTime = stopTime - startTime; 
     System.out.println("Time: "+elapsedTime); 

     BufferedReader bre = new BufferedReader(new InputStreamReader(process.getErrorStream())); 
     StringBuffer sbe = new StringBuffer(); 
     String lineError; 
     while ((lineError = bre.readLine()) != null) { 
      sbe.append(lineError).append("\n"); 
     } 
     String answerError = sbe.toString(); 
     if(answerError.length()>0)log.error("Error:"+answerError); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

Я получаю сообщение об ошибке: Подключение к XXXXXXX ... с именем хоста вместо «хххххх»

Я попробовал команду непосредственно в putty, и она отлично работает, но когда я использую ее в java, она не работает вообще. Я также попробовал команду scp с runtime.exec() для загрузки вместо sftp и этой работы.

У кого-то есть ключ, почему он не работает? Я не могу найти пример этого метода. Или кто-то знает библиотеку для передачи sftp, которая позволяет установить параметр -B? Возможно, я пропустил метод в Jsch и Sshj.

Заранее спасибо

+0

Не уверен, что это поможет, но попробовали ли вы получить поток выходных данных процесса и посмотреть, есть ли там какая-либо информация? –

+0

[Здесь] (http://www.jcraft.com/jsch/examples/Sftp.java.html) - это библиотека, которую вы можете использовать. Что означает «когда я использую его в java, он вообще не работает»? – Jens

ответ

0

Я делаю это с помощью PSFTP на окнах. Я ожидаю, что ваши результаты с использованием sftp на * nix должны быть одинаковыми.

static java.io.File downloadFileViaSftp(String file) { 
    String string = null; 

    try { 
     String c = "psftp -l user -P 22 -v -pw password hostname"; 
     Process p = Runtime.getRuntime().exec(c); 

     OutputStream out = p.getOutputStream(); 

     Writer out2 = new BufferedWriter(new OutputStreamWriter(out)); 

     out2.write("get " + file + "\n"); 
     out2.flush(); 
     out2.write("close\n"); 
     out2.flush(); 
     out2.write("quit\n"); 
     out2.flush(); 
     out2.close(); 

     InputStream in = p.getInputStream(); 
     InputStream err = p.getErrorStream(); 

     BufferedReader bufferedreader1 = new BufferedReader(new InputStreamReader(in), 999999); 
     BufferedReader bufferedreader2 = new BufferedReader(new InputStreamReader(err), 999999); 

     while ((string = bufferedreader2.readLine()) != null) { 
      System.out.println("2=" + string); 
      System.out.flush(); 
     } 
     bufferedreader2.close(); 

     while ((string = bufferedreader1.readLine()) != null) { 
      System.out.println("1=" + string); 
      System.out.flush(); 
     } 
     bufferedreader1.close(); 

     int x = p.waitFor(); 
     p.destroy(); 

    } catch (Exception e) { 
     e.printStackTrace(); 
     return null; 
    } 

    return new java.io.File(file); 

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