Прокрутити проксі-сервер з однією командою з локальної машини?


54

У мене є свій local.machine, proxy.machine та target.machine. local.machine не має прямого контакту з target.machine, але він повинен пройти проксі.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. Так буде і Nautilus, якщо ви використовуєте GNOME і хочете використовувати GUI.


5
Просто швидка примітка. Якщо ви використовуєте альтернативний файл ідентичності через параметр командного рядка -i для ssh, вам потрібно вказати цей параметр як для конфігурації ProxyCommand, так і для командного рядка ssh.
BillMan

7
3 речі, які можуть допомогти, 1) це допоможе, якщо ви також показали Host proxy.machineрядки в одному ~/.ssh/configфайлі; 2) згадайте, чи можуть ці команди вбудовуватися (наприклад, клієнт підключається до хоста 1 проксі, який підключається до хоста проксі 2, який підключається. .. ціль) і 3) що nc %h %pозначає
puk

Як ми можемо скопіювати з локальної машини на цільову машину за допомогою проксі?
Mulagala

19

Ви можете це зробити в одній команді, але вам потрібно встановити netcat (nc) на проксі-сервері:

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

[EDIT: змішаний порядок машин ...]


Гарна спроба, але де я повинен додати ім'я користувача для проксі та для входу?
грм

Jzst перед іменами машини, із знаком @. Я відредагував свою відповідь, щоб це відобразити.
Холгер Тільки

19

Тепер ви можете це зробити * як однолінійний, нікуди не вимагаючи nc :

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

Пояснення

pcredsі tcredsпредставляють свої проксі і цільові облікові дані , якщо це необхідно ( username, username:passwordі т.д.).

Це можливо через вбудовану мережеподібну здатність, усуваючи вимогу 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
Де я можу вказати порт проксі-сервера?
Мардж

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

1
Це мені потрібно якийсь час , щоб з'ясувати , що опція -i (якщо потрібно) йде всередині лапок. Проксі ssh за замовчуванням не використовує той самий приватний ключ, визначений будь-якою опцією -i, наданою безпосередньо для scp. Я думаю, це очевидно, коли ти думаєш про це.
Кілі

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 додати -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

Пам'ятайте, що localhost порт 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



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, тому пропуск не вдасться).

Якщо у вас є більше одного файлу, ви можете використовувати так, як цей (неперевірений, я зазвичай використовую netcat таким чином):

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

1

Інша просте рішення для передачі ісходний_файл від source_host до destination_host ЧЕРЕЗ proxy_host :

Увійдіть на proxy_server :

ssh login@proxy_host

З проксі-сервера перенесіть source_file з source_host до призначення_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.