web-dev-qa-db-fra.com

Exécution de ssh-agent à partir d'un script Shell

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?

19
Dan

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.

10
Michael Suelmann

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.

16
scottyseus

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).

6
Zoredache

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.

6
steampowered

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`
4
ZIADI Mohamed ali

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"
2
Andy Wood