Me conecto a varias máquinas constantemente, desde diferentes ubicaciones físicas (y, por lo tanto, diferentes máquinas físicas). La mayor parte de esto se hace a través de ssh, a veces se requiere una máquina de puerta de enlace o dos (que invoco a través de ProxyCommand
in ~/.ssh/config
). ¿Me gustaría saber si hay un método para identificar la IP o el nombre de host de la máquina que llama a la conexión inicial (es decir, la máquina en la que estoy trabajando) en el extremo remoto?
- No quiero enviar variables de entorno ya que algunas máquinas no tengo root para configurar
PermitUserEnvironment
. - La
$SSH_CLIENT
variable de entorno es útil para conexiones directas, pero solo enumera la puerta de enlace más reciente.
Mi idea actual para una solución es agarrar $SSH_CLIENT
, ssh, encontrar el $SSH_CLIENT
valor de esa máquina y repetir hasta que no exista; luego tome el nombre de host y retírelo de alguna manera.
Sin embargo, parece un trabajo de pirateo; ¿Alguien tiene un mejor método?
Estoy trabajando principalmente en un shell bash, pero también estoy contento con cualquier sugerencia que no lo use también.
fuente
Respuestas:
Nunca lo he intentado, pero puedo pensar en algo que pueda funcionar: no dejes que SSH inicie tu shell de inicio de sesión, pero toma el asunto en tus propias manos. Puede decirle a SSH que ejecute comandos arbitrarios. En vez de
correría algo en la línea de
Lo que esto hace es que le da a SSH algo más que hacer en lugar de iniciar un shell de inicio de sesión. Ese algo es una cadena, que se ejecutará como comando de forma remota. Usamos esto para lanzar un shell de una manera muy especial: le damos una variable de entorno
DAT_ORIGIN_HOST
, que contiene nuestra ip en eth0 (puede que tenga que cambiar eso).El truco que realizamos es que ponemos el comando para ejecutar de forma remota en dobles qoutes
"
. Las comillas dobles (al menos en Bash) significan que ANTES DE QUE LA CADENA SE PASE A SSH, nuestro shell lo escanea y realiza expansiones / reemplazos, cuando corresponda. Esto significa que nuestro shell evaluará la parte `$ (ifconfig ...), a nuestra dirección IP actual y pasará ssh una cadena que contiene la definición de una variable ambiental con nuestra dirección IP local.Una vez conectado a la máquina remota,
echo $DAT_ORIGIN_HOST
debe imprimir su dirección IP.Para desarrollar esa llamada a SSH, desvergonzadamente tomé desde aquí para extraer la dirección IP y aquí para el -t y cómo lanzar algo interactivo
Exención de responsabilidad: Estoy seguro sobre el
-l
y-i
opción de/bin/bash
. Quizás necesites omitirlos.fuente
Id. Entendí correctamente que estás conectado directamente desde la máquina de origen al destino con
proxycommand
saltos. Y así, aquí hay tres hacks para usted (tercero agregado después del comentario sobre el escenario de uso). Primero) Use el reenvío de puerto remoto para que pueda volver a su máquina de origen con-R remotemachineport:dstonlocalnet:dstportonlocalnet
Segundo) Abuso
AcceptEnv LC_*
en el blanco. No es agradable, pero es bastante común permitir variables LOCALE incluso cuando AcceptUserEnviconment no está disponible. Entonces ahora puedes hacer:Tercero) Use ssh remote forward para identificar el host o el tipo de host.
Ahora conéctese con el reenvío de puertos:
fuente
AcceptEnv LC_*
está permitido, pero no es un estándar, activado de forma predeterminada?AcceptEnv
directiva en/etc/ssh/sshd_config
. Recuerde reiniciarsshd
si este archivo se cambia.Puede escribir
who -m
en el extremo remoto para obtener información sobre el usuario actualmente conectado (incluido el nombre de host).who
le brinda información sobre los usuarios que han iniciado sesión y el-m
conmutador le muestra "solo el nombre de host y el usuario asociados con stdin".fuente
intentaste lo siguiente?
fuente