Aquí hay 2 reglas para empezar:
A menos que use explícitamente TCSH o similar, usará Bash, por lo que -s argumento es redundante
En Bash, eval no le importa el nivel de cotización, lo que significa que eval "1 2" y eval 1 2 Hará exactamente lo mismo. Sin embargo, las citas todavía cambian la interpretación de los caracteres en el interior:
print_args () { while [ $# -gt 0 ]; do echo "$1"; shift; done; }
eval "print_args 1 '2 3' 4" # prints "1", "2 3", "4"
eval print_args 1 '2 3' 4 # prints "1", "2", "3", "4"
Con esto en mente, esto es lo que hacen estos:
eval 'ssh-agent'
eval ssh-agent
Con cualquiera de estos, la cadena ssh-agent es analizado por su shell (Bash) en el comando ssh-agent, y ejecutado. Este comando comienza ssh-agent en el fondo, e imprime algunas configuraciones a la salida estándar, como SSH_AUTH_SOCK=.... Sin embargo, estos ajustes son no interpretado por su shell, que a su vez significa que el shell no sabrá cómo ponerse en contacto con el agente. De hecho, la ssh-add comando probablemente producirá el error: Error connecting to agent: Connection refused. Por esta razón, este comando es Nunca útil. Tal vez quisiste reemplazar las comillas simples ' con citas atrás? (Desafortunadamente, no sé cómo recuperar las cotizaciones para aparecer en los fragmentos de código en línea aquí).
eval "$(ssh-agent)"
eval $(ssh-agent)
eval "`ssh-agent`"
eval `ssh-agent`
Con cualquiera de estos, Bash realiza por primera vez. sustitución de comandos . Por lo tanto, se ejecuta ssh-agent, esto comienza el programa ssh-agent en el fondo, y las configuraciones de salida como SSH_AUTH_SOCK=.... Ahora comienza la sustitución, por lo que Bash reemplaza $(ssh-agent) por su salida SSH_AUTH_SOCK=.... Segundo, el eval Se ejecuta, pero ahora en esos comandos intermedios: eval SSH_AUTH_SOCK=.... De esta manera, la configuración de salida por ssh-agent se importan en el shell en ejecución, por lo que ssh-add sabrá cómo encontrar el ssh-agent proceso. Por lo general, esto es lo que quieres hacer.
exec ssh-agent bash
Esto reemplaza su shell actual por uno donde la configuración de salida por ssh-agent Ya están incorporados. Sin embargo, esto destruye cualquier otra personalización del shell, porque el nuevo shell no los tendrá. Esta es una buena manera de agregar la configuración de ssh-agent, pero solo cuando no te importa tu shell actual.
Con todo esto dicho, no debería haber diferencia en cómo subsiguiente ssh user@server los comandos funcionan entre las opciones 2 y 3. Las diferencias que esté viendo ("a veces") no se deben a ssh-agent o la configuración del shell, sino más bien, a las condiciones de la red.
A un lado, contar ssh para conectarse sin intentar usar la autenticación de contraseña, pruebe uno de los siguientes:
ssh user@server -o BatchMode=true
ssh user@server -o PreferredAuthentications=publickey
ssh-addDe todos modos, ¿por qué el cheque? Para una explicación deevalverifique la página del manual o esta pregunta. El segundo ejemplo ejecutaría lo que sea devuelto por ssh-agent en lugar de obtener el valor de retorno dessh-agent. Para la última visita la página del manual deexec.