Uso de ProxyCommand para múltiples saltos y autenticación rápida

17

¿Cómo puedo reescribir el siguiente comando 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 forma de usarlo con más de 3 saltos, y también uso esta opción con scp. Revisé la ssh_configpágina de manual, pero la información es bastante escasa, al menos para mí.

EDITAR

Intenté usar ProxyCommandanidado en otro ProxyCommandcomo se sugiere a continuación, pero siempre obtengo algo en 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 [email protected]
debug3: send packet: type 80
debug1: Entering interactive session.

Afortunadamente, desde 7.3 -Jo ProxyJumpsirve mi propósito - aunque todavía a tener que trabajar alrededor de mi configuración de teclas.

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

Respuestas:

25

La ncversión ya no se recomienda. Utilice el -Wconmutador, que se proporciona en versiones recientes de OpenSSH. Además, ¡no necesita copiar la configuración a otros hosts! Toda la configuración debe hacerse en su host y no interfiere scpde ninguna manera. Simplemente cree un archivo ~/.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

Y luego conéctate usando ssh servero usa scp file server:path/. Si insiste en un revestimiento (o no está seguro de lo que quiere decir sobre ProxyCommandanidar), entonces, como ya se señaló, es un infierno:

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.

Jakuje
fuente
Gracias. Probé el one-liner, no funcionó. No sé si solo se trata de escapar. ¿Puedes verificar dos veces, por favor? Además, ¿puede explicar por qué es necesario anidar y encadenar no funciona?
1.61803
1
Bueno, ¿qué significa "no funciona"! ¿media? El encadenamiento funciona, pero no con scp, porque SCP espera mensajes de control de SCP, pero en su lugar recibe mensajes de control SSH y falla. Por otro lado, lo ProxyCommandhace de forma transparente y, por lo tanto, el más externo ssh(o scp) recibirá los mensajes directamente desde el otro extremo.
Jakuje
Supongo que > aparece el mensaje donde está esperando romper la continuación de la línea, es decir, el comando nunca se ejecuta.
1.61803
1
@TrevorBoydSmith Porque requiere que tengas algún programa externo (nc) instalado en todos los hosts proxy. La redirección de E / S usando -W no necesita eso y el único requisito es tener un cliente openssh instalado en su computadora.
Jakuje
2
@RomanDodin doble %debería funcionar: %%hen su caso
Jakuje
-1

He hecho esto con dos saltos, pero debería funcionar para tres. La forma más simple es tener el ~/.ssh/configarchivo configurado en cada host. Entonces, si desea estar encendido hostay llegar a hostdtravés de hostby 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

Luego puedes usar ssh hostdcualquiera de los hosts de la cadena y llegarás a ellos hostd.

Usar netcat para el proxy no interfiere con scp.

Si por alguna razón realmente no desea utilizar ~/.ssh/configarchivos locales , puede hacerlo 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
DopeGhoti
fuente
Como dije, estoy al tanto del ncuso. ¿Puedes reescribir el comando que publiqué ProxyCommandcomo una opción?
1.61803
Mencionas "eres consciente de su uso pero quieres usarlo scp". No interfiere con scp. Pero te daré el comando cómicamente largo como una edición en breve.
DopeGhoti
Gracias. ¿Podrías reescribir tu respuesta enfocándote en ProxyCommandanidar? Si relees mi publicación, verás que esa es la esencia. Pensé que podría, en lugar de anidar como lo hiciste, encadenar todos los nodos intermedios ProxyCommand. Todavía me pregunto si eso es de alguna manera posible.
1.61803
De hecho, eso es lo que se está haciendo; es mucho más difícil de leer que las configuraciones in situ debido a todas las citas anidadas (y cada vez más escapadas). Tienes que hacerlo de esa manera porque llevas todas las ProxyCommanddirectivas contigo al próximo anfitrión de la cadena.
DopeGhoti
Esto está mal. La configuración es solo en su computadora local, no se distribuye entre los hosts en el camino mientras intenta proponer.
Jakuje