Encontrar IP o máquina de nombre de host de origen (ssh)

10

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 ProxyCommandin ~/.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_CLIENTvariable 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_CLIENTvalor 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.

Geodésico
fuente
Uno de los propósitos de ProxyCommand es, por supuesto, ocultar (u olvidar) el host de origen (que, por ejemplo, puede no ser enrutable desde el host final de todos modos)
Hagen von Eitzen
¿Puede dar un ejemplo de dónde o por qué necesita esta información? Podría haber otras soluciones no obvias.
Manwe
@Manwe En última instancia, querré configurar secciones específicas de configuración regional en cosas como mi .bashrc. En este momento, todo lo que quiero hacer es configurar uno de los tres diseños de teclado automáticamente en vim dependiendo de la máquina desde la que estoy trabajando.
Geodésico

Respuestas:

3

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

ssh remote_host

correría algo en la línea de

ssh remote_host -t "
    . /etc/profile; 
    . /etc/bash.bashrc; 
    DAT_ORIGIN_HOST=$(ifconfig eth0|grep -Po 't addr:\K[\d.]+') /bin/bash -l -i"

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_HOSTdebe 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 -ly -iopción de /bin/bash. Quizás necesites omitirlos.

usuario1129682
fuente
¡Puede que tengas algo aquí! Voy a jugar un rato con eso y te responderé.
Geodésico
Estoy marcando esta respuesta, ya que los comandos pseudo-tty y remotos funcionan. Finalmente resolví mi caso particular con devoluciones de llamada ^ E, basadas en la sugerencia de comando remoto: termina siendo un poco más limpio y de uso general. ¡Gracias!
Geodésico
2

Id. Entendí correctamente que estás conectado directamente desde la máquina de origen al destino con proxycommandsaltos. 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

ssh -R 2222:localhost:22 user@target
# on "target" you can now do this to get back to origin host
ssh user2@localhost -p 2222 

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:

export LC_SOURCEHOST=my.ip.addr.or:something
ssh user@target
# on tathet:
echo $LC_SOURCEHOST

Tercero) Use ssh remote forward para identificar el host o el tipo de host.

# Here is an example what you can use on target machine. 
# This will modify your PS1 variable (prompt) based on source host (port forwarding)
# Add this to .bash_profile

function checkHost {
  RET=""
  ## loop over test port numbers 17891-17895 in my example
  for x in $(seq 1 5); do 
    # if netstat is not available test port some other way like with nc or something
    ## && RET= will set RET = 1-5
    /bin/netstat -lnt|/bin/grep -q 127.0.0.1:1789$x && RET=$x;
  done
  # return RET
  # please note that if you have multiple open connections with different port numbers
  # this method cannot not distinguish between them 
  echo $RET
}

# get 1-5 number from function above
VAL=$(checkHost)
# do something like set PS1 var or map vim file or something
export PS1='\[\033k\033\\\]\u@\h: \w\$ '$VAL

Ahora conéctese con el reenvío de puertos:

### this will still enable ssh forwarding back. Change 22 to something else like 
### 24 to disable it (if nothing is listening on your source machines 24 port)
ssh -R 17891:localhost:22 user@target
Manwe
fuente
Gracias por las sugerencias, pero ninguno funciona para mi plena satisfacción todavía. El reenvío de puerto remoto no es una mala idea, pero una suposición necesaria es que tiene el mismo nombre de usuario en todos los hosts. Ese no es el caso aquí ni algo que pueda cambiar. Segundo: no pude hacer que esto funcione. ¿Está diciendo que generalmenteAcceptEnv LC_* está permitido, pero no es un estándar, activado de forma predeterminada?
Geodésico
Bueno, el LC_ es impredecible. No puedo comentar qué tan frecuente es eso, pero es algo que podría funcionar ... (recuerde exportar LC_SOURCEHOST antes de la conexión ssh).
Manwe
Probado LC_ * y funciona. Puede ser cualquier variable listada en la AcceptEnvdirectiva en /etc/ssh/sshd_config. Recuerde reiniciar sshdsi este archivo se cambia.
david.perez
1

Puede escribir who -men el extremo remoto para obtener información sobre el usuario actualmente conectado (incluido el nombre de host). whole brinda información sobre los usuarios que han iniciado sesión y el -mconmutador le muestra "solo el nombre de host y el usuario asociados con stdin".

Paulo Almeida
fuente
Sin embargo, esto solo es útil si no estoy haciendo un túnel a través de una máquina de puerta de enlace.
Geodésico
0

intentaste lo siguiente?

 netstat -an | grep " 22 "

fuente
Este método solo es útil para conexiones de un salto, por lo que no es útil para mí.
Geodésico