Pourquoi évaluer la sortie de ssh-agent?

67

Pour courir ssh-agentje dois utiliser

eval $(ssh-agent)

Pourquoi dois-je à evalla sortie de ssh-agent?

Pourquoi n'est-il pas conçu pour que je puisse simplement l'exécuter?


Remarque: Les Backticks (`) ont été supprimés car ils sont obsolètes. Vous pouvez en lire plus ici, par exemple .

jx12345
la source
Qui a dit que vous deviez utiliser eval? Qu'est-ce qui dicte cela? Un peu plus de contexte aiderait.
0xSheepdog
9
@ 0xSheepdog la manpage, pour commencer ...
jasonwryan
On dirait que les cas d'utilisation sont documentés dans la page de manuel. Quant à "pourquoi est-il conçu d'une certaine manière" ... haussement d'épaules .
0xSheepdog
5
En réitérant, ce n’est pas ce ssh-agentqui est "conçu de cette façon", c’est unix / linux, car il ssh-agents’exécute dans un processus enfant du shell. Les processus enfants ne peuvent pas modifier les processus parents. Mais une fonction peut: car elle s'exécute dans le processus en cours. Ainsi , vous pouvez écrire une fonction: do_set_ssh_agent() { eval ssh-agent ; }et qui pourrait être exécuté simplement: $ do_set_ssh_agent. Mais les "programmes" ne sont pas (généralement) installés en tant que "fonctions" dans linux / unix; au lieu de cela, les programmes sont installés sous forme de fichiers qui, comme mentionné, s’exécutent dans un processus enfant. (Les scripts de sourcing sont une exception, mais ssh-agent est binaire.)
michael

Réponses:

79

ssh-agent génère les variables d'environnement nécessaires pour s'y connecter:

shadur@proteus:~$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-492P67qzMeGA/agent.7948; export SSH_AUTH_SOCK;
SSH_AGENT_PID=7949; export SSH_AGENT_PID;
echo Agent pid 7949;
shadur@proteus:~$ 

En evalvous appelant, chargez immédiatement ces variables dans votre environnement.

Quant à savoir pourquoi ssh-agentne peut pas faire cela lui-même ... Notez le mot choix. Non "ne veut pas", " ne peut pas ". Sous Unix, un processus ne peut modifier que ses propres variables d'environnement et les transmettre aux enfants. Il ne peut pas modifier l'environnement de son processus parent car le système ne le permet pas. C'est une conception de base de la sécurité.

Vous pouvez contourner le problème evalen utilisant ssh-agent utilityoù se utilitytrouve votre shell de connexion, votre gestionnaire de fenêtres ou tout autre élément nécessitant le paramétrage des variables d'environnement SSH. Ceci est également mentionné dans le manuel.

Shadur
la source
Merci, cela explique clairement ce qui se passe et je comprends cela, mais pourquoi est-il conçu de cette façon plutôt que conçu de sorte que son exécution ajoute automatiquement les variables à l'environnement? Cela ajoute-t-il de la flexibilité ???
jx12345
4
@ jx12345 Vous pouvez contourner le evalen utilisant ssh-agent utilityoù se utilitytrouve votre shell de connexion, votre gestionnaire de fenêtres ou tout autre élément nécessitant le paramétrage des variables d'environnement SSH. Ceci est également mentionné dans le manuel. Aucun utilitaire externe ne peut jamais définir de variables dans l'environnement d'appel.
Kusalananda
@ kusalananda Correct; n'hésitez pas à ajouter cela en tant que modification. Je vais me coucher maintenant ou je le ferais moi-même.
Shadur
5
@ jx12345 Parce qu'il peut ajouter des variables à son propre environnement mais ne peut pas ajouter de variables à l'environnement de votre shell car ce n'est pas votre shell.
user253751
3
@ jx12345 Pour clarifier: si je peux ajouter ou modifier des variables env à mon processus parent, je pourrais éventuellement affecter le parent du parent, et ainsi de suite jusqu'au PID 1. Cela s'appelle "élévation de privilèges" et c'est une très mauvaise chose pour la sécurité. point de vue.
Shadur