Eu estava prestes a começar uma recompensa por isso e percebi que a resposta era tão simples ...
Os dados do agente SSH não são criptografados para que possam ser recuperados por meio de um shell script, e eu uso o bash para selecionar o nome de usuário, servidor, etc, com base em um determinado domínio (que seria um vhost no servidor). / p>
Eu resolvi isso exportando a chave pública do meu agente ssh para um arquivo, forçando o uso somente dessa chave e, em seguida, excluindo a chave pública.
Aqui está o meu script (espero que seja útil para os outros!):
#!/bin/bash
remove_public () { # remove the public key after 2 seconds
sleep 2
rm -f $HOME/.ssh/public_key $HOME/.ssh/config
}
get_public () { # get the public key from ssh-add
ssh-add -L | grep "$1" > $HOME/.ssh/public_key
if [ ! -s "$HOME/.ssh/public_key" ] #identity hasn't yet been loaded
then
export KEY="$1" #use the private key it'll be added to the agent for next time assuming agent is configured.
else
export KEY="$HOME/.ssh/public_key" #use the public key
( remove_public & ) >/dev/null 2>&1
fi
chmod 700 "$KEY"
echo "IdentitiesOnly=yes" > "$HOME/.ssh/config"
echo "IdentityFile $KEY" >> "$HOME/.ssh/config"
}
ssh_connect () {
chmod -R 700 $HOME/.ssh
if [[ -z "$1" || -z "$2" ]]
then
echo "Username or server not specified!"
exit 1;
else
get_public "$HOME/.ssh/$2"
ssh "$2@$1" -i "$HOME/.ssh/$2"
fi
}
AVISO se você realmente tiver um arquivo ssh_config, isso O excluirá. Mas é importante remover IdentitiesOnly e IdentityFile; caso contrário, o ssh será quebrado para conexões que não usem esse script.
Uso:
ssh_connect "server" "username"
Esta é uma versão simplificada do script de shell que escrevi porque minhas chaves nem sempre estão no mesmo diretório (na verdade, elas nunca são, elas são classificadas pelo servidor), eu sempre passo um comando de tela para o servidor , etc.
Observe também que, no comando rm, se você estiver preocupado com a segurança da chave pública excluída, poderá usar rm -fP
em vez de rm -f
se estiver usando o Mac OSX para substituir o arquivo três vezes antes da exclusão. Eu não sei quais outros SOs, se é que algum, suportam isso.