¿Hay alguna manera conveniente de garantizar que todos los inicios de sesión de un usuario determinado (es decir, yo) utilicen el mismo agente ssh? Pirateé un guión para que esto funcionara la mayor parte del tiempo, pero sospeché todo el tiempo que había alguna forma de hacerlo que me había perdido. Además, desde entonces ha habido avances sorprendentes en la tecnología informática, como por ejemplo este sitio web.
Entonces el objetivo aquí es que
- cada vez que inicio sesión en el cuadro, independientemente de si es a través de SSH, o en una sesión gráfica iniciada desde gdm / kdm / etc, o en una consola:
- si mi nombre de usuario no se está
ssh-agentejecutando actualmente , se inicia uno, se exportan las variables de entorno y sessh-addllama. - de lo contrario, las coordenadas del agente existente se exportan en las variables de entorno de la sesión de inicio de sesión.
- si mi nombre de usuario no se está
Esta facilidad es especialmente valiosa cuando la caja en cuestión se usa como un punto de relevo cuando se sshingresa en una tercera caja. En este caso, evita tener que escribir la frase de contraseña de la clave privada cada vez que ingresa y luego desea, por ejemplo, hacer git pusho algo.
El script que se proporciona a continuación hace esto de manera confiable, aunque falló recientemente cuando X se bloqueó y luego comencé otra sesión gráfica. Es posible que haya habido otros problemas en ese caso.
Aquí está mi guión de malo-es-bueno. Lo obtengo de mi .bashrc.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Por favor, dime que hay una mejor manera de hacer esto. Además, por favor, no discutas las inconsistencias / fallas (por ejemplo, poner varcosas etc); Escribí esto hace un tiempo y desde entonces he aprendido muchas cosas.

Respuestas:
También podría lanzar mi propia variación en la mezcla:
Y luego, cada vez que inicio sesión, si quiero un agente adjunto (que no siempre), simplemente escribo
sagent.fuente
if [ ! -x "$(which ssh-add)" ];debe reemplazarse conif ! which ssh-add;oif ! command -v ssh-add. (Recuerde,[es solo un comando)if ! which ssh-add > /dev/nullpara evitar que se imprima la ruta, en cuyo momento no estoy seguro de que sea más clara, aunque supongo que le ahorrará una invocación de comando adicional.ssh -A [user@]remotehostCreo que esto podría ser lo que estás buscando. Use el modificador -A cuando ejecute ssh reenvíe su agente ssh. Aquí hay un caso de uso:
Tengo un servidor remoto que tiene algunos repositorios git con un control remoto que apunta a github. Sin un ssh-agent ejecutándose en una sesión de pantalla, tengo que ingresar la frase de contraseña de mi clave para hacer un "maestro de origen de extracción de git". Booo! Además, debo tener mi clave privada instalada en el servidor remoto, ¡más Boooo!
En cambio, simplemente usando
ssh -A [user@]remotehostpases a lo largo de mi agente ssh que se ejecuta localmente. Ahora, ya no necesito mi clave privada para existir en el host remoto. No creo que necesites hacer ningún script con ssh-agent.fuente
man 5 ssh_configlaForwardAgentconfiguración de configuración. Permite el reenvío de agentes de forma predeterminada, eliminando la necesidad del-Aargumento. Antes de utilizar el reenvío de agentes, tenga en cuenta que existe un riesgo de seguridad en el que otros usuarios privilegiados de la máquina remota pueden acceder al socket del agente reenviado. Esto también se menciona en la página del manual. Esto se explica bien aquí .Aquí hay uno bastante bueno que también funciona en Cygwin:
Agréguelo a su .bash_profile o .bashrc
Fuente: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
fuente
${SSH_ENV}debe ser"${SSH_ENV}"si su nombre de usuario de Windows tiene un espacio en élIntente usar llavero, está hecho para eso. http://www.gentoo.org/doc/en/keychain-guide.xml
fuente
Recientemente comencé a usar:
https://github.com/ccontavalli/ssh-ident
Todo lo que tengo que hacer es agregar:
En mi archivo .bashrc. El guión se encarga de:
fuente
Prefiero mantener las cosas lo más simple posible: (fragmento de
~/.profile)No pensé en usar
-aantes, pero podría ser más fácil:fuente
En mi caso, he configurado posh-git en PowerShell y quería que cygwin usara el mismo agente ssh. Tuve que hacer algunas manipulaciones de ruta ya que usan diferentes carpetas tmp, y el archivo .env creado fue UTF16 con BOM y CR \ LF, por lo que fue divertido tratarlo. Agregar lo siguiente al .bashrc utilizado por cygwin debería funcionar:
fuente
De nuevo, un ejemplo para poner su .bash_profile inmediatamente y pedirle que agregue su clave predeterminada al iniciar sesión. El reenvío no era una opción en mi caso.
fuente
Esta es mi solución, adaptada de https://superuser.com/a/141233/5255 (en este hilo):
fuente
crear archivo ~ / ssh-agent.sh
incluir el archivo en .bashrc
fuente
Esto es algo que he agregado que funciona para mí. Primero verifica si tiene un agente ejecutándose, en caso afirmativo, establecerá los entornos adecuados para él, si no, lo creará. También elimina la creación de agentes adicionales:
Solo ponlo en tu
.bashrcfuente
También tengo una variación sobre este problema, tomada directamente de mi .bashrc:
Esta solución almacena una copia de la información del agente SSH en su directorio de inicio. En caso de que tenga un directorio de inicio montado en NFS que pueda compartirse entre varios hosts, el nombre de host se usa como parte del nombre de archivo para diferenciarlos, por lo que iniciar sesión desde una máquina no bloqueará el archivo del agente en uso en otra.
Comportamiento:
1) Las sesiones de usuario por primera vez se les solicita una frase de contraseña clave.
2) Las sesiones segunda, tercera y cuarta (etcétera) heredan el agente SSH y las claves agregadas en la primera.
3) Si el agente se mata o se bloquea, la primera sesión posterior creará un nuevo agente, sobrescribirá el archivo del agente con el nuevo y solicitará una frase clave nuevamente. Las sesiones creadas posteriormente se comportarán como el escenario 2), siempre y cuando el nuevo agente SSH siga ejecutándose.
fuente
(esto se refiere a la publicación 2 más alta, no pude agregar un comentario)
@raghavan: su ejemplo es útil, pero sugeriría cambiar las dos líneas que tienen
pgrep ssh-agent
a
pgrep -u $ USER ssh-agent> / dev / null
para que solo se encuentren los agentes que se ejecutan bajo el usuario actual, y el pid no se repite en la pantalla (limpiador).
También sugiero cambiar $ HOME / ssh-agent.out a $ HOME / .ssh-agent.out
Saludos
fuente
Leí su solución original y varias de las sugeridas, pero decidí simplificar el proceso para mi propio uso. Esto es lo que agregué en mi propio .bashrc:
He hecho un par de suposiciones aquí:
En general, creo que se siente como una solución simple.
fuente
Descubrí que a menudo tenía múltiples
ssh-agentprocesos en ejecución, y que el PID dentro del nombre de archivo del socket nunca coincidía con el PID de una ejecuciónssh-agent, por lo que pirateé algo para intentar recuperarme de estas condiciones, en base a numerosos ejemplos anteriores.Es una función única, utiliza una variable Zsh para la ID de usuario si está allí, y trata de pasar menos tiempo analizando
/tmpdirectorios posiblemente grandes restringiendofind(1)un poco más.Probablemente todavía sea propenso a errores y sea complicado, pero algunas pruebas superficiales indican que funciona principalmente para mis casos de uso, así que aquí va:
attach_ssh_agent () { si [-n "$ SSH_AGENT_PID"]; entonces ssh-add -l> / dev / null ret = $? si [$ ret -ge 2]; entonces echo "El agente pid $ SSH_AGENT_PID es menos que útil (ret = $ ret) - matando ..." matar $ SSH_AGENT_PID desarmado $ SSH_AGENT_PID elif [$ ret = 1]; entonces echo "El agente pid $ SSH_AGENT_PID es menos que útil (ret = $ ret) - lo sembrará ..." más echo "Agente pid $ SSH_AGENT_PID" regreso fi fi si [-S "$ SSH_AUTH_SOCK"]; entonces ssh-add -l> / dev / null ret = $? si [$ ret = 2]; entonces echo "El socket $ SSH_AUTH_SOCK está muerto - eliminando ..." rm -f $ SSH_AUTH_SOCK desarmar SSH_AUTH_SOCK elif [$ ret = 1]; entonces echo "Socket $ SSH_AUTH_SOCK apunta a un agente sin claves ..." ssh-add más echo "Agente ssh encontrado $ SSH_AUTH_SOCK (ret = $ ret)" regreso fi fi para sf en $ (find / tmp / -mindepth 2 -maxdepth 2 -uid $ {UID: - $ (id -u)} -path '/tmp/ssh-*/agent.*' -type s); hacer prueba -r $ sf || Hacer continuación export SSH_AUTH_SOCK = $ sf SSH_AGENT_PID = $ (nombre base $ SSH_AUTH_SOCK | cut -d. -F2) # carreras con otras horquillas de proceso, argh prueba = 50 mientras que [$ try -gt 0]; hacer try = $ (($ try-1)) export SSH_AGENT_PID = $ (($ SSH_AGENT_PID + 1)) echo "Prueba $ SSH_AUTH_SOCK -> $ SSH_AGENT_PID" ssh_agent_running = $ (ps -u $ USER | grep ssh-agent) if [-z "$ ssh_agent_running"]; entonces echo "Socket $ SSH_AUTH_SOCK no contiene un enlace a ningún agente en ejecución, eliminando ..." rm -f $ SSH_AUTH_SOCK Hacer continuación fi si echo "$ ssh_agent_running" | \ awk '$ 1 ==' $ SSH_AGENT_PID '{ encontrado = 1; salida (0); } FIN { si se encuentra) { print "no se encontró el PID en ejecución '$ SSH_AGENT_PID'"; salida (1); } } '; entonces ssh-add -l> / dev / null ret = $? si [$ ret -ge 2]; entonces echo "El socket $ SSH_AUTH_SOCK no contiene un enlace a un agente útil en $ SSH_AGENT_PID - eliminando ..." rm -f $ SSH_AUTH_SOCK matar $ SSH_AGENT_PID desarmar SSH_AGENT_PID continuar 2 elif [$ ret = 1]; entonces echo "El socket $ SSH_AUTH_SOCK contiene un enlace a un agente poco útil en $ SSH_AGENT_PID - seeding ..." ssh-add Si ! ssh-add -l> / dev / null; entonces echo "El socket $ SSH_AUTH_SOCK todavía contiene un enlace a un agente poco útil en $ SSH_AGENT_PID - abortando". regreso más rotura fi más rotura fi más # echo "No se pudo hacer coincidir el socket $ SSH_AUTH_SOCK con el agente PID $ SSH_AGENT_PID - omitiendo ..." Hacer continuación fi hecho si [$ try -gt 0]; entonces echo "Agente ssh encontrado $ SSH_AUTH_SOCK" echo "Agente pid $ SSH_AGENT_PID" regreso fi hecho if [-n "$ try" -a -n "$ SSH_AUTH_SOCK" -a -n "$ ssh_agent_running"]; entonces echo "Lo intentamos muchas veces, pero no pudimos igualar $ SSH_AUTH_SOCK con ninguno de los agentes en ejecución, suspiro" echo "$ ssh_agent_running" echo "Dejando estas sobras y comenzando un nuevo agente ..." fi eval $ (ssh-agent -t 28800) ssh-add }fuente
Aquí está mi giro en esto. ' Fuente ' el siguiente script de mi .bash_profile :
fuente
Aquí hay un script simple que siempre reutilizará el mismo ssh-agent, o iniciará ssh-agent si no se está ejecutando. La clave es usar la
-aopción para usar el mismo nombre de socket. De lo contrario, de forma predeterminada, elegirá un nombre de socket aleatorio cada vez. También puede combinar fácilmente estas 3 líneas en un alias de 1 línea.fuente
fuente