¿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-agent
ejecutando actualmente , se inicia uno, se exportan las variables de entorno y sessh-add
llama. - 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 ssh
ingresa 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 push
o 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 var
cosas 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/null
para 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@]remotehost
Creo 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@]remotehost
pases 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_config
laForwardAgent
configuración de configuración. Permite el reenvío de agentes de forma predeterminada, eliminando la necesidad del-A
argumento. 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
-a
antes, 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
.bashrc
fuente
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-agent
procesos 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
/tmp
directorios 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:
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
-a
opció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