У меня есть доступ к 3 машинам, A, B и C. Единственные возможные (ssh) соединения:
A -> B
B <-> C
Мне нужно получить файлы от A до C, чтобы я мог просмотреть файлы от A до B, а затем скопировать их из B в C. Однако B не имеет много места на диске, так что это не вариант. Есть ли способ scp файлы из A в C через B? Обратите внимание, что у меня нет доступа с правами root ни на одной из машин, поэтому не думайте, что я могу настроить какие-либо постоянные туннели, но исправьте меня, если я ошибаюсь!
A$ rsync <options> -e 'ssh B ssh' source C:destination
Ответы:
ProxyJump
Новое в OpenSSH 7.3:
(За кулисами это просто использует ProxyCommand и
ssh -W
.)ProxyCommand
Обновлено, чтобы включить -W из других ответов:
Если у A установлен очень старый SSH-клиент (без
-W
поддержки) или если B настроен на запрет перенаправления TCP (но все еще допускает команды оболочки), используйте альтернативы:трубы
Только для одного файла:
«Туннель» через Б
Когда вы закончите, не забудьте убить ранее запущенный
ssh
процесс (который упал в фоновом режиме из-за-f -N
).-f
Запрашивает ssh перейти в фоновый режим непосредственно перед выполнением команды. Это полезно, если ssh собирается запрашивать пароли или парольные фразы, но пользователь хочет сделать это в фоновом режиме. Это подразумевает -n.-N
Не выполняйте удаленную команду. Это полезно только для переадресации портов.Обратный "туннель" через B к A
Не всегда работает, хотя:
-R
Указывает, что соединения с данным портом TCP или сокетом Unix на удаленном (серверном) хосте должны быть перенаправлены на данный хост и порт или сокет Unix на локальной стороне.источник
scp
от C, хотя B, к A, вы можете сделатьA$ scp -oProxyJump=B C:destination thefile
.Версии scp с начала 2011 года и позже могут иметь опцию «-3»:
Если у вас есть это, вы можете просто запустить:
источник
Почти все уже сказано, но вот моя последняя копейка: я использую вариант ProxyCommand без
nc
orsoc
. На основе прокси-серверов OpenSSH и Jumphost Cookbook я создал следующую конфигурацию:Итак, у нас есть следующие игроки:
Сначала я добавил свой локальный открытый ключ от моего домашнего хоста как
.ssh/id_dsa.pub
на хост,.ssh/authorized_keys
так и на целевой хост. Да, один и тот же открытый ключ от домашнего хоста для них обоих. Обычно вы ожидаете, что это открытый ключ HOP, который вы должны добавить к TARGET.Затем я
.ssh/config
немного подправил , добавив следующую запись:После того, что операция копирования столь же просто , как:
scp FILE TARGET_HOST:
. Он отображает двойные баннеры как с узла, так и с узла, но работает.Конечно , вы можете использовать выше SSH непосредственно к цели:
ssh TARGET_HOST
. Работает с scp и ssh.Другим более общим вариантом может быть утилита sshuttle, которая выглядит как своего рода прозрачный прокси (vpn поверх ssh). Так что в вашем случае A-> B <-> C это позволяет подключиться к каждому узлу в сети C: A-> B- [CDEFG]. Ему не нужен админ, но он требует Python 2.7 (3.5 тоже хорошо), что не всегда то, что мы имеем. Это стоит попробовать.
источник
в другой оболочке:
Это использует переадресацию портов. Единственным ограничением здесь является то, что хост B должен быть настроен для разрешения переадресации портов. В противном случае это должно работать нормально.
В способ объяснения,
-L
и-R
позволяют перенаправлять порты. В-L
первом порте, который указан как порт ssh, начнет прослушивать исходную машину (хост A), и он перенаправит все, что получит через этот порт через ваше соединение SSH, на хост B, а затем направит его на хост C на порт 22.редактировать
Я немного испортил синтаксис. Это настраивает форварда на вашей локальной машине.
источник
Ответ от Grawity ProxyCommand работал для меня, но, поскольку я менее знаком с SSH, потребовались некоторые эксперименты. Я подумал, что просто изложу ответ Гравити более подробно, чтобы помочь другим новичкам в SSH, таким как я. Вот определения для более явного обозначения:
Машина A: машина, на которой вы находитесь
Сервер B: userB@ip.address.for.B (сервер перехода или промежуточный сервер)
Сервер C: userC@ip.address.for.C (удаленный сервер, на который вы хотите скопировать)
ProxyCommnad
Конкретный пример
Итак, для конкретного примера, скажем, у вас есть доступ к серверу с IP
0.0.1.2
с учетной записью пользователя с именемbar
(Сервер C). Но чтобы добраться до него, вам нужно сначала войти на сервер с IP0.0.1.1
с учетной записью пользователя с именемfoo
(Сервер B). Теперь вы хотите скопировать файл ,baz.txt
расположенный на текущей машине (Machine A) для сервера0.0.1.2
«s/home/bar/
директории. Чтобы использовать вышеупомянутый ProxyCommand для этого примера, вы должны выполнить следующее:Вы также можете с легкостью скопировать файл с сервера C, изменив его порядок и место назначения. Так, например, если вы
baz.txt
уже находились на сервере,0.0.1.2
расположенном по адресу,/home/bar/
вы можете скопировать его на свой компьютер, используя:Надеюсь, что это помогает людям, которые нуждаются в вещах, изложенных для них немного больше, чем другие.
источник