Tengo una pregunta sobre las diferentes formas, significados y errores usando el Agente SSH.
Estoy usando Ubuntu 14.04 LTS en Amazon Web Services.
¿Cuáles son las diferencias entre las diferentes formas de usar el Agente de SSH?
Este es el primero:
eval 'ssh-agent -s'
ssh-add id_rsa
Para comprobar si este paso funciona, uso el comando. ssh localhost
para comprobar si la conexión no me pide la frase de contraseña.
Sin embargo, otras veces que usé este comando obtuvimos una conexión rechazada o la conexión nos solicitó la contraseña. Luego, para resolver este problema, encontré otra forma:
eval "$(ssh-agent)"
ssh-add id_rsa
Sin embargo, a veces obtenemos una conexión rechazada o la conexión nos pide la frase de contraseña, pero encontré una tercera forma de resolver el problema:
exec ssh-agent bash
ssh-add id_rsa
El problema es que no entiendo la razón, porque a veces tengo que usar una u otra, con la misma distribución (Ubuntu 14.04 LTS) en el mismo servicio (AWS). ¿Cual es la diferencia entre ellos?
fuente
ssh-add
De todos modos, ¿por qué el cheque? Para una explicación deeval
verifique 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
.ssh-agent
tiene una explicación para el-s
camino.Respuestas:
Aquí hay 2 reglas para empezar:
A menos que use explícitamente TCSH o similar, usará Bash, por lo que
-s
argumento es redundanteEn Bash,
eval
no le importa el nivel de cotización, lo que significa queeval "1 2"
yeval 1 2
Hará exactamente lo mismo. Sin embargo, las citas todavía cambian la interpretación de los caracteres en el interior:Con esto en mente, esto es lo que hacen estos:
Con cualquiera de estos, la cadena
ssh-agent
es analizado por su shell (Bash) en el comandossh-agent
, y ejecutado. Este comando comienzassh-agent
en el fondo, e imprime algunas configuraciones a la salida estándar, comoSSH_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, lassh-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í).Con cualquiera de estos, Bash realiza por primera vez. sustitución de comandos . Por lo tanto, se ejecuta
ssh-agent
, esto comienza el programassh-agent
en el fondo, y las configuraciones de salida comoSSH_AUTH_SOCK=...
. Ahora comienza la sustitución, por lo que Bash reemplaza$(ssh-agent)
por su salidaSSH_AUTH_SOCK=...
. Segundo, eleval
Se ejecuta, pero ahora en esos comandos intermedios:eval SSH_AUTH_SOCK=...
. De esta manera, la configuración de salida porssh-agent
se importan en el shell en ejecución, por lo quessh-add
sabrá cómo encontrar elssh-agent
proceso. Por lo general, esto es lo que quieres hacer.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 dessh-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 assh-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:fuente