Existe-t-il un moyen pratique de s’assurer que toutes les connexions d’un utilisateur donné (c’est-à-dire moi) utilisent le même agent ssh? J'ai piraté un script pour que cela fonctionne la plupart du temps, mais je soupçonnais tout le temps qu'il y avait un moyen de le faire que je venais juste de manquer. De plus, depuis cette époque, la technologie informatique a connu d’énormes progrès, comme par exemple ce site Web.
Donc, le but ici est que
- chaque fois que je me connecte à la boîte, que ce soit via SSH, dans une session graphique démarrée à partir de gdm / kdm / etc, ou sur une console:
- si mon nom d'utilisateur n'a pas encore de nom en
ssh-agent
cours d' exécution, un est démarré, les variables d'environnement exportées etssh-add
appelées. - sinon, les coordonnées de l'agent existant sont exportées dans les variables d'environnement de la session de connexion.
- si mon nom d'utilisateur n'a pas encore de nom en
Cette fonctionnalité est particulièrement utile lorsque la boîte en question sert de point de relais lors de l’ ssh
entrée dans une troisième boîte. Dans ce cas, cela évite de devoir taper la phrase secrète de la clé privée chaque fois que vous faites ssh puis que vous voulez, par exemple, faire git push
ou faire quelque chose.
Le script ci-dessous le fait de manière très fiable, bien qu'il se soit récemment écrasé lorsque X s'est écrasé et que j'ai ensuite démarré une autre session graphique. Il pourrait y avoir eu d'autres problèmes dans ce cas.
Voici mon mauvais scénario. Je source ceci de mon .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
S'il vous plaît dites-moi qu'il existe un meilleur moyen de le faire. Veuillez également ne pas cocher les incohérences / gaffes (par exemple, mettre des var
éléments etc
); Je l'ai écrit il y a quelque temps et j'ai depuis appris beaucoup de choses.
Réponses:
Je pourrais aussi bien ajouter ma propre variation au mélange:
Et puis chaque fois que je me connecte, si je veux un agent attaché (ce que je ne fais pas toujours), je tape simplement
sagent
.la source
if [ ! -x "$(which ssh-add)" ];
doit être remplacé parif ! which ssh-add;
ouif ! command -v ssh-add
. (Rappelez-vous,[
c'est juste une commande)if ! which ssh-add > /dev/null
empêcher l’impression du chemin. À ce stade, je ne suis pas sûr que ce soit plus clair, bien que je suppose que cela vous évite une invocation de commande supplémentaire.ssh -A [user@]remotehost
Je pense que c'est peut-être ce que vous recherchez. Utilisez le commutateur -A lors de l'exécution de ssh pour transférer votre agent-ssh. Voici un cas d'utilisation:
J'ai un serveur distant qui contient des dépôts Git avec un pointeur distant pointant vers github. Sans un agent ssh en cours d'exécution dans une session d'écran, je dois entrer le mot de passe composé pour ma clé afin de créer un "maître d'origine git pull". Booo! De plus, ma clé privée doit être installée sur le serveur distant - plus Boooo!
À la place, utilisez simplement des
ssh -A [user@]remotehost
passes avec mon agent ssh exécuté localement. Maintenant, je n'ai plus besoin de ma clé privée pour exister même sur l'hôte distant. Je ne crois pas que vous ayez besoin de faire du script avec ssh-agent.la source
man 5 ssh_config
pour leForwardAgent
paramètre config. Il active le transfert d'agent par défaut, éliminant la nécessité de l'-A
argument. Avant d'utiliser le transfert d'agent, sachez qu'il existe un risque de sécurité lorsque d'autres utilisateurs privilégiés de la machine distante pourraient accéder au socket de l'agent transféré. Ceci est également mentionné sur la page de manuel. Ceci est bien expliqué ici .En voici un très joli qui fonctionne aussi dans Cygwin:
Ajoutez-le à votre profil .bash ou .bashrc
Source: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
la source
${SSH_ENV}
doit être"${SSH_ENV}"
si votre nom d'utilisateur Windows a un espaceEssayez d'utiliser le trousseau, c'est fait pour ça. http://www.gentoo.org/doc/en/keychain-guide.xml
la source
J'ai récemment commencé à utiliser:
https://github.com/ccontavalli/ssh-ident
Tout ce que j'ai à faire est d'ajouter:
Dans mon fichier .bashrc. Le script prend en charge:
la source
Je préfère garder les choses aussi simples que possible: (extrait de
~/.profile
)Je n'avais pas pensé à utiliser
-a
avant, mais cela pourrait être plus facile:la source
Dans mon cas, j'ai la configuration posh-git dans PowerShell et je voulais que cygwin utilise le même agent ssh. J'ai dû faire quelques manipulations de chemin car ils utilisent différents dossiers tmp, et le fichier .env créé était UTF16 avec BOM et CR \ LF, donc c'était amusant à gérer. L'ajout de ce qui suit au .bashrc utilisé par cygwin devrait fonctionner:
la source
Encore un exemple à mettre dans votre fichier .bash_profile immédiatement et demandant d’ajouter votre clé par défaut lors de la connexion. Le transfert n'était pas une option dans mon cas.
la source
Voici ma solution, adaptée de https://superuser.com/a/141233/5255 (dans ce fil):
la source
créer le fichier ~ / ssh-agent.sh
inclure le fichier dans .bashrc
la source
C'est quelque chose que j'ai ajouté qui fonctionne pour moi. Il vérifie d'abord si un agent est en cours d'exécution. Dans l'affirmative, il définira les environnements appropriés, sinon, il le créera. Élimine également la création d'agents supplémentaires:
Il suffit de le mettre dans votre
.bashrc
la source
J'ai aussi une variante de ce problème, tirée directement de mon .bashrc:
Cette solution stocke une copie des informations sur l'agent SSH dans votre répertoire de base. Si vous avez un répertoire personnel monté automatiquement par NFS qui pourrait être partagé entre plusieurs hôtes, le nom d'hôte est utilisé comme partie du nom du fichier pour les différencier. Ainsi, la connexion à partir d'une machine n'empêchera pas le fichier d'agent utilisé par une autre.
Comportement:
1) Les premières sessions utilisateur sont invitées à saisir un mot de passe composé.
2) Les deuxième, troisième et quatrième sessions (et cetera) héritent de l'agent SSH et de la ou des clés ajoutées dans la première.
3) Si l'agent est tué ou se bloque, la première session suivante crée un nouvel agent, remplace le fichier d'agent par le nouveau et demande à nouveau une phrase secrète. Les sessions créées ultérieurement se comporteront comme le scénario 2), tant que le nouvel agent SSH reste en cours d'exécution.
la source
(cela concerne le post 2 plus haut, je n'ai pas pu ajouter de commentaire)
@raghavan: Votre exemple est utile, mais suggérerait de changer les deux lignes qui ont
pgrep ssh-agent
à
pgrep -u $ ssh-agent USER> / dev / null
de sorte que seuls les agents exécutés sous l'utilisateur actuel sont trouvés et que le pid ne soit pas répercuté sur l'écran (nettoyeur).
Souge également de modifier $ HOME / ssh-agent.out en $ HOME / .ssh-agent.out
Cordialement
la source
J'ai lu votre solution initiale et un certain nombre de solutions suggérées, mais j'ai décidé de simplifier le processus pour mon propre usage. C'est ce que j'ai ajouté dans mon propre .bashrc:
J'ai fait quelques hypothèses ici:
Dans l'ensemble, je pense que cela semble être une solution simple.
la source
J'ai constaté que plusieurs
ssh-agent
processus étaient en cours d'exécution et que le PID à l'intérieur du nom de fichier du socket ne correspondait jamais au PID d'une exécutionssh-agent
. J'ai donc piraté quelque chose pour tenter de récupérer ces conditions, à partir des nombreux exemples ci-dessus.Il s’agit d’une fonction unique, qui utilise une variable Zsh pour l’ID utilisateur s’il existe, et qui essaie de passer moins de temps à analyser des
/tmp
répertoires éventuellement énormes en limitantfind(1)
un peu plus.Il est probablement toujours sujet à des erreurs et compliqué, mais quelques tests superficiels indiquent qu'il fonctionne principalement pour mes cas d'utilisation, alors voici:
la source
Voici mon tour sur ceci. Je " source " le script ci-dessous à partir de mon .bash_profile :
la source
Voici un script simple qui réutilisera toujours le même agent ssh ou lancera ssh-agent s’il n’est pas en cours d’exécution. La clé est d'utiliser l'
-a
option d'utiliser le même nom de socket. Sinon, il choisira par défaut un nom de socket aléatoire à chaque fois. Vous pouvez également facilement combiner ces 3 lignes dans un alias à 1 ligne.la source
la source