Передача файлов между двумя удаленными SSH-серверами

21

Существует ли простой способ передачи файлов между двумя SSH / SFTP-серверами? Идеальным решением была бы FileZilla, но она позволяет вам только создать соединение между локальным и удаленным, но не между удаленным и удаленным.

Теоретически я мог бы открыть два окна Nautilus и подключить к некоторым ssh://server1/path/to/folderи ssh://server2/path/to/folderзатем просто вытащить файлы из одной в другую сторону. Мой опыт показывает, что это очень нестабильно. Передача файлов с размером, равным, например, 10 МБ, не является проблемой, но передача, т. Е. 10 ГБ, часто приводила к тому, что Nautilus зависал и оставался там при необходимости ps -e | grep nautilus-> kill -9 <pid>. Я также проверил то же самое с Немо и Кахой. Хотя Nemo имеет тенденцию быть более стабильным, чем два других, он все еще не совершенен и также время от времени ломается. FileZilla чрезвычайно стабильна, никогда не ломалась, но она не очень гибкая из-за упомянутого факта, что она может подключаться только к одному SSH-серверу.

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

Есть ли какое-либо приложение, которое может обрабатывать переводы между двумя SSH-серверами без перерыва? Perfect - это что-то вроде FileZilla, которая снова подхватывает работу, если соединение прервано.

Сократ
источник
Не ответ, потому что это не сайт с рекомендациями по программному обеспечению, но я уже давно пользуюсь (коммерческим) Beyond Compare ( scootersoftware.com ), и он просто отлично подходит для такого рода задач. Он предлагает два окна, каждое из которых может показывать локальный путь или URL-адрес sftp: //, будет показывать различия между папками, а его способность копировать только различия делает превосходный механизм возобновления, если он ломается, что случается очень редко по моему опыту. (Не связан с ними, кроме как быть довольным клиентом).
Гунтрам Блом поддерживает Монику

Ответы:

36

Если вы используете версию Ubuntu, которая все еще поддерживается, то ваша scpкоманда предоставит -3переключатель, который позволяет копировать файлы с remote1 на remote2 через localhost :

me@local:~> scp -3 user1@remote1:/path/to/file1 user2@remote2:/path/to/file2

Вы также можете опустить -3выключатель, но тогда вам будет нужен открытый ключ ( id_rsa.pub) из user1@remote1в файл authorized_keysиз user2@remote2:

me@local:~> scp user1@remote1:/path/to/file1 user2@remote2:/path/to/file2

scpпотом под капотом делает ssh user1@remote1сначала и оттуда scp /path/to/file1 user2@remote2:/path/to/file2. Вот почему учетные данные должны распространяться иначе, чем -3решение.

Другими словами:

  • scp -3 remote1:file1 remote2:file2передает файл с remote1 на localhost, а затем обратно на remote2 . Данные перемещаются по remote1 → localhost → remote2 . Таким образом, localhost является третьей стороной в этом сценарии -3. Чтобы это работало, вам понадобятся учетные данные с localhost на remote1 и remote2, потому что localhost подключается к ним обоим.

  • scp remote1:file1 remote2:file2копирует файл непосредственно с remote1 на remote2 со скоростью, с которой они связаны друг с другом. localhost здесь не задействован (кроме выдачи команды). Данные перемещаются удаленно1 → удаленно2 . Чтобы это работало, вам понадобятся учетные данные от localhost только на remote1, но дополнительно вам понадобятся учетные данные remote1 на remote2, потому что localhost подключается только к remote1, а затем remote1 подключается к remote2 .

Если возможно, я бы выбрал второй подход. Как уже отмечалось в некоторых комментариях: обычно сетевой кабель между remote1 и remote2 гораздо толще, чем кабель между ними и localhost .

PerlDuck
источник
2
Это просто прекрасно. ssh - швейцарский армейский нож программного обеспечения. Спасибо, я кое-что узнал.
Органический мрамор
4
Обратите внимание, что этот подход, подобно описанному в вопросе подходу nautilus, сначала передает файл на локальную машину, а затем на второй сервер. Это приведет к значительному замедлению, когда два удаленных сервера будут иметь более быструю связь между ними, чем локальный компьютер. (Например, когда удаленные серверы находятся в центрах обработки данных, а локальный компьютер имеет DSL-соединение.)
Stobor
1
@ Стобор Хорошо, спасибо. Я обновил свой ответ, чтобы уточнить, как данные передаются с и без -3.
PerlDuck
1
Будет ли второй метод работать с переадресацией агента без ключа или пароля на remote1?
Эрик Думинил
1
@EricDuminil Боюсь, я не могу сказать. У меня нет опыта работы с агентами. Но я сомневаюсь в этом, потому что remote1 должен запретить доступ, когда не указан ни ключ, ни пароль, не так ли?
PerlDuck
10

В большинстве случаев два сервера ssh могут связаться друг с другом (или, по крайней мере, один может связаться с другим), и опять же в большинстве случаев интернет рабочей станции намного хуже, чем любой из серверов.

Если это так, заказ одного сервера для переноса на другой - это путь.

ssh server1 nohup scp somefile server2:somefile

Проверьте nohup.outна сервере server1 на наличие ошибок.

Если доступность сервера противоположна, вы можете изменить, какая машина является главной:

ssh server2 nohup scp server1:somefile somefile
Джошуа
источник
7

Возможно, вы можете использовать один из нескольких интерфейсов GUI для rsync:

Есть ли приложение с графическим интерфейсом для команды rsync?

Или, возможно, вы можете использовать rsync непосредственно из командной строки для подключения к обоим удаленным серверам:

«Как rsync файлы между двумя пультами»

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

Rsync достаточно умен, чтобы выполнить какую-то работу, а затем, если что-то пойдет не так и прервет процесс, он может позже возобновить работу с того места, где остановился.

Дэвид Кэри
источник
0

Вам нужно использовать протокол SCP. scp file you want to transfer login@address_of_second_server:/path_where_you_want_to_save

Могильный Разум
источник
2
ОП хочет копировать файлы между двумя удаленными компьютерами, а не с локального компьютера на удаленный компьютер. Он также, кажется, ищет решение с графическим интерфейсом.
user68186
@ user68186 мой ответ правильный.
Могильный разум