ProxyCommand utilizza per più hop e richiede l'autenticazione


17

Come posso riscrivere il seguente comando con ProxyCommand?

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

Questo non funziona

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

Sono a conoscenza del suo utilizzo con nc, ma sto cercando il modo di usarlo con 3+ hop e uso anche questa opzione con scp. Ho controllato la ssh_configpagina man, ma le informazioni sono abbastanza scarse, almeno per me.

MODIFICARE

Ho provato a utilizzare ProxyCommandnidificato in un altro ProxyCommandcome suggerito di seguito, ma ottengo sempre qualcosa seguendo le seguenti linee

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.

Fortunatamente, poiché 7.3 -Jo ProxyJumpserve al mio scopo, anche se devo ancora lavorare sulla configurazione delle mie chiavi.

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

Risposte:


25

La ncversione non è più consigliata. Utilizzare l' -Wopzione, fornita nelle versioni recenti di OpenSSH. Inoltre, non è necessario copiare la configurazione su altri host! Tutta la configurazione deve essere eseguita sul tuo host e non interferisce scpin alcun modo. Basta creare un file ~/.ssh/configcon:

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

E quindi connettersi utilizzando ssh servero utilizzare scp file server:path/. Se insisti sull'allineatore (o non sei sicuro di ciò che intendi per ProxyCommandnidificazione), allora come già sottolineato, è un inferno di fughe:

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

Fondamentalmente devi andare dall'interno.


Grazie. Ho provato il one-liner, non ha funzionato. Non so se è solo la fuga. Puoi ricontrollare, per favore? Inoltre, puoi spiegare perché è necessario l'annidamento e il concatenamento non funziona?
1.61803,

1
Bene, cosa significa "non funziona!" significare? Il concatenamento funziona, ma non con scp, perché SCP si aspetta messaggi di controllo SCP, ma ottiene invece messaggi di controllo SSH e fallisce. D'altra parte, lo ProxyCommandfa in modo trasparente e quindi il più esterno ssh(o scp) riceverà i messaggi direttamente dall'altra estremità.
Jakuje,

Ricevo il > prompt dove è in attesa di interrompere la continuazione della linea, immagino - cioè, il comando non viene mai eseguito.
1.61803,

1
@TrevorBoydSmith Perché richiede l'installazione di alcuni programmi esterni (nc) su tutti gli host proxy. Il reindirizzamento IO tramite -W non è necessario e l'unico requisito è che il client openssh sia installato sul tuo computer.
Jakuje,

2
Il doppio di @RomanDodin %dovrebbe funzionare: %%hnel tuo caso
Jakuje,

-1

L'ho fatto con due salti, ma dovrebbe funzionare per tre. Il modo più semplice è ~/.ssh/configimpostare il file su ciascun host. Quindi, se vuoi essere attivo hostae accedere a hostdvia hostbe hostc`, puoi impostare le tue configurazioni in questo modo:

In hosta:~/.ssh/config:

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

In hostb:~/.ssh/config:

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

In hostc:~/.ssh/config:

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

È quindi possibile ssh hostdsu qualsiasi host della catena e farai la tua strada per hostd.

L'uso di netcat per il proxy non interferisce con scp.

Se per qualche motivo non vuoi davvero usare i ~/.ssh/configfile locali , puoi farlo su 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

Come ho detto, sono consapevole ncdell'uso. Puoi davvero riscrivere il comando con cui ho postato ProxyCommandcome opzione?
1.61803,

Dici "sei consapevole del suo utilizzo ma vuoi usarlo scp". Non interferisce con scp. Ma ti darò il comando comicamente lungo come una modifica a breve.
DopeGhoti,

Grazie. Potresti semplicemente riscrivere la tua risposta concentrandoti ProxyCommandsull'annidamento? Se rileggi il mio post vedrai che è l'essenza. Pensavo di poter, invece di annidare come hai fatto tu, incatenare tutti i nodi centrali ProxyCommand. Mi chiedo ancora se sia in qualche modo possibile.
1.61803,

Questo è in effetti ciò che viene fatto; è molto più difficile da leggere rispetto alle configurazioni in situ a causa di tutte le citazioni nidificate (e sempre più sfuggite). Devi farlo in questo modo perché stai portando tutte le ProxyCommanddirettive insieme a te al prossimo host della catena.
DopeGhoti,

Questo è sbagliato. La configurazione è solo sul tuo computer locale, non distribuita tra gli host sulla strada mentre provi a proporre.
Jakuje,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.