scp с одного удаленного сервера на другой удаленный сервер

15

У меня есть один большой файл на сервере, oneи я хочу скопировать его на сервер twoс помощью scp. У меня правильно настроены ключи, и я могу использовать ssh / scp для обоих серверов со своего рабочего стола.

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

scp one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

но я получил:

ssh: Could not resolve hostname one: Name or service not known

У нас здесь нет DNS (не спрашивайте меня, почему), поэтому у меня есть это в моем ~ / .ssh / config:

Host one
    Hostname        <IP address of server one>
    User            jspurny

Host two
    Hostname        <IP address of server two>
    User            jspurny

Если я попробую файл меньшего размера и перенесу его oneна свою рабочую станцию, а затем на него two, он будет работать нормально:

scp one:/opt/smallerfile.tar.gz .
scp smallerfile.tar.gz two:/opt/

При использовании IP-адресов напрямую, как предлагается в комментарии, я получил:

$ scp jspurny@<one's IP>:bigfile.tar.gz jspurny@<two's ip>:bigfile.tar.gz
Host key verification failed.
lost connection

Не ошибка:

Размер здесь не является проблемой - он был всего лишь «триггером» этой проблемы, поскольку bigfile.tar.gzна моей рабочей станции не было никакого способа хранения . Проблема возникает независимо от размера файла.

Вопрос:

Почему команда:

scp oneremote:file secondremote:file

выдает ошибку независимо от того, используете ли вы .ssh/configпсевдонимы или напрямую IP-адреса?

Решенный - вроде - все еще ищущий объяснения - я разбил большой файл на более мелкие файлы и передавал их один за другим через свою рабочую станцию. Мне все еще интересно, почему это не сработало. Так что я все равно был бы признателен за объяснение того, что было не так ..

Нашел причину, почему это не удается: кажется, я был глупым. Я думал, что команда

scp one:file two:file

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

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

Ян Спурны
источник
Вы пытались просто изменить свою команду scp, чтобы вместо этого использовать IP-адреса, такие как "scp jspurny @ ip_address_server_one: /opt/bigfile.tar.gz jspurny @ ip_address_server_two: /opt/bigfile.tar.gz".
@tchester: Я сделал это сейчас, но это дает просто другую ошибку (см. отредактированный вопрос)
Ян Spurny
Связанный? unix.stackexchange.com/questions/14187/...
ОДС
@ нет, у меня нет проблем с размером.
Ян Spurny
Поскольку я нашел объяснение ошибок, я хотел добавить / принять его как свой собственный ответ, но он кажется мне немного несправедливым, поскольку это фактически не решает проблему. Как вы думаете, я должен перефразировать вопрос в: Как скопировать файл с сервера один на сервер два, используя мою рабочую станцию ​​в качестве реле? или я должен добавить свое объяснение моей неспособности использовать параметр --verbose в качестве ответа и принять его?
Ян Сперны

Ответы:

6

Простая труба

Попробуй это:

ssh one 'cat file' | ssh two 'cat > file'

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

Разработанные туннели

Для более сложных приложений вы можете использовать ssh-туннели. Например, вы можете попробовать что-то вроде этого:

ssh -R 5001:127.0.0.1:5002 one
ssh -L 5002:127.0.0.1:22 two

Затем вы можете открыть соединение oneс localhostпортом компьютера, 5001и оно будет дважды переадресовано и завершится как соединение twoс localhostпортом 22. Это порт ssh, так что вы можете использовать его для еще одного scp, или для rsync, или для чего угодно. Вы также можете запустить rsyncсервер twoи перенаправить порт 873 вместо 22. Или вы можете использовать ncобе стороны для передачи необработанных данных, используя произвольный номер порта.

Основным преимуществом вышеупомянутого подхода является то, что у вас есть двухстороннее TCP-соединение между двумя машинами, а не только однонаправленная труба. Таким образом, обе стороны могут обмениваться информацией, что особенно важно в данном rsyncслучае.

MVG
источник
1
Благодарность! Это не совсем то, что я хотел , но то, что мне действительно нужно , и это здорово.
Ян Сперны
16

Полный кредит за этот ответ идет на /superuser//a/602436/142948

Вам нужна -3опция для scp:

scp -3 one:/opt/bigfile.tar.gz two:/opt/bigfile.tar.gz

-3: Копии между двумя удаленными хостами передаются через локальный хост. Без этой опции данные копируются непосредственно между двумя удаленными хостами.

http://www.openbsd.org/cgi-bin/man.cgi?query=scp&sektion=1

В противном случае второй псевдоним «два» будет разрешен на хосте «один» , который может не существовать.

artfulrobot
источник
К сожалению, эта опция кажется довольно новой и распространяется на все дистрибутивы.
Whereswalden
2

Поскольку у вас есть пользовательский доступ к исходному серверу (один), почему бы не войти в систему и не выполнить команду scp на этом сервере напрямую ... Если вы беспокоитесь, что это займет слишком много времени, запустите команду внутри, а screenзатем отсоединитесь от экрана с помощью Ctrl+a dи пусть работает.

Однако, если вы должны сделать это со своей рабочей станции, и ключи SSH от исходного к целевому серверу работают нормально, то отправьте scpкоманду в качестве параметра sshкоманды, например:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'
Мариос Зиндилис
источник
Спасибо, это определенно сработает, за исключением того, что на обоих серверах отключена аутентификация по паролю, и я не могу добавлять ключи от одного к другому - они не должны иметь возможность подключаться друг к другу.
Ян Сперны
0

Поиск сообщения об ошибке: «Ошибка проверки ключа хоста». казалось бы, самая простая вещь, чтобы сделать здесь. Я нашел эти вопросы и ответы на askubuntu под названием: Проблема с SSH-соединением с ошибкой «Проверка ключа хоста…» .

Один из ответов на эти вопросы и ответы показал, что проблема заключалась в конфликтующей записи в вашем ~/.ssh/known_hostsфайле. Вы можете удалить проблемные записи из этого файла с помощью любого текстового редактора или использовать эту команду для удаления записей:

$ ssh-keygen -R hostname

Где hostnameбудет IP-адрес или имя сервера, с которого вы пытаетесь подключиться. Все сказанное выше будет на хосте два по пути.

SLM
источник
Я не уверен, что понимаю. Я могу SSH oneи twoсерверы с моей рабочей станции без каких-либо проблем .. проблема начинается, когда я запускаю scp one:file two:fileс рабочей станции. И нет ни одного known_hostsфайла ни на один, ни на два . Я просто попытался удалить ключи для двоих (даже для одного, чтобы быть уверенным) на моей рабочей станции, но ничего не изменилось (за исключением того, что вы уверены, что у вас есть предложение).
Ян Сперны
@JanSpurny - ваше обращение к вашей рабочей станции было немного запутанным в этом вопросе, по крайней мере для меня. Когда вы говорите, что вы имеете в виду свой ноутбук / рабочий стол. То есть вы делаете что-то подобное, когда говорите, что это «работает»: scp workstation:file one:fileа workstation:file two:file? Очевидно, вам не нужно говорить «рабочая станция: файл», я просто говорю это прямо ради разговора.
slm
Что я имею в виду, так это то, что я запускал все команды со своей рабочей станции. Так было больше похоже: workstation$ scp one:file fileа workstation$ scp file two:file. Во всяком случае, я думаю, что я решил это. Я добавлю это как мой собственный ответ.
Ян Сперны
@JanSpurny - Хорошо, рад, что вы поняли это. Спасибо за вопрос Кстати!
SLM