Determina o alvo de uma conexão SSH em tempo de execução

2

Eu quero determinar o endereço de destino de uma conexão SSH com uma chamada de função que gere o endereço ao qual se conectar. Todos os exemplos usando ProxyCommand que eu posso encontrar on-line usam o -W flag para pular para uma segunda máquina. Eu tentei isso com localhost para a segunda máquina, e isso funcionou, mas exigiu autenticação SSH duas vezes que eu não gostei.

Estou tentando chamar ssh dentro do ProxyCommand sem encaminhar para o segundo salto. No momento, eu tenho no meu arquivo .ssh/config :

Host test
    ProxyCommand ssh user@address

Quando eu faço ssh test , parece se conectar bem, mas depois de conectar existe um prompt em branco que não responde a entrada, então parece stdin / stdout não deve ser direcionado corretamente.

Perguntas relacionadas:

Use um hostname dinamicamente obtido com um entrada de configuração ssh

Como obter HostName do script executável no arquivo de configuração SSH?

Gere dinamicamente as entradas do Host SSH em ~ / .ssh / config

    
por ws_e_c421 10.06.2015 / 19:42

1 resposta

3

Como você não passa um comando para ssh , ele executa um shell, que espera comandos em sua entrada padrão. Mas você não está passando os comandos shell, você está passando tráfego SSH. Hilaridade segue.

O tunelamento é o ponto inteiro de ProxyCommand . Este exemplo encapsula uma conexão SSH dentro de uma conexão SSH. Se você não quer encapsular, ProxyCommand não é o que você está procurando.

Desde o OpenSSH 6.4, você pode usar uma diretiva Match com a palavra-chave exec para incluir blocos condicionalmente com base em uma diretiva de tempo de execução. Um caso de uso típico é ter diferentes nomes de host reais ou comandos de proxy, dependendo de onde seu laptop está. Cada bloco Match substitui um bloco Host e você não pode usar a saída do comando para determinar o nome do host, apenas o fato de que ele saiu com o status 0.

# Connection inside ACME network
Match host foo exec on-acme-network
HostName foo.acme.local

# Connection from outside ACME
Host foo
HostName foo.example.com

Proxying é outra opção. Para estabelecer uma conexão com um nome de host e porta que são determinados no momento da conexão, você pode usar o netcat para configurar o TCP conexão.

Host foo
ProxyCommand nc $(determine-target-host-name) 22

Se você quiser um .ssh/config totalmente dinâmico, poderá torná-lo um canal nomeado e garantir que um processo esteja sempre escrevendo para ele. Ou coloque-o em scriptfs .

    
por 11.06.2015 / 00:56

Tags