~/.ssh/config
:
Host cluster
ProxyCommand ~/bin/cluster-connect
~/bin/cluster-connect
:
#!/bin/bash
socat stdio tcp:$(get_host):22
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
Tags ssh