Existe uma maneira conveniente de garantir que todos os logins de um determinado usuário (ou seja, eu) usem o mesmo ssh-agent? Eu hackeei um script para fazer este trabalho a maior parte do tempo, mas eu suspeitava o tempo todo que havia alguma maneira de fazer isso que eu tinha acabado de perder. Além disso, desde então, houve avanços surpreendentes em tecnologia de computação, como por exemplo este site.
Então o objetivo aqui é que
- sempre que eu fizer login na caixa, independentemente de ser via SSH ou em uma sessão gráfica iniciada a partir do gdm / kdm / etc, ou em um console:
- se meu nome de usuário não tiver atualmente um
ssh-agent
executando, um é iniciado, as variáveis de ambiente são exportadas essh-add
chamado. - caso contrário, as coordenadas do agente existente serão exportadas nas variáveis de ambiente da sessão de login.
- se meu nome de usuário não tiver atualmente um
Esta facilidade é especialmente valiosa quando a caixa em questão é usada como um ponto de ssh
em uma terceira caixa. Neste caso, evita ter que digitar a frase secreta da chave privada toda vez que você digitar ssh e, por exemplo, desejar fazer git push
ou alguma coisa.
O roteiro dado abaixo faz isso de forma mais confiável, embora tenha fracassado recentemente quando o X travou e eu iniciei outra sessão gráfica. Pode ter havido outro mal-estar acontecendo nesse caso.
Aqui está meu roteiro ruim é bom. Eu obtenho isso do meu .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Por favor, me diga que há uma maneira melhor de fazer isso. Também, por favor, não critique as inconsistências / gafes (por exemplo, colocando var
coisas em etc
); Eu escrevi isso há um tempo e desde então aprendi muitas coisas.