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

19

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?

Dan
la source

Réponses:

8

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 est un session-scriptqui contient vos commandes de sessions comme ceci:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Commence alors ssh-agent session-script.

Michael Suelmann
la source
Merci! Créer un script séparé et terminer le script avec a exitfait l'affaire.
Dan
2
qu'est-ce qu'un script de session?
Alexander Mills
15

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 ssh-agentcollectent sa sortie. evalcollecte cette sortie, la concatène en une seule commande, puis exécute la commande. Ensuite, vous pouvez utiliser ssh-addpour fournir vos informations d'identification clés.

scottyseus
la source
9
C'est exactement ce dont j'avais besoin, merci, même s'il convient de souligner que les retours en arrière sont en train de disparaître. Dans la nouvelle forme bash, cela devrait êtreeval $(ssh-agent)
sibaz
Cette solution n'a pas fonctionné pour moi jusqu'à ce que je mette bash -ià la fin du script.
Adolfo Correa
6

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 à nouveau appelé (voir le $0).

Zoredache
la source
Mais cela ne conservera aucun paramètre de script. Et si l'un des paramètres a des espaces, il ne sera pas facile de les transmettre.
Denilson Sá Maia
3
Vous pouvez utiliser .. "ssh-add ; $0 $*", ou à la .. "ssh-add ; $0 $@"place, ce qui peut fonctionner. Ce qui ne serait pas parfait, mais fonctionnerait certainement dans de nombreux cas. La meilleure solution est presque toujours d'avoir votre agent en cours d'exécution avant toute autre chose, c'est juste quelque chose qui pourrait être utile dans des cas obscurs.
Zoredache
6

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.

à vapeur
la source
4

Il est préférable d'utiliser le trousseau 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`
ZIADI Mohamed ali
la source
Mieux? Pourquoi est-ce mieux?
JFlo
@JFlo "Mieux" en cela, il enregistrera les variables env dans $ HOME / .keychain / <fichier>. En exécutant à nouveau cette commande, vous récupérerez un agent ssh existant s'il est toujours en cours d'exécution. Il peut ensuite être réutilisé entre des shells / scripts. Dans certains scénarios, ce n'est pas super sûr, vous devez donc passer cet appel. Pour moi, c'est une amélioration par rapport à certains scripts que j'avais écrits pour accomplir la même tâche
Scott Carlson
2

J'ai trouvé avec la solution de Zoredache, la clé serait disponible pour tout shell qui arrive à 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"
Andy Wood
la source
-2

J'ai essayé et beaucoup et la solution qui a finalement fonctionné était de remplacer ma phrase secrète par une chaîne vide.

ssh-keygen -p
Stephan Weinhold
la source
Il s'agit d'une pratique très dangereuse. Pourquoi s'embêter à utiliser ssh? Si vous ne protégez pas votre clé privée, vous pourriez tout aussi bien parler en texte clair.
JFlo
@JFlo: pas si votre système client est suffisamment sécurisé, ce qui pourrait être le cas. Surtout si vous (pouvez et faites) ajouter ACL, SELinux ou similaire, ce qui est facile avec un fichier statique mais moins avec le socket randomisé de ssh-agent. Cela dit, je ne le recommanderais généralement pas comme premier choix.
dave_thompson_085
Bien que ce soit un processus très utile que vous fournissez, je ne pense pas qu'il réponde à la question du PO.
Alexander Bird