Код Java для копирования файлов с одной машины Linux на другую машину Linux

Комментарий Marco вдохновил меня пробовать несколько вещей, о которых я не думал, и я обнаружил ответ. Ну, я предполагаю, что обнаружил альтернативу. Если кто-либо знает больше об этом, добавьте ответ.

Я должен указать заранее, как я передавал файл. Это было сделано по сети (конечно), через соединение WebDAV с моим NAS Synology.

После комментария Marco я протестировал копирование приблизительно 11,7 ГБ к NAS с помощью нескольких различных методов:

Samba: Не только была средняя скорость намного быстрее, но и она не имела waiting-for-data-to-load проблемы.

FTP: средняя скорость была быстрее, передача не остановилась для ожидания данных для загрузки в поршень, но иногда ЦП будет становиться немного забавным..., и этим я подразумеваю, что это истратило одно из ядер, и я должен был уничтожить процесс FTP, потому что это продолжало съедать ЦП даже после того, как я отменил передачу.

WebDAV: То же как прежде - RAM захватила бы набор данных, данные передадут, затем RAM вывела бы его и захватила бы больше, передача это, &tc.

Таким образом, я обнаружил, что Samba является лучшим методом в этом экземпляре. Я сделал немного поиска с помощью Google и видел, что некоторые люди чувствуют, что WebDAV является неуклюжим протоколом специально для LAN.

Однако, я не знаю, является ли это просто способом, которым WebDAV - если у других людей есть та же проблема - или если это - что-то не так с Монетным двором, или если это - просто моя конкретная установка Монетного двора. Таким образом, я думаю, что дам это за несколько дней до того, как я выберу это как лучший ответ только, чтобы видеть, есть ли у других лучшие решения/больше добавить, что я не могу добавить.

6
21.08.2014, 17:37
2 ответа

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

Вашими возможностями для Linux-систем являются:

  • SSH. Для этого требуется SSH-демон (скажем, openssh-сервер) на удаленной стороне. Так как ssh разработан для безопасности, вам придется настроить удаленный хост для аутентификации вас либо паролем, либо личным ключом. На самом деле, копирование файла может быть выполнено с помощью утилиты scp или клиентской библиотеки ssh (jsch был бы примером такого).
  • NFS. Удаленный хост устанавливает демон (например, samba) и предоставляет общий доступ к некоторым файлам. Ваш локальный компьютер (на это способен пакет cifs-utils) может смонтировать удаленное место на локальной файловой системе. Таким образом, вы можете скопировать файл на удаленный хост, просто скопировав файл локально. Аутентификация необязательна, файлы отправляются по сети.
  • FTP. На удаленной стороне устанавливается ftp-сервер, который настроен на разрешение доступа в определенные места для определенных пользователей. Затем вы можете использовать любой ftp-клиент или какую-нибудь ftp-библиотеку (например, общую сетевую библиотеку из проекта Apache), чтобы подключиться к удаленному ftp-серверу и скопировать файлы. Аутентификация необязательна, файлы отправляются по сети.

Все это кажется большим трудом, и на деле это так, потому что нет ни одного широко распространенного и стандартизованного протокола, который был бы реализован и настроен "из коробки в коробку" на большинстве систем.

2
27.01.2020, 20:26

Этот фрагмент кода можно использовать для копирования файлов на другой компьютер с Linux .

JSch jsch = new JSch();
Session session = null;
session = jsch.getSession("username","hostname",22);
session.setPassword("password");
session.setConfig("StrictHostKeyChecking", "no");
    session.connect();
ChannelSftp channel = null;
channel = (ChannelSftp)session.openChannel("sftp");
channel.connect();
    File localFile = new File("localfilepath");
    //If you want you can change the directory using the following line.
    channel.cd(RemoteDirectoryPath)
channel.put(new FileInputStream(localFile),localFile.getName());
    channel.disconnect();
session.disconnect();

с этим я добавил свой открытый ключ в удаленную систему, сгенерированный с помощью ssh-keygen . Таким образом, он не будет запрашивать пароль каждый раз, когда вы запускаете программу.

6
27.01.2020, 20:26

Теги

Похожие вопросы