¿Por qué evaluar la salida de ssh-agent?

67

Para correr ssh-agenttengo que usar

eval $(ssh-agent)

¿Por qué tengo que evalla salida de ssh-agent?

¿Por qué no está diseñado para que pueda ejecutarlo?


Nota: Los Backticks (`) se eliminan porque están en desuso. Puedes leer más sobre esto aquí, por ejemplo .

jx12345
fuente
¿Quién dice que tienes que usar eval? ¿Qué es lo que dicta esto? Un poco más de contexto ayudaría.
0xSheepdog
9
@ 0xSheepdog la manpágina, para empezar ...
jasonwryan
Parece que los casos de uso están documentados en la página del manual. En cuanto a "por qué está diseñado de cierta manera" ... encogerse de hombros .
0xSheepdog
55
Reiterando, no ssh-agentes que esté "diseñado de esta manera", es unix / linux, porque se ssh-agentejecuta en un proceso secundario del shell. Los procesos secundarios no pueden modificar los procesos principales. Pero una función puede: porque se ejecuta en el proceso actual. Por lo que podría escribir una función: do_set_ssh_agent() { eval ssh-agent ; }y que podría funcionar simplemente como: $ do_set_ssh_agent. Pero los "programas" no están (típicamente) instalados como "funciones" en Linux / Unix; en cambio, los programas se instalan como archivos, que, como se mencionó, se ejecutan en un proceso secundario. (Los scripts de aprovisionamiento son una excepción, pero ssh-agent es binario.)
michael

Respuestas:

79

ssh-agent genera las variables de entorno que necesita para conectarse:

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:~$ 

Al llamar eval, carga inmediatamente esas variables en su entorno.

En cuanto a por qué ssh-agentno puede hacer eso por sí mismo ... Tenga en cuenta la palabra elección. No "no", " no puedo ". En Unix, un proceso solo puede modificar sus propias variables de entorno y pasarlas a los hijos. No puede modificar el entorno de su proceso padre porque el sistema no lo permitirá. Este es un diseño de seguridad bastante básico.

Podrá sortear el evaluso de ssh-agent utilitydónde utilityestá su shell de inicio de sesión, su administrador de ventanas o cualquier otra cosa que necesite tener configuradas las variables de entorno SSH. Esto también se menciona en el manual.

Shadur
fuente
Gracias, eso explica claramente lo que está sucediendo y lo entiendo, pero ¿por qué está diseñado de esa manera en lugar de estar diseñado para que al ejecutarlo agregue automáticamente las variables al entorno? ¿Agrega algún tipo de flexibilidad?
jx12345
44
@ jx12345 Puede moverse evalusando el lugar ssh-agent utilitydonde utilityestá su shell de inicio de sesión, su administrador de ventanas o cualquier otra cosa que necesite tener configuradas las variables de entorno SSH. Esto también se menciona en el manual. Ninguna utilidad externa puede establecer variables en el entorno de llamada.
Kusalananda
@kusalananda Correcto; siéntase libre de agregar eso como una edición. Ahora me voy a la cama o lo haría yo mismo.
Shadur
55
@ jx12345 Porque puede agregar variables a su propio entorno pero no puede agregar variables al entorno de su shell porque no es su shell.
user253751
3
@ jx12345 Para aclarar: si puedo agregar o cambiar variables env a mi proceso padre, podría afectar a los padres del padre, y así sucesivamente hasta el PID 1. Esto se llama "escalada de privilegios" y es algo realmente malo por seguridad punto de vista.
Shadur