Wykorzystanie ProxyCommand do wielu przeskoków i szybkiego uwierzytelnienia


18

Jak mogę przepisać następujące polecenie za pomocą ProxyCommand?

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

To nie działa

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

Jestem świadomy jego użycia z nc, ale szukam sposobu, aby użyć go z 3+ przeskokami, a także użyć tej opcji z scp. Sprawdziłem ssh_configstronę podręcznika, ale informacje są dla mnie dość rzadkie.

EDYTOWAĆ

Próbowałem użyć ProxyCommandzagnieżdżonego w innym, ProxyCommandjak zasugerowano poniżej, ale zawsze otrzymuję coś w następujący sposób

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.

Na szczęście, ponieważ 7.3 -Jalbo ProxyJumpsłuży moim celem - choć wciąż jeszcze musieli obejść moją konfigurację klawiszy.

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

Odpowiedzi:


26

ncWersja nie jest już zalecana. Użyj -Wprzełącznika, który jest dostępny w najnowszych wersjach OpenSSH. Nie musisz też kopiować konfiguracji na inne hosty! Całą konfigurację należy wykonać na hoście i nie ma to scpżadnego wpływu na to. Wystarczy utworzyć plik za ~/.ssh/configpomocą:

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

A następnie połącz za pomocą ssh serverlub użyj scp file server:path/. Jeśli nalegasz na oneliner (lub nie wiesz, co masz na myśli mówiąc o ProxyCommandzagnieżdżaniu), to jak już wspomniano, jest to piekło ucieczek:

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

Zasadniczo musisz iść od środka.


Dzięki. Próbowałem jednego linijki, nie działało. Nie wiem czy to tylko ucieczka. Czy możesz dwukrotnie sprawdzić? Czy możesz również wyjaśnić, dlaczego zagnieżdżanie jest konieczne, a łańcuchowanie nie działa?
1.61803

1
Cóż, co działa „nie działa!” oznaczać? Łańcuch działa, ale nie działa, scpponieważ SCP oczekuje komunikatów kontrolnych SCP, ale zamiast tego otrzymuje komunikaty kontrolne SSH i kończy się niepowodzeniem. Z drugiej stronyProxyCommand robi to w sposób przezroczysty, a zatem najbardziej zewnętrzne ssh(lub scp) otrzymają wiadomości bezpośrednio z drugiego końca.
Jakuje

Dostaję > monit, gdzie czeka, aby przerwać kontynuację linii, tak myślę - tzn. Polecenie nigdy się nie wykonuje.
1.61803,

1
@TrevorBoydSmith Ponieważ wymaga zainstalowania programu zewnętrznego (nc) na wszystkich hostach proxy. Przekierowanie We / Wy za pomocą opcji -W nie wymaga tego, a jedynym wymaganiem jest zainstalowanie klienta openssh na komputerze.
Jakuje

2
@RomanDodin double %powinien działać: %%hw twoim przypadku
Jakuje

-1

Zrobiłem to z dwoma chmielami, ale powinno działać dla trzech. Najprostszym sposobem jest ustawienie ~/.ssh/configpliku na każdym hoście. Więc jeśli chcesz być włączony hostai dostać się hostdprzez via hostbi hostc`, możesz odpowiednio skonfigurować swoje konfiguracje:

W hosta:~/.ssh/config:

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

W hostb:~/.ssh/config:

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

W hostc:~/.ssh/config:

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

Możesz następnie ssh hostdna dowolnym z hostów w łańcuchu, a dojdziesz do hostd.

Użycie netcat jako proxy nie koliduje z scp.

Jeśli z jakiegoś powodu naprawdę nie chcesz używać ~/.ssh/configplików lokalnych , możesz to zrobić na 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

Jak powiedziałem, jestem świadomy ncużycia. Czy rzeczywiście możesz przepisać polecenie, które zamieściłem ProxyCommandjako opcję?
1.61803,

Wspominasz „jesteś świadomy jego użycia, ale chcesz go użyć scp”. Nie przeszkadza scp. Ale niedługo dam ci komicznie długie polecenie jako edycję.
DopeGhoti,

Dzięki. Czy możesz po prostu przepisać swoją odpowiedź, koncentrując się na ProxyCommandzagnieżdżaniu? Jeśli ponownie przeczytasz mój post, zobaczysz, że to sedno. Myślałem, że mogę zamiast zagnieżdżać się tak jak ty, połączyć wszystkie środkowe węzły ProxyCommand. Nadal zastanawiam się, czy to w jakiś sposób możliwe.
1.61803,

Tak właśnie się dzieje; jest to o wiele trudniejsze do odczytania niż konfiguracje in situ ze względu na wszystkie zagnieżdżone (i coraz bardziej unikane) cytaty. Musisz to zrobić w ten sposób, ponieważ przenosisz wszystkie ProxyCommanddyrektywy wraz z tobą do następnego hosta w łańcuchu.
DopeGhoti,

To jest źle. Konfiguracja odbywa się tylko na komputerze lokalnym, a nie jest dystrybuowana między hostami po drodze, gdy próbujesz to zaproponować.
Jakuje
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.