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.