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


10

Eu me conecto a várias máquinas constantemente, de diferentes locais físicos (e, portanto, diferentes máquinas físicas). A maior parte disso é feita através do ssh, às vezes é necessária uma ou duas máquinas de gateway (que eu chamo via ProxyCommandin ~/.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 na qual estou trabalhando) na extremidade remota?

  • Não quero enviar variáveis ​​de ambiente, pois algumas máquinas não possuem raiz para definir PermitUserEnvironment.
  • A $SSH_CLIENTvariável de ambiente é útil para conexões diretas, mas lista apenas o gateway mais recente.

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

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

Estou trabalhando em um shell bash principalmente, mas também estou feliz por quaisquer sugestões que não o usem também.


Um dos propósitos de ProxyCommand é, naturalmente, para esconder (ou esquecer) o host de origem (que pode ser, por exemplo não roteáveis do hospedeiro final de qualquer maneira)
Hagen von Eitzen

Você pode dar um exemplo de onde ou por que você precisa dessas informações? Pode haver outras soluções não óbvias.
21413 Manwe

@Manwe Em última análise, quero configurar seções específicas de localidade em coisas como meu .bashrc. No momento, tudo o que quero fazer é definir um dos três layouts de teclado automaticamente no vim, dependendo da máquina em que estou trabalhando.
Geodésica

Respostas:


3

Nunca tentei, mas consigo pensar em algo que pode funcionar: você não permite que o SSH inicie o shell de login, mas cuide do assunto com suas próprias mãos. Você pode dizer ao SSH para executar comandos arbitrários. Ao invés de

ssh remote_host

você executaria algo ao longo das linhas 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 faz é fornecer ao SSH algo a mais em vez de iniciar um shell de login. Que algo é uma string, que será executada como comando, remotamente. Usamos isso para iniciar um shell de uma maneira muito especial: fornecemos uma variável ambiental DAT_ORIGIN_HOST, que contém nosso ip em eth0 (pode ser necessário alterar isso).

O truque que realizamos é que colocamos o comando para executar remotamente em qoutes duplos ". As aspas duplas (pelo menos em Bash) significam que, ANTES DE PASSAR A CORDA PARA SSH, nosso shell a varre e executa expansões / substituições, quando apropriado. Isso significa que nosso shell avaliará a parte `$ (ifconfig ...), para o nosso endereço IP atual e passará ssh uma string que contém a definição de uma variável ambiental com o nosso endereço IP local.

Depois de fazer login na máquina remota, echo $DAT_ORIGIN_HOSTimprima seu endereço IP.

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

Disclaimer: Eu sou inseguro sobre o -le -iopção de /bin/bash. Talvez você precise omiti-los.


Você pode estar interessado em algo aqui! Vou brincar um pouco e voltar para você.
Geodésica

Estou marcando essa resposta, pois os comandos pseudo-tty e remoto funcionam. Eu finalmente resolvi meu caso em particular com ^ E retornos de chamada, com base na sugestão de comando remoto - ele acaba sendo um pouco mais limpo e de uso geral. Obrigado!
Geodésica 23/08

2

Eu entendi corretamente que você está conectado diretamente da máquina de origem ao destino com o proxycommandlúpulo. E aqui estão três hacks para você (terceiro adicionado após o comentário no 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) Abuso AcceptEnv LC_*no alvo. Não é legal, mas é bastante comum permitir variáveis ​​LOCALE, mesmo que o AcceptUserEnviconment não esteja 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 encaminhamento remoto ssh para identificar host ou 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

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

Obrigado pelas sugestões, mas nem trabalho para minha satisfação total ainda. O encaminhamento de porta remota não é uma má idéia, mas uma suposição necessária é que você tenha o mesmo nome de usuário em todos os hosts. Não é esse o caso aqui, nem algo que eu possa mudar. Segundo: não consegui fazer isso funcionar. Você está dizendo que geralmenteAcceptEnv LC_* é permitido, mas não é um padrão, por padrão?
Geodésica

Bem, o LC_ é um sucesso. Não posso comentar como isso é predominante, mas é algo que pode funcionar .. (lembre-se de exportar LC_SOURCEHOST antes da conexão ssh).
21413 Manwe

LC_ * testado e funciona. Pode ser qualquer variável listada na AcceptEnvdiretiva em /etc/ssh/sshd_config. Lembre- sshdse de reiniciar se esse arquivo for alterado.
David.perez

1

Você pode digitar who -mna extremidade remota para obter informações sobre o usuário conectado no momento (incluindo o nome do host). whofornece informações sobre usuários conectados e a -mopção mostra "apenas o nome do host e o usuário associado ao stdin".


Isso só é útil se eu não estiver fazendo o tunelamento através de uma máquina de gateway.
Geodésica

0

você tentou o seguinte?

 netstat -an | grep " 22 "

Esse método é útil apenas para conexões de um salto, portanto não é útil para mim.
Geodésica
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.