Scp через прокси с одной командой с локальной машины?


54

У меня есть мой local.machine, proxy.machine и target.machine. local.machine не имеет прямого контакта с target.machine, но должен пройти через proxy.machine.

Я хочу найти файл из target.machine в local.machine. Это возможно сделать только одной командой из local.machine?

Ответы:


64

Я знаю, что это поздний ответ, но я только что нашел крутой способ сделать это. Это в основном ответ Хольгера Джаста, но в сохраненном конфигурационном файле:

Вы должны поместить это в свой ~/.ssh/configфайл на local.machine (создавая файл, если он не существует)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

После сохранения файла вы можете просто использовать

ssh target.machine

в любое время вы хотите подключиться. Scp также будет работать, поскольку он также учитывает конфигурационный файл ssh. Так же будет и Наутилус, если вы используете GNOME и хотите использовать графический интерфейс.


5
Просто быстрая заметка. Если вы используете альтернативный файл идентификации через параметр командной строки -i для ssh, вам нужно указать этот параметр как для конфигурации ProxyCommand, так и для командной строки ssh.
BillMan

7
3 вещи, которые могли бы помочь, 1) это помогло бы, если бы вы также показали Host proxy.machineстроки в том же ~/.ssh/configфайле, 2) Укажите, могут ли эти команды быть вложенными (т. Е. Клиент подключается к прокси-узлу 1, который подключается к прокси-узлу 2, который подключается к. ..target) и 3) что nc %h %pзначит
пук

Как мы можем скопировать с локального компьютера на целевой компьютер с прокси?
Мулагала

19

Вы можете сделать это одной командой, но на прокси-машине должен быть установлен netcat (nc):

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[РЕДАКТИРОВАТЬ: перепутал порядок машин ...]


Хорошая попытка, но где я должен добавить имя пользователя для прокси и для входа?
Grm

Jzst перед именами машин, с @. Я отредактировал свой ответ, чтобы отразить это.
Хольгер, просто

19

Теперь вы можете * сделать это как однострочник, нигде не требуя nc :

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

объяснение

pcredsи tcredsпредставьте свой прокси и целевые учетные данные, если требуется ( username, username:passwordи т. д.).

Это возможно из-за встроенной способности, подобной netcat, что устраняет необходимость ncв промежуточном хосте. Использование ssh -W host:portустанавливает туннель для указанного хоста и порта и подключает его к stdin / stdout, а затем scpзапускает через туннель.

Символы %hи %pв ProxyCommandзаменяются целевым хостом и указанным вами портом.

Для еще большего удобства вы можете настроить прокси в вашей конфигурации ssh:

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

и с тех пор просто сделать

scp tcreds@target.machine:file .

* начиная с версии OpenSSH 5.4, выпущенной в марте 2010 г.


1
Проверено, что это действительно работает хорошо, и не оставляет устаревших процессов NC, лежащих на прокси-машине.
LaXDragon

1
Где можно указать порт прокси?
Marged

1
@Marged Я не в состоянии попробовать его здесь в данный момент, но я думаю , что вы должны быть в состоянии включить -p <portnum>перед -Wлибо способом указать порт прокси
CupawnTae

1
Мне потребовалось некоторое время, чтобы понять, что опция -i (если она вам нужна) идет внутри кавычек. Прокси-сервер ssh по умолчанию не использует тот же закрытый ключ, который указан в любой опции -i, предоставленной непосредственно в scp. Я думаю, это очевидно, когда вы думаете об этом.
Keeely

18

Если вы не возражаете против использования rsync вместо scp, вы можете использовать следующую однострочную строку:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(вам понадобится доступ без пароля к прокси-машине)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

ОК, на самом деле две команды ...


1
Как я могу указать порт моего прокси? В моем случае8080
Marged

@Marged добавить -p <portnumber>в вашу команду ssh
weeheavy

6

Однострочник? Не с моей головы. Сначала вам нужно установить прокси, и вы не можете сделать это с помощью scp.

Делая это вручную, я открываю сеанс экрана для своего туннеля:

screen -S tunnel

Экран используется для поддержания туннеля в фоновом режиме. Используйте любую технику, которую вы хотите, чтобы туннель был открыт в фоновом режиме (ответ @ weeheavy, вероятно, самый простой). Однажды в сеансе экрана я начинаю свой туннель так

ssh -L 2222:target.machine:22 [user@]proxy.machine

Чтобы разобраться с этим, в основном говорится: «На моем локальном компьютере откройте порт 2222, и любое соединение, подключенное к localhost: 2222, передается через proxy.machine на target.machine: 22».

После того, как вы установили соединение ssh и туннель, отсоединитесь от сеанса экрана с помощью «Ca d». Чтобы вернуться к этому сеансу экрана, введитеscreen -raAd tunnel

Как только вы вернетесь в исходную оболочку, ваша команда scp будет выглядеть так:

scp -P 2222 localhost:your/file/on/target.machine local/path

Помните, что локальный порт 2222 - это просто туннель, идущий к target.machine.


3

Похоже, что scp поддерживает опцию "-o" так же, как и ssh, хотя я не уверен, как передать ему имя пользователя / пароль прокси:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

Если вы получили, nc: invalid option -- Xсмотрите https://stackoverflow.com/a/23616021/32453


Дуренький братан, сработал сразу :)
Elouan Keryell-Even

2

Как насчет:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

или, возможно, имя пользователя: пароль здесь?
rogerdpack

1

Вы можете попробовать что-то вроде:

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

Но это не сработает, если ваш proxy.machine будет запрашивать у вас пароль (этот SSH отсутствует в TTY, поэтому askpass завершится неудачно).

Если у вас более одного файла, вы можете использовать tar следующим образом (непроверенный, обычно я использую netcat):

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

Другое простое решение для передачи исходного_файла из исходного_хоста в конечный_хост через proxy_host :

Войдите на proxy_server :

ssh login@proxy_host

С прокси-сервера перенесите исходный_файл из source_host в destination_host (вы можете ввести его одной строкой, пропуская \или двумя строками, как показано ниже):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

Для этого необходимо, чтобы при входе на source_host на proxy_host использовался ключ rsa_key.


0

В случае, если вам нужно использовать открытые ключи, вам нужно что-то вроде этого.

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

Я следил за этой статьей и нашел ответ, который работает для меня. (Потому что ответы выше не работают для меня).

Как scpполучить файл через промежуточный хост (иначе хост перехода) http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html

И мой ответ как ниже:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

Пример:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

Я надеюсь, что этот ответ может помочь вам.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.