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

10

Freqüentemente preciso ssh em um computador arbitrário de um cluster específico (todas as máquinas no cluster são idênticas). No entanto, o conjunto de máquinas disponíveis no cluster muda com frequência, portanto, tenho um script que retorna um nome de host arbitrário do cluster que está disponível e corresponde aos meus requisitos (por exemplo, on-line e executando o sistema operacional correto).

Note também que estou usando o encaminhamento de credenciais Kerberos (GSSAPIAuthentication) para autenticação.

Neste momento, eu ssh usando ssh 'get_host' . Eu gostaria de executar ssh cluster . Com um nome de host conhecido, isso é fácil com o seguinte em /ssh/config :

Host cluster
    HostName static_host.cluster.domain.tld
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials yes

Como posso selecionar o HostName dinamicamente usando meu script? (Ou o SSH tem um método diferente para suportar minha função desejada?) Eu gostaria de fazer algo como o seguinte, mas não funciona:

Host cluster
    HostName 'get_host'   # This does not work
    ...

Grawity mostrou que o ProxyCommand pode ser um script que obtém o nome do host e encaminha a ssh de conexão para ele usando netcat ou socat . No entanto, isso não está encaminhando as credenciais do Kerberos. Ajuda com isso é apreciado também.

EDITAR:

Você não pode fazer isso com o Kerberos como eu gostaria (veja os comentários na resposta aceita). Portanto, estou usando este script, ssh-wrapper , como ssh alias para fazer a reconfiguração dinâmica no argumento de linha de comando ssh . Não é robusto, mas funciona para mim.

#!/bin/bash

# Mapping between host aliases and dynamically-generated hostname
declare -A MAP
MAP[cluster]='gethost'

# Find and replace on all positional args
args=$*
for key in ${!MAP[@]}; do
    replace=${MAP[$key]}
    args='echo ${args} | sed "s/\(^\|[[:space:]]\)${key}\(\$\|[[:space:]]\)/${replace}/"'
done

# Execute using called-name if not this script
if [ "ssh-wrapper" != "'basename $0'" ]; then
    exec $0 ${args}
# Otherwise, assume ssh and execute
else
    exec ssh ${args}
fi
    
por David B. 21.09.2011 / 20:24

1 resposta

6

~/.ssh/config :

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect :

#!/bin/bash
socat stdio tcp:$(get_host):22
    
por 21.09.2011 / 20:58

Tags