Назад | Перейти на главную страницу

Передача файлов между серверами, используя ноутбук в качестве посредника

Я нахожусь в ситуации, когда у меня есть значительный объем данных, которые мне нужно передать с сервера A на сервер C. Однако:

Краткая диаграмма, изображающая ситуацию:

Есть ли способ «передать» файлы через мой ноутбук с сервера A на сервер C?

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

ssh jumpserverB ssh serverC tar cf - dir1 dir2 | ssh serverA tar xvf -

Вуаля!

Изменить: эээ - это было неправильное направление. Так что давайте поступим по-другому:

ssh serverA tar cf - dir1 dir2 | ssh jumpserverB ssh serverC tar xvf -

dir1 и dir2 - это два каталога, содержащие данные, которые вы хотите передать.

Я снова редактирую этот ответ - хотя Ф.Грег Алреди решил свою исходную проблему, - потому что его решение с использованием -J будет работать на некоторых машинах, но не на других. Это потому, что их ssh может не знать о флаге -J, как и в случае с моим. Итак, вот несколько ответов на некоторые комментарии:

  • Я использовал tar (ленточный архиватор), потому что он может обрабатывать неограниченное количество данных и - если вы используете стандартный вывод в качестве «ленты», вы можете пропустить его через что угодно, не сохраняя где-либо между ними. Таким образом, если вы можете использовать ssh с одной машины на другую, вы можете передавать данные через неограниченное количество переходов.
  • Такие вещи, как «Ошибка проверки ключа хоста», могут быть устранены с помощью ssh-ing на первую машину, затем набрав «ssh nextmachine» и так далее. Конечно, если вам нужно сменить пользователя в промежутке или указать pubkeys с помощью -i, вы также должны сделать это в своих командах ssh.
  • Да, конечно, tar может сжимать данные за вас; в большинстве случаев это ускорит процесс. Я опустил его для простоты.
  • Решение Ф. Грега в его собственном ответе несколько отличается тем, что в нем не используется трубка. Он использует перенаправление портов ssh и является отличным способом справиться с ситуациями, когда канал просто не выполняет свою работу. Опять же, вы можете добавить столько перенаправлений портов подряд, сколько захотите. Как на host1: ssh host2 -L 3333:host3:22. Как обычно, вы перейдете на host2. Снова на host1 в другом окне вы вводите ssh localhost -p 3333 -L 4444:host4:22; это приведет вас к host3. ssh -p 4444 ... вы поняли.
  • Иногда вам нужна обратная переадресация, как приходилось делать FGreg, когда он подключался к serverA. Добавив к нашим примерам -L выше, мы могли бы сделать это, используя ssh serverA -R 4444:localhost:4444 serverA; там мы можем ssh -p 4444 localhost связаться с host4 или scp -P 4444 localhost.
  • Конечно, мы можем туннелировать совершенно другие вещи в и из / в другие порты, но это станет общим постом в блоге ssh, поэтому я остановлюсь на этом.

Спасибо Andrzej A. Filip за указание https://unix.stackexchange.com/questions/85292/scp-from-one-remote-server-to-another-remote-server

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

  1. Добавьте публичный SSH-ключ ServerA к authorized_keys на ServerC
  2. С ноутбука перенаправьте удаленный порт на ServerA на локальный порт на ноутбуке

    [user@laptop]$ ssh -R 5001:localhost:5002 serverA -N
    
  3. С портативного компьютера перенаправьте локальный порт на портативном компьютере на удаленный порт на ServerC (через узел перехода ServerB)

    [user@laptop]$ ssh -J userb@serverB -i ~/.ssh/id_rsa.pub -L 5002:localhost:22 userb@serverC -N
    
  4. С ServerA, scp файлы через порт 5001

    [usera@serverA]$ scp -P 5001 ./* userb@localhost:/data/location/on/serverC
    

Это немного многословно, но, похоже, работает.

Данные никогда не хранятся на ноутбуке и, по сути, проходят через туннель SSH следующим образом:

ServerA:5001 -> laptop:5002 -> ServerC:22