¿Cómo saber si estás en un ssh anidado?

Aug 21 2020

Me interesa saber si hay alguna forma de saber si estoy en una sesión SSH anidada y cuántas de ellas.

Por ejemplo, From host2 ssh user1@host1 luego from host1 ssh user1@host2 termina en host1 , pero en realidad puedo salir para ir a host2 .

¿Cómo puedo saber que estoy en tal situación (en una sesión ssh anidada), además del comando de salida, por supuesto?

Respuestas

2 KamilMaciorowski Aug 21 2020 at 13:09

No es una solución perfecta porque no todos los clientes SSH admiten esto; y estos que sí se pueden configurar de forma diferente. Todavía…

sshde OpenSSH admite lo siguiente :

PERSONAJES DE ESCAPE

Cuando se ha solicitado un pseudo-terminal, sshadmite una serie de funciones mediante el uso de un carácter de escape.

Se puede enviar un solo carácter de tilde como ~~o siguiendo a la tilde por un carácter distinto a los descritos a continuación. El carácter de escape siempre debe seguir una nueva línea para que se interprete como especial. El carácter de escape se puede cambiar en los archivos de configuración usando la EscapeChardirectiva de configuración o en la línea de comando por la -eopción.

Los escapes admitidos (asumiendo el valor predeterminado ~) son:

[…]

~^Z
Antecedentes ssh_

[…]

~C
Abrir línea de comando. […] !commandpermite al usuario ejecutar un comando local si la PermitLocalCommandopción está habilitada en ssh_config(5). La ayuda básica está disponible, utilizando la -hopción.

[…]

Suponiendo que todos los clientes SSH encadenados admitan esto, y suponiendo que se hayan solicitado pseudoterminales, puede saber el número de conexiones observando cuántos caracteres de tilde se "consumen" antes de que aparezca la tilde real en la línea de comando actual. Recuerde que la tilde siempre debe seguir una nueva línea para que se interprete como especial. Mis pruebas muestran que cada conexión consume un carácter de escape.

Por ejemplo, si Enternecesita enviar ~cuatro veces para obtener uno ~en la pantalla, significa que hay tres conexiones encadenadas.

Puede poner en segundo plano cualquiera de ellos enviando Enter, un número respectivo de ~y luego Ctrl+ Z. Esto lo colocará en el shell respectivo donde puede investigar de dónde viene ( env | grep ^SSH_), dónde está ( uname -a, hostname, …), cuál es el comando en segundo plano ( jobs). Ejecutar fgpara recuperar la conexión. Lo que puede hacer depende del shell y de cómo ejecutó el respectivo ssh, no daré más detalles.

Sería bueno si hubiera una función de escape que sshimprima información básica sobre la conexión (similar a ~#). Parece que no existe tal funcionalidad (todavía).

Con ~C( Caquí significa C mayúscula, Shift+ C) y !commandpodrá investigar sin enviar nada sshal fondo. Tenga en cuenta que el valor predeterminado de PermitLocalCommandes no. AFAIK, no puede cambiarlo después de que se establezca la conexión, así que piense en el futuro.