Haga que ssh-add sea silencioso si la clave ya está allí


16

Quiero poner ssh-add /path/to/special_keyen la parte superior de un guión. Esto funciona bien, pero siempre solicita la frase de contraseña. Esto es extraño y un poco molesto, ya que todavía solicita la frase de contraseña incluso cuando ssh-add -lmuestra que la clave ya se ha agregado.

¿Hay alguna manera de decirlo: "agregue esta clave y solicite la frase de contraseña si aún no se ha agregado, de lo contrario no haga nada"?


Pregunta similar en superuser.com/q/325662
Darren Cook

Respuestas:


20

No veo ninguna opción para ssh-add que ayude a lograr el resultado deseado, pero es bastante fácil solucionar esto, dado que le preocupa una clave en particular.

Primero, tome la huella digital de su llave especial:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

Digamos que esta huella dactilar se parece a 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Luego, en la parte superior de su script, use ssh-add -lpara verificar si esa clave está cargada, antes de solicitar agregarla:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

Puede doblar todo esto en una sola línea si lo desea:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key

El one-liner funciona bien, ¡gracias!
Darren Cook

1
Creo que esta línea simplificada es un poco más comprensible y preferible, ya que evita ssh-keygen(después de todo, no quiero generar ninguna clave), sino que usa la ruta de la clave:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus

1
ssh-keygenen la respuesta no genera una clave, igual que ssh-add -len su ejemplo, en realidad no agrega nada. Los indicadores modifican el comportamiento de los comandos para que no coincida exactamente con el nombre. Tenga en cuenta que estas versiones difieren funcionalmente: si se verifica por ruta y la clave en esa ruta cambia, su versión no la seleccionará. La versión en la respuesta también detectaría la clave existente sin importar desde dónde se cargó.
Richlv

5

No hay una forma directa de verificar usando solo, ssh-addpero puede usar ssh-keygeny algunas secuencias de comandos para verificar.

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

Lo anterior se imprimiría yessi la huella digital representada por el archivo /path/to/special_keyestuviera presente en ssh-add -lla salida de.

Ejemplo

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

Donde el contenido de la salida de se ssh-keygen -lf /path/to/special_keyve así:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

Y estamos usando 'awk' {print $ 2} 'para seleccionar solo la segunda columna, que contiene la huella digital, es decir:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

Referencias


3

Es posible que tenga razones particulares para usarlo ssh-addexplícitamente, pero si solo desea "Quiero que se me solicite mi frase de contraseña la primera vez que use la clave, pero no después de eso", openssh tiene una solución más simple:

Poner AddKeysToAgent yesen su .ssh/configarchivo.


Gracias. Al parecer, eso se agregó en ssh 7.2 (Ubuntu 18 parece estar en la versión 7.6).
Darren Cook

Sí, "AddKeysToAgent no es compatible con mi versión openssh" es una buena razón para usar ssh-add explícitamente ;-)
Nate

0

ssh-add -K FILEfuncionó bien para mí en Mac.
Todavía muestra las líneas "Identidad agregada:" pero no solicita frase de contraseña.

Desde la página del manual:

-K Al agregar identidades, cada frase de contraseña también se almacenará en el llavero del usuario. Al eliminar identidades con -d, se eliminará cada frase de contraseña.

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.