scp з одного віддаленого сервера на інший віддалений сервер


15

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

Файл, який мені потрібно скопіювати, більший, ніж вільний простір на hdd моєї робочої станції, тому я хотів зробити:

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: Я вже зараз, але це дає лише іншу помилку (див. відредаговане питання)
Jan Spurny


@slm ні, у мене немає проблем з розміром.
Jan Spurny

Коли я знайшов пояснення помилок, я хотів додати / прийняти це як власну відповідь, але мені це здається трохи несправедливим, оскільки це насправді не вирішує проблему. Як ви вважаєте, я повинен перефразувати питання на те: Як скопіювати файл з одного сервера на другий сервер, використовуючи мою робочу станцію як реле? чи варто додати своє пояснення моєї нездатності використовувати --verbose варіант як відповідь і прийняти його?
Jan Spurny

Відповіді:


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справі.


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

Інакше другий псевдонім "два" вирішується на хості "один" , який може не існувати.


На жаль, цей варіант здається досить новим і розповсюджується у всіх дистрибутивах.
whereswalden

2

Оскільки у вас є доступ користувача до вихідного сервера (один), чому б не увійти та не запустити команду scp безпосередньо на цьому сервері ... Якщо ви переживаєте, що це займе занадто довго, то запустіть команду всередині screen потім відірвіться від екрана зCtrl+a d і нехай біжить.

Однак якщо ви повинні зробити це на своїй робочій станції, а ключі SSH від джерела до сервера призначення працюють добре, тоді надішліть scpкоманду як параметр sshкоманди, наприклад:

ssh user@source 'scp /path/to/file user@destination:/path/to/file'

Дякую, це безумовно спрацювало, за винятком того, що обидва сервери відключили PasswordAuthentication і я не можу додавати ключі один до іншого - вони не повинні мати можливість з'єднуватися один з одним.
Ян Спрунний

0

Пошук повідомлення про помилку: "Помилка перевірки ключа хоста". здавалося б, найпростіше тут робити. Я знайшов це запитання на Askubuntu під назвою: Проблема підключення SSH із помилкою "Перевірка ключа хоста ..." .

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

$ ssh-keygen -R hostname

Звідки hostnameбуде або IP-адреса, або ім’я сервера, з якого ви намагаєтесь підключитися. До речі, все вище було б на другому хості .


Я не впевнений, чи розумію. Я можу SSH до oneі twoсервери з моєї робочої станції без будь - яких проблем .. Проблема починається , коли я біжу scp one:file two:fileз робочої станції. І known_hostsфайлу немає ні на одному, ні на двох . Я просто спробував видалити ключі для двох (навіть для того, щоб бути впевненим) на своїй робочій станції, але нічого не змінилося (за винятком того , що ви впевнені, що у / п підказки).
Jan Spurny

@JanSpurny - ваше звернення до вашої робочої станції було дещо заплутаним у цьому Q, принаймні для мене. Коли ви говорите, що маєте на увазі ваш ноутбук / робочий стіл. Отже, ти робиш щось подібне, коли кажеш, що це "працює": scp workstation:file one:fileі workstation:file two:file? Очевидно, що вам не потрібно говорити "workstation: file", я просто кажу це прямо заради розмови.
slm

Що ж я зауважую, це те, що я запускав усі команди зі своєї робочої станції. Так було більше схоже: workstation$ scp one:file fileі workstation$ scp file two:file. У всякому разі, я думаю, що я це вирішив. Я додам це як власну відповідь.
Jan Spurny

@JanSpurny - Гаразд, радий, що ти це зрозумів. Дякуємо за запитання BTW!
slm
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.