J'ai un exemple de script sh
sur mon environnement Linux, qui exécute essentiellement le ssh-agent
pour le shell actuel, lui ajoute une clé et exécute deux commandes git:
#!/bin/bash
eval "$(ssh-agent -s)"
ssh-add /home/duvdevan/.ssh/id_rsa
git -C /var/www/duvdevan/ reset --hard Origin/master
git -C /var/www/duvdevan/ pull Origin master
Le script fonctionne vraiment bien, mais chaque fois que je l'exécute, j'obtiens un nouveau processus, donc je pense que cela pourrait devenir un problème de performances et je pourrais finir par avoir des processus inutiles.
Un exemple de sortie:
Agent pid 12109
Identity added: /home/duvdevan/.ssh/custom_rsa (rsa w/o comment)
En plus de tout cela, est-il possible de trouver un ssh-agent
traiter et y ajouter mes clés?
Jusqu'à présent, les réponses ne semblent pas répondre à la question d'origine ...
Voici ce qui fonctionne pour moi:
if ps -p $SSH_AGENT_PID > /dev/null
then
echo "ssh-agent is already running"
# Do something knowing the pid exists, i.e. the process with $PID is running
else
eval `ssh-agent -s`
fi
Ceci est tiré de: https://stackoverflow.com/a/15774758
Si vous voulez qu'il soit tué juste après la fin du script, vous pouvez simplement l'ajouter après la ligne eval:
trap "kill $SSH_AGENT_PID" exit
Ou:
trap "ssh-agent -k" exit
$SSH_AGENT_PID
est défini dans la valeur de ssh-agent -s
.
Vous devriez pouvoir trouver des agents ssh en cours d'exécution en parcourant /tmp/ssh-*
et reconstruire le SSH_AGENT
variables de celui-ci (SSH_AUTH_SOCK
et SSH_AGENT_PID
).
En plus de tout cela, est-il possible de trouver un processus d'agent ssh existant et d'y ajouter mes clés?
Oui. Nous pouvons stocker les informations de connexion dans un fichier:
# Ensure agent is running
ssh-add -l &>/dev/null
if [ "$?" == 2 ]; then
# Could not open a connection to your authentication agent.
# Load stored agent connection info.
test -r ~/.ssh-agent && \
eval "$(<~/.ssh-agent)" >/dev/null
ssh-add -l &>/dev/null
if [ "$?" == 2 ]; then
# Start agent and store agent connection info.
(umask 066; ssh-agent > ~/.ssh-agent)
eval "$(<~/.ssh-agent)" >/dev/null
fi
fi
# Load identities
ssh-add -l &>/dev/null
if [ "$?" == 1 ]; then
# The agent has no identities.
# Time to add one.
ssh-add -t 4h
fi
Ce code provient de pièges des agents ssh qui décrit à la fois les pièges de ce que vous faites actuellement, de cette approche et comment vous devez utiliser ssh-ident pour ce faire pour toi.
Si vous ne souhaitez exécuter ssh-agent que s'il ne fonctionne pas et ne rien faire d'autre:
if [ $(ps ax | grep [s]sh-agent | wc -l) -gt 0 ] ; then
echo "ssh-agent is already running"
else
eval $(ssh-agent -s)
if [ "$(ssh-add -l)" == "The agent has no identities." ] ; then
ssh-add ~/.ssh/id_rsa
fi
# Don't leave extra agents around: kill it on exit. You may not want this part.
trap "ssh-agent -k" exit
fi
Cependant, cela ne garantit pas que ssh-agent sera accessible (ce n'est pas parce qu'il fonctionne que nous avons $ SSH_AGENT_PID pour que ssh-add se connecte).
La réponse acceptée n'a pas fonctionné pour moi sous Ubuntu 14.04.
Le test pour vérifier si l'agent ssh est en cours d'exécution que je dois utiliser est:
[[ ! -z ${SSH_AGENT_PID+x} ]]
Et je démarre l'agent ssh avec:
exec ssh-agent bash
Sinon, le SSH_AGENT_PID
n'est pas défini.
Les éléments suivants semblent fonctionner sous Ubuntu 14.04 et 18.04.
#!/bin/bash
sshkey=id_rsa
# Check ssh-agent
if [[ ! -z ${SSH_AGENT_PID+x} ]]
then
echo "[OK] ssh-agent is already running with pid: "${SSH_AGENT_PID}
else
echo "Starting new ssh-agent..."
`exec ssh-agent bash`
echo "Started agent with pid: "${SSH_AGENT_PID}
fi
# Check ssh-key
if [[ $(ssh-add -L | grep ${sshkey} | wc -l) -gt 0 ]]
then
echo "[OK] SSH key already added to ssh-agent"
else
echo "Need to add SSH key to ssh-agent..."
# This should Prompt for your passphrase
ssh-add ~/.ssh/${sshkey}
fi
ps -p $SSH_AGENT_PID > /dev/null || eval "$(ssh-agent -s)"
Commande sur une seule ligne. Exécuter pour la première fois démarrera ssh-agent. Exécuter pour la deuxième fois ne démarre pas l'agent ssh. Compagnon simple et élégant !!!
En utilisant $SSH_AGENT_PID
ne peut tester que ssh-agent
mais il manque des identités quand il n'est pas encore ajouté
$ eval `ssh-agent`
Agent pid 9906
$ echo $SSH_AGENT_PID
9906
$ ssh-add -l
The agent has no identities.
Il serait donc préférable de le vérifier avec ssh-add -l
avec un attendez le script comme l'exemple ci-dessous:
$ eval `ssh-agent -k`
Agent pid 9906 killed
$ ssh-add -l
Could not open a connection to your authentication agent.
$ ssh-add -l &>/dev/null
$ [[ "$?" == 2 ]] && eval `ssh-agent`
Agent pid 9547
$ ssh-add -l &>/dev/null
$ [[ "$?" == 1 ]] && expect $HOME/.ssh/agent
spawn ssh-add /home/user/.ssh/id_rsa
Enter passphrase for /home/user/.ssh/id_rsa:
Identity added: /home/user/.ssh/id_rsa (/home/user/.ssh/id_rsa)
$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)
Donc, quand les deux ssh-agent
et ssh-add -l
sont exécutés sur un script bash:
#!/bin/bash
ssh-add -l &>/dev/null
[[ "$?" == 2 ]] && eval `ssh-agent`
ssh-add -l &>/dev/null
[[ "$?" == 1 ]] && expect $HOME/.ssh/agent
alors il vérifierait et s'assurerait toujours que la connexion fonctionne:
$ ssh-add -l
4096 SHA256:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX /home/user/.ssh/id_rsa (RSA)
Vous pouvez également émuler la répétition des commandes sur le script ci-dessus avec do while
Merci à toutes les réponses ici. J'ai utilisé ce fil plusieurs fois au fil des ans pour modifier mon approche. Je voulais partager mon script de vérificateur/lanceur ssh-agent.sh
Actuel qui fonctionne pour moi sur Linux et OSX.
Le bloc suivant est mon $HOME/.bash.d/ssh-agent.sh
function check_ssh_agent() {
if [ -f $HOME/.ssh-agent ]; then
source $HOME/.ssh-agent > /dev/null
else
# no agent file
return 1
fi
if [[ ${OSTYPE//[0-9.]/} == 'darwin' ]]; then
ps -p $SSH_AGENT_PID > /dev/null
# gotcha: does not verify the PID is actually an ssh-agent
# just that the PID is running
return $?
fi
if [ -d /proc/$SSH_AGENT_PID/ ]; then
# verify PID dir is actually an agent
grep ssh-agent /proc/$SSH_AGENT_PID/cmdline > /dev/null 2> /dev/null;
if [ $? -eq 0 ]; then
# yep - that is an agent
return 0
else
# nope - that is something else reusing the PID
return 1
fi
else
# agent PID dir does not exist - dead agent
return 1
fi
}
function launch_ssh_agent() {
ssh-agent > $HOME/.ssh-agent
source $HOME/.ssh-agent
# load up all the pub keys
for I in $HOME/.ssh/*.pub ; do
echo adding ${I/.pub/}
ssh-add ${I/.pub/}
done
}
check_ssh_agent
if [ $? -eq 1 ];then
launch_ssh_agent
fi
Je lance ce qui précède depuis mon .bashrc
En utilisant:
if [ -d $HOME/.bash.d ]; then
for I in $HOME/.bash.d/*.sh; do
source $I
done
fi
J'espère que cela aide les autres à se lever et à aller vite.
Créé un Gist public si vous souhaitez pirater/améliorer cela avec moi: https://Gist.github.com/dayne/a97a258b487ed4d5e9777b61917f0a72
Vous pouvez modifier la ligne # 1 pour:
PID_SSH_AGENT=`eval ssh-agent -s | grep -Po "(?<=pid\ ).*(?=\;)"`
Et puis à la fin du script, vous pouvez faire:
kill -9 $PID_SSH_AGENT