У меня есть группа серверов, все правильно настроенная с пересылкой агента 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
вместо пересылки агента.
Длинная история:
В моем случае задействовано четыре хоста:
Маршрутизатор в моей квартире не получает общедоступного адреса от интернет-провайдера, поэтому домашний ноутбук и домашние серверы находятся за двойным 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 отказывается работать с двумя удаленными местоположениями.