(He leído muchas de las preguntas en este sitio que parecen relacionadas y creo que esta es una pregunta realmente nueva).
Tengo muchas claves en muchos servidores y todas están protegidas con frases de contraseña.
Me gusta ingresar frases de contraseña tanto como me gusta ingresar contraseñas: es una verdadera pérdida de productividad.
Los comandos ssh-agent + ssh-add se pueden usar en un shell de inicio de sesión para significar que solo tiene que ingresar su frase de contraseña una vez al iniciar sesión
El llavero se puede usar para mantener vivo un agente ssh más allá del cierre de sesión, por ejemplo, puede tenerlo para que solo tenga que ingresar la frase de contraseña una vez en el arranque, o puede hacer que lo mantenga vivo durante una hora más o menos.
El problema que tengo es que estas dos soluciones generalmente se inician en un inicio de sesión de shell (por ejemplo .zshrc
), confían en que ingrese mi frase de contraseña cuando inicie sesión, incluso si no voy a necesitar que se desbloquee. (No estoy contento con el llavero que mantiene vivo a un agente indefinidamente).
Lo que me gustaría es que se me solicite una frase de contraseña (para un agente) solo cuando sea necesario .
Entonces puedo iniciar sesión en el servidor A, hacer algunas cosas, luego enviar ssh al servidor B y en ese momento se me pedirá la frase de contraseña. Haga algunas cosas en el servidor B, cierre la sesión. De vuelta en A, haga algunas cosas más, vuelva a enviar ssh a B y no necesite mi frase de contraseña (está en manos de un agente).
Observo que esto es posible en escritorios gráficos como Gnome: aparece una ventana emergente que solicita la frase de contraseña para desbloquear su clave privada tan pronto como intenta ssh. Entonces esto es lo que busco, pero desde una consola.
Respuestas:
No agregue nada a ninguno de sus scripts de inicio de shell, esto es piratería innecesaria.
En cambio, agregue
a su .ssh / config
De esta manera, ssh-add se ejecuta automáticamente la primera vez que ssh en otro cuadro. Solo tiene que volver a ingresar su clave cuando caduque de ssh-agent o después de reiniciar.
fuente
Zsh tiene un
preexec
gancho que ejecuta una función antes de ejecutar un comando ingresado en la línea de comando. Aquí hay un gancho que buscassh
en su línea de comando y, si lo encuentra, verifica la existencia de un agente ssh. Si eso no se encuentra, ejecuta keychain.De esta manera, el llavero solo se ejecuta antes de los comandos ssh, y luego solo si es necesario.
Pon esto en tu
~/.zshrc
:Lo que sucede aquí es que cada vez que se escribe un comando,
check_ssh
se llama antes de que se ejecute el comando.La primera línea de la función verifica el comando expandido para
ssh
usar una expresión regular Zsh.ssh
debe tener límites de palabras a\b
ambos lados. Si esto no se encuentra, la función vuelve.La siguiente línea verifica que hay un proceso de agente SSH en la variable de entorno, y que ese proceso todavía existe en la tabla de procesos, y que al menos una clave se ha agregado al agente. Si todo eso está bien, entonces el agente ssh está configurado y no necesitamos hacer nada, por lo que regresa.
Finalmente comenzamos el llavero, con el agente que se mantendrá vivo durante una hora.
Todavía deja el problema sobre las cosas ssh incrustadas, como
git
orrsync
oscp
as que no activarán la función (puede agregarlas a la expresión regular).fuente
zsh
, se podría crear un script corto con el mismo efecto y colocarloPATH
ante elssh
cliente real . Incluso podría funcionar conrsync
et al, si leen enPATH
lugar de ejecutarse/usr/bin/ssh
directamente.Para zsh, he escrito un conjunto de utilidades y envoltorios para hacer más o menos lo que quieres: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils
En realidad, esto hace aún más, porque el
ssh-agent
que será compartido por todas las sesiones de inicio de sesión (escritorio o mediante SSH, y GNU Screen también es compatible si inicia shells de inicio de sesión desde allí, por ejemplo,shell -zsh
en el~/.screenrc
archivo), y se cerrará solo después de La última sesión termina.Nota: Solo uso una frase de contraseña para todas mis claves. No estoy seguro del comportamiento de diferentes frases de contraseña; Es posible que necesite algunos cambios.
fuente