(J'ai lu de nombreuses questions sur ce site qui semblent liées et je pense que c'est une question vraiment nouvelle.)
J'ai beaucoup de clés sur beaucoup de serveurs et elles sont toutes protégées par des mots de passe.
J'aime saisir des mots de passe autant que j'aime saisir des mots de passe - c'est un véritable fardeau de productivité.
Les commandes ssh-agent + ssh-add peuvent être utilisées sur un shell de connexion pour signifier que vous n'avez à saisir votre mot de passe qu'une seule fois lors de la connexion
le trousseau peut être utilisé pour maintenir un agent ssh en vie au-delà de la déconnexion.
Le problème que j'ai, c'est que ces deux solutions sont généralement lancées dans une connexion shell (par exemple .zshrc
), si je saisis ma phrase secrète lorsque je me connecte, même si je n'ai pas besoin qu'elle soit déverrouillée. (Je ne suis pas content que le trousseau garde un agent en vie indéfiniment.)
Ce que j'aimerais, c'est qu'on ne me demande une phrase secrète (pour un agent) qu'en cas de besoin .
Je peux donc me connecter au serveur A, faire quelques trucs, puis ssh au serveur B et à ce moment-là me demander la phrase secrète. Faites des choses sur le serveur B, déconnectez-vous. De retour sur A, refaites quelques trucs, ssh vers B à nouveau et pas besoin de ma phrase secrète (elle est détenue par un agent).
Je note que cela est possible sur des bureaux graphiques comme Gnome - vous obtenez une fenêtre contextuelle demandant la phrase secrète pour déverrouiller votre clé privée dès que vous essayez de ssh. C'est donc ce que je recherche mais à partir d'une console.
Réponses:
N'ajoutez rien à aucun de vos scripts de démarrage du shell, c'est du piratage inutile.
Au lieu de cela, ajoutez
à votre .ssh / config
Comme cela, ssh-add est exécuté automatiquement la première fois que vous utilisez ssh dans une autre boîte. Il vous suffit de ressaisir votre clé lorsqu'elle expire de ssh-agent ou après le redémarrage.
la source
Zsh a un
preexec
hook qui exécute une fonction avant qu'une commande entrée sur la ligne de commande soit exécutée. Voici un crochet qui recherchessh
dans votre ligne de commande et s'il est trouvé, vérifie l'existence d'un agent ssh. Si ce n'est pas trouvé, il exécute le trousseau.Ainsi, le trousseau est uniquement exécuté avant les commandes ssh, puis uniquement si nécessaire.
Mettez ceci dans votre
~/.zshrc
:Ce qui se passe ici est à chaque fois qu'une commande est tapée,
check_ssh
est appelée avant l'exécution de la commande.La première ligne de la fonction vérifie la commande développée pour l'
ssh
utilisation d'une expression régulière Zsh.ssh
doit avoir des limites de mots de\b
chaque côté. Si cela n'est pas trouvé, la fonction retourne.La ligne suivante vérifie qu'il existe un processus d'agent SSH dans la variable d'environnement et que ce processus existe toujours dans la table de processus, puis qu'au moins une clé a été ajoutée à l'agent. Si tout cela est OK, alors l'agent ssh est configuré et nous n'avons rien à faire, donc il revient.
Enfin, nous commençons le trousseau, avec l'agent à garder en vie pendant une heure.
Cela laisse toujours le problème des choses ssh intégrées, comme
git
oursync
ouscp
qui ne déclenchera pas la fonction (vous pouvez les ajouter au regex).la source
zsh
, on pourrait créer un court script avec le même effet et le placerPATH
devant lessh
client réel . Pourrait même fonctionner avecrsync
et al, s'ils lisentPATH
au lieu de s'exécuter/usr/bin/ssh
directement.Pour zsh, j'ai écrit un ensemble d'utilitaires et de wrappers pour faire plus ou moins ce que vous voulez: https://www.vinc17.net/unix/index.fr.html#zsh-ssh-utils
En fait, cela fait encore plus, car le
ssh-agent
sera partagé par toutes les sessions de connexion (bureau ou via SSH, et l'écran GNU est également pris en charge si vous démarrez des shells de connexion à partir de celui-ci, par exemple avecshell -zsh
dans le~/.screenrc
fichier), et il ne se fermera qu'après la la dernière session se termine.Remarque: j'utilise une seule phrase de passe pour toutes mes clés. Je ne suis pas sûr du comportement des différentes phrases secrètes; il peut avoir besoin de quelques changements.
la source