Отправьте команду SFTP с помощью runtime.exec

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

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... с именем хоста вместо «xxxxxx».

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

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

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


person Clepshydre    schedule 31.07.2014    source источник
comment
Не уверен, что это поможет, но пробовали ли вы получить поток вывода процесса и посмотреть, есть ли там дополнительная информация?   -  person Mark Wagoner    schedule 31.07.2014
comment
Вот библиотека, которую вы можете использовать. Что означает, что когда я использую его в java, он вообще не работает?   -  person Jens    schedule 11.08.2014


Ответы (1)


Я делаю это с помощью 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);

}
person Andrew    schedule 11.08.2014