Как выполнять многоадресную SCP-передачу между машинами?

Как выполнять многоадресную SCP-передачу между машинами?

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

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

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

решение1

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

scp -o ProxyCommand="ssh $jump_host nc $host 22" $local_path $host:$destination_path

$jump_hostв данном случае это ваш «сервер B».

решение2

Если используется OpenSSH, добавьте в конфигурацию SSH в .ssh/config

Host distant
ProxyCommand ssh near nc distant 22

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

Для этого вам нужно установить 'nc' или netcat на машине с именем near. Но во многих современных системах он уже есть.

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

решение3

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

Host distant
    ProxyCommand ssh near -W distant:22

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

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

решение4

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

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

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

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

scp -i user2-cert.pem -o ProxyCommand="ssh -i user1-cert.pem -W %h:%p user1@server1" <localpath> user2@server2:/<remotePath>

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

scp -o ProxyCommand="ssh -W %h:%p user1@server1" user2@server2:/<remotePath> <localpath>

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

scp -o ProxyCommand="ssh -W %h:%p commonuser@server1" commonuser@server2:/<remotePath> <localpath>

Эта -Wопция встроена в новые(более) версии OpenSSH, поэтому она будет работать только на машинах с минимальной версией (5.4, если только ваш дистрибутив не перенес какие-либо функции; например, RHEL6 OpenSSH 5.3p1 включает эту функцию). Согласно примечаниям к выпуску:http://www.openssh.com/txt/release-5.4

Добавлен режим 'netcat' в ssh(1): "ssh -W host:port ..." Это подключает stdio на клиенте к одному порту на сервере. Это позволяет, например, использовать ssh в качестве ProxyCommand для маршрутизации соединений через промежуточные серверы.

%hи %pявляются заполнителями для хоста и порта.

Связанный контент