Uso de ProxyCommand para saltos múltiples y authentication de request

¿Cómo puedo reescribir el siguiente command con ProxyCommand ?

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

Esto no funciona

 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 

Soy consciente de su uso con nc , pero estoy buscando la manera de usarlo con 3 saltos, y también uso esta opción con scp . Comprobé la página man de ssh_config , pero la información es bastante escasa, al less para mí.

EDITAR

Traté de usar ProxyCommand nested en otro ProxyCommand como se sugiere a continuación, pero siempre obtengo algo a lo largo de las siguientes líneas

 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. 

Afortunadamente, dado que 7.3 -J o ProxyJump sirven para mi propósito, aunque todavía tengo que trabajar en la configuration de mis keys.

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

La versión nc ya no se recomienda. Use el -W , que se proporciona en versiones recientes de OpenSSH. ¡Además, no necesita copyr la configuration a otros hosts! Toda la configuration debe hacerse en su host y no interfiere con el scp de ninguna manera. Simplemente crea un file ~/.ssh/config con:

 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 

Y luego, conéctese usando el ssh server o use scp file server:path/ . Si insistes en el delineador (o no estás seguro de lo que quieres decir con el anidamiento de ProxyCommand ), entonces como ya se señaló, es un infierno de escapes:

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

Básicamente necesitas ir desde adentro.

He hecho esto con dos saltos, pero debería funcionar para tres. La forma más sencilla es tener el file ~/.ssh/config en cada host. Por lo tanto, si desea estar en hosta y get hostd través de hostb y hostc`, puede configurar sus configuraciones de esta manera:

En hosta:~/.ssh/config :

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

En hostb:~/.ssh/config :

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

En hostc:~/.ssh/config :

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

A continuación, puede ssh hostd en cualquiera de los hosts de la cadena y hará su path a hostd .

Usar netcat para el proxy no interfiere con scp .

Si por alguna razón no quieres usar los files locales ~/.ssh/config , puedes hacer esto en 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