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

Как использовать ssh для копирования файла несколькими переходами с пересылкой агента?

У меня есть группа серверов, все правильно настроенная с пересылкой агента SSH. Это типичная конфигурация в стиле сервера-бастиона, где единственной машиной, к которой вы можете подключиться извне, является сервер A. С сервера A вы можете использовать переадресацию агента для подключения к серверам B, C, D и т. Д. Все работает отлично.

Иногда я хочу скопировать файл с моей локальной машины на сервер B. Для этого мне нужно сначала скопировать файл на сервер A. Затем ssh на сервер A и scp файл на сервер B. Затем я удаляю файл из сервер А.

Есть ли способ скопировать файл прямо с моего компьютера на сервер B через сервер A всего за одну команду, выполняемую на моем локальном компьютере?

Если ваш sshd настроен на пересылку TCP, вы можете настроить туннель со своего компьютера на B через A, а затем использовать его для копирования через него. Создайте туннель

ssh -f -L 2050:B:22 A -N
  • -f фон команды ssh, чтобы вы могли снова использовать свой терминал.
  • -L 2050:B22 привязать порт localhost 2050 к порту 22 хоста B
  • -N не выполняйте удаленную команду.

затем скопировать со своего компьютера на B

scp -P 2050 filetocopy localhost:/destination/path 

РЕДАКТИРОВАТЬ: если вы используете

ssh -L 2050:B:22 A -N &

Затем вам сообщат PID команды ssh, когда она находится в фоновом режиме.

У меня недавно был похожий (даже более сложный) случай, и мне удалось решить проблему.

Краткий ответ: используйте ProxyCommand вместо пересылки агента.

Длинная история:

В моем случае задействовано четыре хоста:

  • Рабочий стол Linux в моем офисе
  • Сервер Linux VPN где-нибудь в Интернете
  • Домашний сервер Linux в моей квартире
  • Ноутбук с Linux в моей квартире

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

Но иногда мне нужно передать файлы. я не хочу rsync / scp несколько раз прыжок за прыжком.

ProxyCommand приходит на помощь. Поместите их в ~/.ssh/ssh_config:

# Host A is a VPN gateway with public address.
Host a.example.org
  HostName 1.2.3.4

# Host B is a home server / gateway with no public address.
# It's connected to host A via VPN.
Host b.example.org
  HostName 10.255.255.100
  ProxyCommand ssh -W %h:%p a.example.org

# Host C is my home laptop.
Host c.example.org
  HostName 192.168.2.100
  ProxyCommand ssh -W %h:%p b.example.org

# vim: ft=sshconfig:

Это могло быть связано бесконечно. Вы можете продолжать связывать хост D, хост E и т. Д., Пока у ваших хостов есть быстрые соединения. Нет необходимости делать ssh -L или ssh -D переход за шагом вручную и подключение через нестандартные порты. Теперь я могу сделать ssh c.example.org прямо из любого места, пока я могу подключиться к a.example.org. Конечно, автоматически поддерживаются другие протоколы на основе SSH, такие как Rsync, SCP, SFTP и т. Д.

Поместите что-то вроде этого в .ssh / config:

Host B-p C-p D-p
        ProxyCommand ssh -W %h:%p A.example.com
Host B-p
        Hostname B.example.com
Host C-p
        Hostname C.example.com
Host D-p
        Hostname D.example.com

и просто ssh или scp в / из B-p. Вы можете опустить -p суффикс и настройте ProxyCommand прямо на B.example.com и т. д., если ты всегда «на улице».

Это вызывает небольшую нагрузку на трафик между вашим компьютером и хостом-бастионом, но работает без пересылки агентов.

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

tar cC SRC-DIR SRC-FILE | ssh A.example.com ssh B.example.com tar xC DST-DIR

Не забудьте добавить правильное количество цитат в DST-DIR, если необходимо; он будет интерпретироваться тремя оболочками.

Использование ssh и tar очень гибкое, например, когда scp отказывается работать с двумя удаленными местоположениями.