Вопрос: Как мне сделать перенос MultiPOP SCP?


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

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

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


74
2017-07-08 12:09


Источник




Ответы:


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

Host distant
ProxyCommand ssh near nc distant 22

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

Для этого вам нужно установить «nc» aka netcat на ближайшую машину. Но многие современные системы уже будут иметь это.

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


43
2017-07-08 12:25



Это тот же метод, который я использую ... В этом примере «отдаленный» будет сервером C, а «рядом» будет сервер B для уточнения ... - Jeremy Bouse
У многих современных машин нет «nc»: он обычно доступен только для Linux-машин и только по запросу (не входит в стандартную установку). - Mei
ssh теперь имеет параметр -W, который делает это автоматически без «nc», но мне интересно, почему нет scp -W - kubanczyk
Если я не единственный, это не было очевидно: если имя пользователя near отличается от имени пользователя на distant, ближайший пользователь переходит в ProxyCommand ssh nearuser@near..., а удаленный пользователь переходит в отдельный User distantuser линия. - Mu Mind
Просто введите ssh multi hope и нажмите Google. Мне повезло. - chandank


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

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

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


40
2018-01-11 17:30



Thi si мой предпочтительный способ сделать это. Прошивка .ssh / config для multihopping - не лучшее решение, если вы обращаетесь к одному и тому же хосту либо из шлюза, либо напрямую. - GabrieleV
отличный фрагмент ... Спасибо ... - Paul T.


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

Host distant
    ProxyCommand ssh near -W distant:22

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

изменить: требуется OpenSSH 5.4+ на B


19
2018-03-20 01:04



работает как шарм :) - gongzhitaao
А по OpenSSH 7.4p1, по крайней мере, есть команда «ProxyJump», в которой нужно только указать каждый пользовательский узел: host, разделенный запятыми. Ницца! - hmijail
ProxyJump хорош, но он не взял User и IdentityFile из файла конфигурации. ProxyCommand -W делает это, а также работает со scp. - rickfoosusa


Вы можете использовать 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


14
2017-07-08 13:02





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

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


3
2017-07-08 12:16





Это возможно и относительно легко, даже если вам нужно использовать сертификаты для аутентификации (типичные для 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>

2
2017-10-08 01:24





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

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

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

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

На hop2:

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.

На hop1:

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 в начало. Кстати, теперь оба порта 5555 и 6666 открыты по происхождению, которые перенаправляются на порт 22 хопа2. В течение этого сеанса оба из следующих действительных маршрутов scp для hop2:

О происхождении:

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

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


2
2017-11-18 20:22





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

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

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


1
2018-06-25 10:33



Не использовать ForwardAgent yes для этого. В этом случае переадресация агента не требуется, поскольку на бастионе не будет запущен клиент ssh, а перенаправление агента, когда оно не понадобится, просто уменьшит безопасность. И я думаю ssh отсутствует в вашей команде. Если последнее ssh используется версия, вам не нужна nc, вы можете ввести ssh -W %h:%p bastion-uat вместо. - kasperd
@kasperd Отредактировано для включения ssh. Re ForwardAgent; клиент ssh будет запускаться для запуска самой команды nc. Возможно, вы имеете в виду оболочку? - Benjamin Goodacre


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

rsync -v -e 'ssh -A -t user@jumpserver ssh -A -t user@destinationserver' /path/to/sourcefile :/path/to/destination

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

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


0
2017-12-21 17:07