ProxyCommand використовується для безлічі стрибків і швидкої аутентифікації


18

Як я можу переписати наступну команду ProxyCommand?

ssh -l username1 -t jumphost1 \
ssh -l username2 -t jumphost2 \
ssh -l username3 -t jumphost3 \
ssh -l username4    server

Це не працює

ssh -o ProxyCommand="\
ssh -l username1 -t jumphost1  \
ssh -l username2 -t jumphost2  \
ssh -l username3 -t jumphost3" \
    -l username4    server

username1@jumphost1's password:
Pseudo-terminal will not be allocated because stdin is not a terminal.
Permission denied, please try again.
Permission denied, please try again.
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).
ssh_exchange_identification: Connection closed by remote host

Я знаю про його використання nc, але шукаю спосіб використовувати його з 3+ хмелями, а також використовую цю опцію за допомогою scp. Я перевірив ssh_configсторінку man, але інформація є досить мізерною, принаймні для мене.

EDIT

Я спробував використовувати ProxyCommandвкладені в іншому, ProxyCommandяк запропоновано нижче, але я завжди отримую щось у наступних рядках

debug3: ssh_init_stdio_forwarding: 192.17.2.2:2222
debug1: channel_connect_stdio_fwd 192.17.2.2:2222
debug1: channel 0: new [stdio-forward]
debug2: fd 4 setting O_NONBLOCK
debug2: fd 5 setting O_NONBLOCK
debug1: getpeername failed: Bad file descriptor
debug3: send packet: type 90
debug2: fd 3 setting TCP_NODELAY
debug3: ssh_packet_set_tos: set IP_TOS 0x10
debug1: Requesting no-more-sessions@openssh.com
debug3: send packet: type 80
debug1: Entering interactive session.

На щастя, оскільки 7.3 -Jабо ProxyJumpслужить моєму призначенню - хоча мені все одно доведеться працювати над налаштуванням своїх ключів.

ssh -q -J user1@jumphost1,user2@jumphost2,user3@jumphost3 user@server

Відповіді:


26

ncВерсія не рекомендується більше. Використовуйте -Wперемикач, який надається в останніх версіях OpenSSH. Крім того, вам не потрібно копіювати конфігурацію на інші хости! Всю конфігурацію потрібно зробити на вашому хості, і це ніяк не заважає scp. Просто створіть файл за ~/.ssh/configдопомогою:

Host jumphost1
  User username1
Host jumphost2
  User username2
  ProxyCommand ssh -W %h:%p jumphost1
Host jumphost3
  User username3
  ProxyCommand ssh -W %h:%p jumphost2
Host server
  User username4
  ProxyCommand ssh -W %h:%p jumphost3

А потім підключіться за допомогою ssh serverчи використанням scp file server:path/. Якщо ви наполягаєте на oneliner (або не впевнені, що ви маєте на увазі під ProxyCommandгніздування), то, як уже зазначалося, це пекло втечі:

ssh -oProxyCommand= \
  'ssh -W %h:%p -oProxyCommand= \
    \'ssh -W %h:%p -oProxyCommand= \
      \\\'ssh -W %h:%p username1@jumphost1\\\' \
    username2@jumphost2\' \
  username3@jumphost3' \
username4@server

По суті, потрібно йти зсередини.


Спасибі. Спробував однолінійку, не вийшло. Я не знаю, чи це лише втеча. Чи можете ви двічі перевірити, будь ласка? Також, чи можете ви пояснити, чому гніздування необхідне, а ланцюжок не працює?
1.61803,

1
Ну, а що "не працює!" означає? Ланцюг працює, але не з scp, тому що SCP очікує повідомлень управління SCP, а натомість отримує повідомлення управління SSH та виходить з ладу. З іншого боку, це ProxyCommandробить прозоро, і тому зовнішня ssh(або scp) отримає повідомлення безпосередньо з іншого кінця.
Jakuje

Я отримую > підказку, де чекає, щоб перервати продовження рядка, я думаю - тобто команда ніколи не виконує.
1.61803

1
@TrevorBoydSmith Оскільки він вимагає, щоб на всіх хостах проксі було встановлено зовнішню програму (nc). Перенаправлення IO за допомогою -W цього не потребує, і лише вимога полягає у встановленні на вашому комп’ютері відкритого клієнта.
Jakuje

2
@RomanDodin дубль %повинен працювати: %%hу вашому випадку
Jakuje

-1

Я зробив це з двома хмелями, але це має працювати за три. Найпростіший спосіб - встановити ~/.ssh/configфайл на кожному хості. Отже, якщо ви хочете бути включеним hostaі дістатися до hostdvia hostbі hostc`, ви можете встановити свої конфігурації таким чином:

В hosta:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostb nc %h %p 2> /dev/null

В hostb:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostc nc %h %p 2> /dev/null

В hostc:~/.ssh/config:

Host hostd
    User username
    ProxyCommand ssh hostd nc %h %p 2> /dev/null

Потім ви можете ssh hostdна будь-якому з хостів ланцюга, і ви зробите свій шлях hostd.

Використання netcat для проксі не заважає scp.

Якщо ви чомусь не хочете використовувати локальні ~/.ssh/configфайли, це можна зробити hosta:

ssh -oProxyCommand='ssh -oProxyCommand=\'ssh -o ProxyCommand=\\\'ssh username@hostd nc %h %p 2>/dev/null\\\' username@hostc nc %h %p 2> /dev/null' username@hostb nc %h %p 2> /dev/null' username@hostd

Як я вже сказав, мені відомо про ncвикористання. Чи можете ви насправді переписати команду, яку я розмістив, ProxyCommandяк варіант?
1.61803

Ви згадуєте "ви знаєте його використання, але хочете використовувати scp". Це не заважає scp. Але незабаром я дам вам команду довгий, як редагування.
DopeGhoti

Спасибі. Чи можете ви просто переписати свою відповідь, зосередившись на ProxyCommandгніздування? Якщо ви перечитаєте мій пост, ви побачите, що це суть. Я думав, що можу замість гніздування, як ти, зав'язати всі середні вузли ProxyCommand. Я все ще дивуюсь, чи це якось можливо.
1.61803

Це насправді те, що робиться; прочитати просто набагато складніше, ніж конфігурації in situ через усі вкладені (і все більше вникаючі) цитати. Ви повинні це зробити так, тому що ви переносите всі ProxyCommandдирективи разом із собою до наступного хоста ланцюга.
DopeGhoti

Це неправильно. Конфігурація є лише на вашому локальному комп’ютері, не поширюється між хостами так, як ви намагаєтесь запропонувати.
Jakuje
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.