Localizando IP ou nome do host da máquina de origem (ssh)

10

Eu conecto um número de máquinas constantemente, de diferentes locais físicos (e, portanto, diferentes máquinas físicas). A maior parte disso é feita através de ssh, às vezes uma máquina de gateway ou duas é necessária (que eu chamo via ProxyCommand in ~/.ssh/config ). Gostaria de saber se existe um método para identificar o IP ou o nome do host da máquina que chama a conexão inicial (ou seja, a máquina em que estou trabalhando) no final remoto?

  • Eu não quero enviar variáveis de ambiente como algumas máquinas que não tenho raiz para definir PermitUserEnvironment .
  • A variável de ambiente $SSH_CLIENT é útil para conexões diretas, mas apenas lista o gateway mais recente.

Minha idéia atual para uma solução é pegar $SSH_CLIENT , ssh, encontrar o valor $SSH_CLIENT da máquina e repetir até que ela não exista; em seguida, pegue o nome do host e puxe-o de volta de alguma forma.

Parece um pouco um trabalho de hack; alguém tem um método melhor?

Estou trabalhando principalmente em um bash shell, mas também estou feliz por qualquer sugestão que não seja usada também.

    
por Geodesic 15.08.2013 / 05:00

4 respostas

3

Eu nunca tentei, mas posso pensar em algo que possa funcionar: você não permite que o SSH inicie seu shell de login, mas resolva o problema com suas próprias mãos. Você pode dizer ao SSH para executar comandos arbitrários. Em vez de

ssh remote_host

você executaria algo nos moldes 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"

O que isso significa é que ele oferece ao SSH outra coisa a fazer, em vez de iniciar um shell de login. Esse algo é uma string, que será executada como comando, remotamente. Usamos isso para lançar um shell de uma maneira muito especial: damos a ele uma variável de ambiente DAT_ORIGIN_HOST , que contém nosso ip na eth0 (talvez seja necessário mudar isso).

O truque que fazemos é colocar o comando para executar remotamente em qoutes " . As aspas duplas (pelo menos no Bash) significam que, ANTES DA CADEIA PASSAR PARA O SSH, o nosso shell faz a varredura e executa expansões / substituições, quando apropriado. Isso significa que nosso shell irá avaliar a parte '$ (ifconfig ...), para o nosso atual endereço ip e passar uma string ssh que contém a definição para uma variável ambiental com o nosso endereço IP local.

Uma vez logado na máquina remota, echo $DAT_ORIGIN_HOST deve imprimir seu endereço IP.

Para desenvolver essa chamada para o SSH, tomei descaradamente de aqui para extrair o endereço IP e aqui para o -t e como iniciar algo interativo

Isenção de responsabilidade: não tenho certeza sobre a opção -l e -i para /bin/bash . Talvez você precise omiti-los.

    
por 21.08.2013 / 23:39
2

Id Eu entendi corretamente que você é conexão diretamente da máquina de origem para o destino com proxycommand hops. E aqui estão três hacks para você (terceiro adicionado depois de comentar sobre o cenário de uso). Primeiro)  Use o encaminhamento de porta remota para permitir que você retorne à sua máquina de origem com -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)   Abuse AcceptEnv LC_* no alvo. Não é legal, mas é bastante comum permitir variáveis LOCALE mesmo quando o AcceptUserEnviconment não está disponível.   Então agora você pode fazer:

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

terceiro)  Use o remetente remoto ssh para identificar o host ou o 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='\[3k3\\]\u@\h: \w\$ '$VAL

Agora conecte-se ao encaminhamento de porta:

### 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
    
por 20.08.2013 / 23:51
1

Você pode digitar who -m no terminal remoto para obter informações sobre o usuário atualmente conectado (incluindo o nome do host). who fornece informações sobre usuários conectados e a opção -m mostra "apenas o nome do host e o usuário associado a stdin".

    
por 23.08.2013 / 02:33
0

você tentou o seguinte?

 netstat -an | grep " 22 "
    
por 25.08.2013 / 17:11