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 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 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_CLIENT
variá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_CLIENT
valor 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.
fonte
Respostas:
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
você executaria algo ao longo das linhas de
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_HOST
imprima 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
-l
e-i
opção de/bin/bash
. Talvez você precise omiti-los.fonte
Eu entendi corretamente que você está conectado diretamente da máquina de origem ao destino com o
proxycommand
lú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
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:Terceiro) Use o encaminhamento remoto ssh para identificar host ou tipo de host.
Agora conecte-se ao encaminhamento de porta:
fonte
AcceptEnv LC_*
é permitido, mas não é um padrão, por padrão?AcceptEnv
diretiva em/etc/ssh/sshd_config
. Lembre-sshd
se de reiniciar se esse arquivo for alterado.Você pode digitar
who -m
na extremidade remota para obter informações sobre o usuário conectado no momento (incluindo o nome do host).who
fornece informações sobre usuários conectados e a-m
opção mostra "apenas o nome do host e o usuário associado ao stdin".fonte
você tentou o seguinte?
fonte