Я хочу скопировать файл со своего компьютера 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
являются заполнителями для хоста и порта.