Подтвердить что ты не робот

Как перенести файл из одного каталога в другой с помощью библиотеки Java SFTP JSch?

Мне нужно запрограммировать передачу файлов с использованием библиотеки JSch. У меня есть простой каталог с двумя папками -

введите описание изображения здесь

В папке SFTP_1 у меня есть растровое изображение. И папка SFTP_2 - это просто пустая папка. Моя цель - перенести изображение с помощью SFTP из SFTP_1 в SFTP_2.

Вот мой код:

import com.jcraft.jsch.*;

import java.awt.Desktop;

import java.nio.channels.Channel;


public class FileTransfer {

    public FileTransfer() {  
        super();                               
    }

       public static void main (String[] args) {
        FileTransfer fileTransfer = new FileTransfer();              

    JSch jsch = new JSch();

          try {

              String host = "127.0.0.1";
              int port = 22;

              String user = "user";
              Session session = jsch.getSession(user, host, port);      
              session = jsch.getSession("username", "127.0.0.1", 22);
              session.connect();

             //Channel channel  = session.openChannel("sftp");
              ChannelSftp sftp = null;
              sftp = (ChannelSftp)session.openChannel("sftp") ; //channel;
              //channel.connect();
              //Channel channel = session.openChannel("shell");  



             sftp.rename("C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_1\\house.bmp", "C:\\Users\\ADMIN\\Desktop\\Work\\ConnectOne_Bancorp\\Java_Work\\SFTP_2\\house.bmp");  //  /SFTP_1/file.txt 
              //sftpChannel.get("remotefile.txt", "localfile.txt");
              //sftpChannel.exit();
              session.disconnect();

          } catch (JSchException e) {
              e.printStackTrace();  
          } catch (SftpException e) {
              e.printStackTrace();
          }
       }
}

Что я хотел бы сделать, так это просто перенести файл из одного каталога на моем компьютере в другой каталог. любые советы оценены, спасибо!

4b9b3361

Ответ 1

Обратите внимание, что для копирования между двумя папками не нужно использовать SFTP. Можно копировать из одной папки в другую без участия протокола SFTP, который используется в основном для копирования файлов удаленно, либо с локального компьютера на удаленный компьютер, либо с удаленного компьютера на (тот же или другой) удаленный компьютер или из удаленный компьютер на локальную машину.

Это потому, что FTP - это сетевой протокол. Поэтому его использование (или любые связанные с ним протоколы) будет использовать сеть (или имитируемую сеть).

Безопасность, предоставляемая JSch, - это безопасность, предназначенная для защиты от определенных видов атак, возникающих в сетях. Он не будет обеспечивать дополнительную безопасность в машине.

Чтобы скопировать файлы между папками на одной машине, самый простой способ сделать это - не использовать JSch, например

private static void copyFileUsingJava7Files(File source, File dest)
        throws IOException {
    Files.copy(source.toPath(), dest.toPath());
}

Существуют и другие методы, и если вы действительно хотите использовать JSch, вам нужно понять, что JSch должен быть предоставлен много "лишней" информации для подключения к компьютеру, на котором вы находитесь, потому что он попытается подключиться к этому машина, как будто она соединяется по сети.

Session sessionRead = jsch.getSession("username", "127.0.0.1", 22);
sessionRead.connect();

Session sessionWrite = jsch.getSession("username", "127.0.0.1", 22);
sessionWrite.connect();

ChannelSftp channelRead = (ChannelSftp)sessionRead.openChannel("sftp");
channelRead.connect();

ChannelSftp channelWrite = (ChannelSftp)sessionWrite.openChannel("sftp");
channelWrite.connect();

PipedInputStream pin = new PipedInputStream(2048);
PipedOutputStream pout = new PipedOutputStream(pin);

channelRead.get("/path/to/your/file/including/filename.txt", pout);
channelWrite.put(pin, "/path/to/your/file/destination/including/filename.txt");

channelRead.disconnect();
channelWrite.disconnect();

sessionRead.disconnect();
sessionWrite.disconnect();

В вышеприведенном коде отсутствует проверка ошибок, обработка исключений и процедуры возврата, если файлы отсутствуют, сети не работают и т.д. Но вы должны получить основную идею.

Также должно быть очевидно, что использование сетевого протокола, в котором нет необходимости в сетевом протоколе, открывает двери для более сценариев сбоев. Используйте только метод SFTP, если ваша программа скоро предназначена для копирования файлов, которые не расположены на вашем компьютере.

Ответ 2

На самом деле JSch предназначен для удаленной работы, а модификация файловой системы - одна из таких задач. Ответ @Edwin Buck использует сеть для взаимодействия между локальными папками на удаленном хосте. Существует лучший подход:

session.connect();
ChannelExec exec = (ChannelExec) session.openChannel("exec");
exec.setCommand("cp a.out b.out");
exec.connect();

У меня нет окон на руке, в результате мой образец для unix. Но идея проста: выполнить команду копирования на удаленном хосте.

Ответ 3

Если исходный плакат действительно ищет рабочий пример JSch в действии между двумя отдельными FTP-сайтами, здесь идет:

import com.jcraft.jsch.JSch;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.Channel;
import com.jcraft.jsch.ChannelSftp;
...
JSch jsch = new JSch();
JSch session = null;
try {
  session = jsch.getSession(userid, sourceservername, sourceserverport);
  session.setPassword(sourceserverpassword);
  Properties props = new Properties();
  props.put("StrictHostKeyChecking", "no");
  session.setConfig(props);
  session.connect();
  Channel channel = session.openChannel("sftp");
  channel.connect();
  ChanelSftp channelsftp = (ChannelSftp) channel;
  channelsftp.cd(sourcefilepath);
  channelsftp.lcd(localfilepath);
  FileOutputStream fos = new FileOutputStream(new File(localfilepath + "/" + localfilename));
  channelsftp.get(sourcefilename, fos);
  fos.flush();
  fos.close();
  channelsftp.disconnect()
  session.disconnect();
} catch (Exception e) {
  e.printStackTrace();
}

На практике вы можете разбить эти действия на отдельные try {} catch() {} блокированные операторы, чтобы вводить более подробные отчеты об ошибках, а также добавлять любые информационные выходные строки для информирования пользователя о статусе и т.д. Но это приведет вас туда. Разумеется, в то время как примеры JSch лучше, чем большинство подобных примеров из бесплатных библиотек, даже таких хороших, как этот, могут быть некоторые упущения между ними вокруг деталей, которые могут сделать или сломать вашу попытку заставить все работать. Надеюсь, это поможет, если не оригинальный плакат, а затем кто-то другой ищет рабочий пример JSch. Как только вы его работаете, это действительно похоже на шарм, поэтому стоит того.

Ответ 4

Основной протокол SFTP не поддерживает дублирование удаленных файлов.

Существует черновой copy-file расширения copy-file протокола, но он поддерживается только несколькими SFTP-серверами (например, ProFTPD/mod_sftp и Bitvise SFTP-сервер).

Он определенно не поддерживается наиболее распространенным SFTP-сервером OpenSSH.

И это также не поддерживается библиотекой JSch.


Смотрите также мой ответ на Как я могу скопировать/продублировать файл в другой каталог, используя SFTP?


Таким образом, на самом деле использование команды оболочки cp по каналу exec ( ChannelExec), к сожалению, является наилучшим доступным подходом (при условии, что вы подключаетесь к серверу * nix и у вас есть доступ к оболочке).


Если у вас нет доступа к оболочке, тогда единственный вариант - загрузить файл в локальную временную папку и загрузить его обратно в новое место (или использовать потоки, чтобы избежать временного файла). Это то, что показывает принятый ответ Эдвина Бака.