J'essaie de créer un script Shell qui, entre autres, démarre ssh-agent et ajoute une clé privée à l'agent. Exemple:
#!/bin/bash
# ...
ssh-agent $Shell
ssh-add /path/to/key
# ...
Le problème avec cela est que ssh-agent lance apparemment une autre instance de $ Shell (dans mon cas, bash) et du point de vue du script, il a tout exécuté et ssh-add et tout ce qui est en dessous n'est jamais exécuté.
Comment puis-je exécuter ssh-agent à partir de mon script Shell et le faire avancer dans la liste des commandes?
ssh-agent est censé démarrer une session et lorsqu'elle se termine, la session utilisateur est terminée. Ainsi, toute commande après ssh-agent serait peut-être exécutée après la fermeture de session.
Ce que vous voulez, c'est un session-script
qui contient vos commandes de sessions comme ceci:
#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter
Puis commencez ssh-agent session-script
.
Mettez ce qui suit en haut de votre script:
eval `ssh-agent`
Votre script devrait ressembler à ceci:
#!/bin/bash
eval `ssh-agent`
ssh-add /path/to/key
...
...
Explication
Les backticks autour de ssh-agent
collecte sa sortie. eval
collecte cette sortie, la concatène en une seule commande, puis exécute la commande. Ensuite, vous pouvez utiliser ssh-add
pour fournir vos informations d'identification clés.
J'ai tendance à faire quelque chose comme ça dans les scripts qui nécessitent un agent.
#!/bin/bash
# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
exec ssh-agent bash -c "ssh-add ; $0"
exit
fi
... and so on.
Fondamentalement, la première chose que le script vérifie pour voir si un agent est en cours d'exécution. S'il ne l'est pas, exec est utilisé pour démarrer un nouveau processus à la place du script. L'agent est démarré, des clés sont ajoutées et enfin, le script est de nouveau appelé (voir le $0
).
J'ai trouvé que cela fonctionne pour moi.
eval `ssh-agent` # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval `ssh-agent -k` # kill the process
Je crée le processus ssh-agent, ajoute la clé, fais ce que je dois faire, puis je le tue. Pas besoin de vérifier s'il fonctionne plus tard.
Il est préférable d'utiliser porte-clés dans ce cas
Debian/Ubuntu:
apt-get install keychain
RHEL/Fedora/CentOS
yum install keychain
Ajoutez dans votre .bashrc les éléments suivants:
eval `keychain --eval id_rsa`
J'ai trouvé avec la solution de Zoredache, la clé serait disponible pour tout Shell qui se trouve partager le même agent ssh que le Shell qui a appelé le script. Je voulais éviter cela dans un script qui nécessitait un accès root à une machine distante, pour des raisons de sécurité évidentes.
J'ai trouvé de mettre le Shebang suivant en haut des travaux de script:
#!/usr/bin/ssh-agent bash
ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"