Получение данных с SFTP-сервера с помощью JSch

Я использую JSch для получения файла с удаленного компьютера по SFTP. Вот код

public class TestSFTPinJava {

 public static void main(String args[]) {
        JSch jsch = new JSch();
        Session session = null;
        try {
            session = jsch.getSession("username", "sftp.abc.com", 22);
            session.setConfig("StrictHostKeyChecking", "no");
            session.setPassword("password");
            session.connect();

            Channel channel = session.openChannel("sftp");
            channel.connect();
            ChannelSftp sftpChannel = (ChannelSftp) channel;
            System.out.println("Directory:" + sftpChannel.pwd());
            sftpChannel.cd("remoteDirectory/");
            System.out.println("Directory after cd:" + sftpChannel.pwd());
            sftpChannel.get("remote-data.txt");

            sftpChannel.put("C:\\Users\\mona\\Documents\\local-copy.txt");
            sftpChannel.exit();
            session.disconnect();
        } catch (JSchException e) {
            e.printStackTrace();  
        } catch (SftpException e) {
            e.printStackTrace();
        }
    }
}

Теперь у меня два вопроса:

  • # P3 #
    # P4 #
  • Я не уверен, как указать место в моей локальной системе, где будет сохранен файл. sftpChannel.put("C:\\Users\\mona\\Documents\\localCopy.txt"); мне не нравится.

Пожалуйста, помогите с предложениями, спасибо!


person mona    schedule 24.08.2011    source источник
comment
Какую версию JSch вы используете? Тот, который связан Андре, имеет разные номера строк (например, в строке 1750 нет throwStatusError).   -  person Paŭlo Ebermann    schedule 25.08.2011
comment
jsch-0.1.44 - это версия JSch. Я не уверен, почему sftpChannel.get (remote-data.txt); генерирует исключение отсутствия такого файла. Вы бы что-нибудь посоветовали?   -  person mona    schedule 25.08.2011
comment
Это было в основном для того, чтобы найти правильную строку в исходном коде, подходящую для вашей трассировки стека. Наш 1750 соответствует строка 1741 в версии grepcode.   -  person Paŭlo Ebermann    schedule 25.08.2011
comment
Сервер возвращал сообщение об ошибке, такого файла нет: - /   -  person Paŭlo Ebermann    schedule 25.08.2011
comment
Как вы думаете, я использую обновленную версию JSch? Также приветствуются любые предложения с вашей стороны! Спасибо!   -  person mona    schedule 25.08.2011
comment
Вы можете ввести sftpChannel.ls() и распечатать получившийся вектор. Может это немного поможет.   -  person Paŭlo Ebermann    schedule 25.08.2011
comment
Я не думаю, что здесь проблема с версией, это просто найдите номер строки в моей версии кода.   -  person Paŭlo Ebermann    schedule 25.08.2011
comment
Я только что запустил вашу программу (заменив имя пользователя, пароль и сервер на свои, а sftpChannel.get("remote-data.txt"); на sftpChannel.get("remote-data.txt", "downloaded-data.txt");, и все заработало.   -  person Paŭlo Ebermann    schedule 25.08.2011
comment
Хорошо, это сработало для меня, теперь я могу скачать данные. Спасибо за помощь!   -  person mona    schedule 25.08.2011


Ответы (3)


Что касается вашего пункта 1, я подозреваю, что каталог по умолчанию после подключения не такой, как вы ожидаете. Попробуйте использовать абсолютный удаленный путь. sftpChannel.pwd() возвращает каталог, в котором находится файл remote-data.txt на удаленном компьютере?

Что касается вашего пункта 2, глядя на http://grepcode.com/file/repo1.maven.org/maven2/com.jcraft/jsch/0.1.42/com/jcraft/jsch/ChannelSftp.java#290 видно, что в ChannelSftp есть следующий метод:

 public void put(String src, String dst)

который действительно имеет аргумент имени файла источника и назначения.

Думаю, вы уже видели пример Jsch sftp на http://www.jcraft.com/jsch/examples/Sftp.java?

person Andre Holzner    schedule 24.08.2011
comment
Спасибо за предложение. Я sftpChannel.pwd () возвращает каталог, в котором находится мой файл remote-data.txt. Но даже после этого я получаю то же исключение. Я изменил свои коды, и вот он - person mona; 24.08.2011
comment
а если использовать абсолютный путь с get? - person Andre Holzner; 24.08.2011
comment
Нет не работает с использованием абсолютного пути с get. Также я отредактировал свои коды в вопросе, чтобы включить измененные. По-прежнему возникает то же исключение. Пожалуйста, предложите! - person mona; 24.08.2011
comment
Может быть проблема с разрешением? Можете ли вы получить файл с помощью другой клиентской программы sftp (командной строки / графического интерфейса)? - person Andre Holzner; 25.08.2011
comment
Да, я могу получить это с помощью графического клиента sftp! Так что это не проблема с разрешением - person mona; 25.08.2011
comment
Также он работает до очереди перед получением. Вот что показывает консоль Directory: / Directory после cd: / remoteDirectory 2: такого файла нет в com.jcraft.jsch.ChannelSftp.throwStatusError (ChannelSftp.java:2297) в com.jcraft.jsch.ChannelSftp._stat (ChannelSftp.java : 1750) на com.jcraft.jsch.ChannelSftp.get (ChannelSftp.java:1020) на com.jcraft.jsch.ChannelSftp.get (ChannelSftp.java:995) на SFTPCrashData.main (SFTPCrashData.java:55) - person mona; 25.08.2011
comment
Просто подсказка: я создал JSch Javadoc с комментариями, так что вы не не нужно угадывать из исходного кода, какой метод правильный. (@mona тоже.) - person Paŭlo Ebermann; 25.08.2011
comment
Я просматриваю это, и это полезно. Но не могли бы вы предложить, что лучше использовать в моем случае, т.е. я хочу загрузить файл remote-data.txt и сохранить его в своей локальной системе. Спасибо! - person mona; 25.08.2011

Простой пример приложения. Я получаю файл с удаленного сервера (из / tmp / qtmp) и сохраняю его на локальном компьютере по текущему пути

package connector;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;

import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.SftpException;

public class Fetcher {

    public void fetchFile(String username, String host, String passwd) throws JSchException, SftpException, IOException {
        JSch conn = new JSch();
        Session session = null;
        session = conn.getSession(username, host, 22);
        session.setPassword(passwd);
        session.setConfig("StrictHostKeyChecking", "no");
        session.connect();

        ChannelSftp channel = (ChannelSftp)session.openChannel("sftp");
        channel.connect();

        //change folder on the remote server
        channel.cd("/tmp/qtmp");

        InputStream in = channel.get("testScp");
        // set local file
        String lf = "OBJECT_FILE";
        FileOutputStream tergetFile = new FileOutputStream(lf);

        // read containts of remote file to local
        int c;
        while ( (c= in.read()) != -1 ) {
            tergetFile.write(c);
        } 

        in.close();
        tergetFile.close();

        channel.disconnect();
        session.disconnect();   

    }

}
person Mikro Koder    schedule 29.09.2014

У меня была аналогичная проблема, я пытался получить файлы с сервера, где все было хорошо, но я всегда получал эту ошибку:

sftpChannel.get("fil1.txt","file1.txt")

error message: 

2: No such file
at com.jcraft.jsch.ChannelSftp.throwStatusError(ChannelSftp.java:2846)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2198)
at com.jcraft.jsch.ChannelSftp._stat(ChannelSftp.java:2215)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:913)
at com.jcraft.jsch.ChannelSftp.get(ChannelSftp.java:873)
...

Я правильно перечислял все элементы каталога, используя

java.util.Vector v1 = sftpChannel.ls(dir);

Я думаю, что меня смутило то, что я смог прочитать содержимое каталога с помощью команды ls, когда вы хотите получить / поместить файлы, убедитесь, что вы сначала переместитесь с помощью «cd».

Решением было использовать следующую команду для перехода в каталог, содержащий мои файлы, с помощью простой команды cd:

sftpChannel.cd(dir);

Надеюсь, это поможет, мне потребовалось время, чтобы понять это. джоджо.

Уроки выучены:

1.- ls может читать любой каталог, независимо от того, находитесь ли вы в нем. 2.- Чтобы получить и поместить файлы, всегда убедитесь, что вы находитесь в каталоге, содержащем файлы, с помощью компакт-диска.

person Israelm    schedule 11.05.2016