it-swarm-ru.tech

Как мне сделать Multihop SCP переводы?

Я хочу скопировать файл со своего компьютера A на сервер C, но у меня есть доступ только к серверу C через сервер B.

Вместо того, чтобы сначала передавать на сервер B, войти в систему, а затем передать на сервер C, возможна ли передача файла напрямую с помощью SCP или аналогичных программ?

(Emacs tramp-mode имеет эту функцию для удаленного редактирования файлов).

87
sverrejoh

Можете добавить -o опции scp вместо .ssh/config.

scp -o ProxyCommand="ssh $jump_Host nc $Host 22" $local_path $Host:$destination_path

$jump_Host является вашим "сервером B" в этом случае.

48
John Tantalo

Предполагая OpenSSH, добавьте к вашей конфигурации SSH в .ssh/config

Host distant
ProxyCommand ssh near nc distant 22

Это приведет к тому, что SSH сможет подключаться "напрямую" к машине с именем distant через прокси через машину с именем near. Затем он может использовать такие приложения, как scp и sftp для удаленной машины.

Чтобы это работало, вам нужно установить на компьютере с именем "nc" "nc", или "netcat". Но многие современные системы уже будут иметь это.

решение tar для towo более эффективно для однократных задач, если вы запомнили синтаксис и правила работы tar.

44
tialaramex

С более свежими версиями ssh на сервере рядом с (B) машиной без netcat будет работать следующее:

Host distant
    ProxyCommand ssh near -W distant:22

Однако для этого потребуется, чтобы значение AllowTcpForwarding было равно yes (по умолчанию) на ближнем (B) компьютере.

Правка: требуется OpenSSH 5.4+ на B

19
danblack

Вы можете SSH к серверу B, используя что-то вроде

ssh -L 5022:<server C IP>:22 <user_serverB>@<server B IP>

Затем вы можете SSH к серверу C с помощью

ssh -p 5022 <user_serverC>@localhost 

Точно так же scp будет работать с использованием

scp -P 5022 foo.txt <user_serverc>@localhost:

Не забудьте использовать правильный регистр p с scp и ssh

18
Saurabh Barjatiya

Это возможно и относительно просто, даже если вам нужно использовать сертификаты для аутентификации (типично для сред AWS).

Команда ниже скопирует файлы из remotePath в server2 прямо в вашу машину по адресу localPath. Внутренне запрос scp передается через server1.

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Другой способ также работает (загрузить файл):

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p [email protected]" <localpath> [email protected]:/<remotePath>

Если вместо этого вы используете аутентификацию по паролю, попробуйте

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>

Если вы используете одинаковые учетные данные пользователя на обоих серверах:

scp -o ProxyCommand="ssh -W %h:%p [email protected]" [email protected]:/<remotePath> <localpath>
5
donhector

Если вы хотите быть по-настоящему злым, вы можете связать ssh и tar, что-то вроде tar c mydir | ssh server "ssh otherserver | tar x", но это может столкнуться с любой проблемой.

Более простым способом было бы просто установить SSH-туннель со встроенными методами SSH; посмотрите на -D переключитесь на man-страницу и просто перенаправьте какой-нибудь порт на ssh-порт другого сервера.

3
towo

Вы также можете сделать это в обратном порядке, и это может быть проще.

Предположим, у вас открыт сеанс ssh с машиной, на которую вы хотите отправить файл. Этот ПК с самым дальним прыжком, мы назовем это hop2. Ваш "прокси" Хост будет hop1. ПК, который является файлом-Происхождением, мы назовем это Происхождением.

Origin:~/asdf.txt  --> hop1 --> hop2:~/asdf.txt

Вы можете строить туннели, делая локальный порт доступным на удаленном ПК. Таким образом, мы определяем порт, который будет открыт на удаленном ПК, который будет перенаправлять на порт, который вы перенаправили с собой, когда строили туннель.

На хопе 2:

ssh -R 5555:127.0.0.1:22 <hop1_user>@<hop1_IP>
#this has the effect of building a tunnel from hop2 to hop1, making hop2's port 22 available on hop1 as port 5555

Теперь в этом открытом сеансе туннеля вы можете сделать то же самое с hop1 до file_Origin.

На прыжке 1:

ssh -R 6666:127.0.0.1:5555 <Origin_user>@<Origin_IP>
#this has the effect of building a tunnel from hop1 to Origin while also pulling the active tunnel with it, making hop1's port 5555 (hop2's port 22) available on Origin as port 6666.

Вы теперь туннелированы с hop2 на hop1 к Origin. По совпадению, теперь оба порта 5555 и 6666 открыты на Origin, которые перенаправляют на порт 22 hop2. В этом сеансе оба из следующих допустимых маршрутов scp к hop2:

По происхождению:

scp -P 6666 ~/asdf.txt <hop2_user>@<127.0.0.1>:~/asdf.txt

Таким образом, вы можете иметь произвольное количество переходов между ними, и с ним проще работать с точки зрения объединения более двух переходов.

2
SYANiDE

Попробуйте адаптировать следующий пример конфигурации openssh для настройки, которую можно использовать для нескольких хостов:

Host uat-*
     ProxyCommand ssh bastion-uat nc %h %p

Это предполагает набор серверов, начинающихся с "uat-", которые доступны только через сервер Jumpbox/Gateway "bastion-uat". Вы, вероятно, также хотите добавить ForwardAgent yes если вы используете ключ для входа в систему.

1
Benjamin Goodacre

Это не scp (который запрашивал OP), но я обнаружил, что очень просто использовать rsync для копирования с локального на удаленное через один прыжок с помощью:

rsync -v -e 'ssh -A -t [email protected] ssh -A -t [email protected]' /path/to/sourcefile :/path/to/destination

Источник: http://mjbright.blogspot.com/2012/09/using-rsync-over-multi-hop-ssh.html

Я попробовал предложенное выше -o ProxyPass и не хотел менять конфигурацию для меняющихся потребностей. Как указывает автор в приведенной выше ссылке, целевой файл, предшествующий двоеточию (:), важен для указания того, что указанный путь находится на целевом сервере. Также, используя rsync, у вас есть опции сравнения дат, синхронизации папок и т.д. Надеюсь, это кому-нибудь поможет!

1
texas-bronius