Configurar Git sobre SSH para iniciar sesión una vez

195

He clonado mi repositorio git sobre ssh. Entonces, cada vez que me comunico con el maestro de origen presionando o tirando, tengo que volver a ingresar mi contraseña. ¿Cómo puedo configurar git para que no necesite ingresar mi contraseña varias veces?

reprogramador
fuente
77
Parece un problema de seguridad, no tiene que usar ninguna contraseña para realizar confirmaciones normales, pero un empujón es el tipo de cosa con la que desea volver a autenticarse, pero tal vez estoy pasado de moda.
Alex Sexton

Respuestas:

104

Intenta ssh-add, debes ssh-agentestar ejecutando y manteniendo tu clave privada

(Ok, respondiendo a la pregunta actualizada, primero se ejecuta ssh-keygenpara generar una clave pública y privada como explicó Jefromi . Se pone la clave pública en el servidor. Debería usar una frase de contraseña, si no tiene el equivalente de un simple -Texto contraseña en su clave privada. Pero cuando lo haga, entonces necesita como cuestión práctica como se explica a continuación.)ssh-agent

Desea ejecutarse ssh-agenten segundo plano cuando inicie sesión. Una vez que inicie sesión, la idea es ejecutar ssh-adduna vez y solo una vez, para darle al agente su frase de contraseña, para decodificar su clave. El agente simplemente se queda en la memoria con su llave desbloqueada y cargada, lista para usar cada vez que ssh en algún lugar.

Todos los comandos ssh-family 1 consultarán al agente y podrán usar automáticamente su clave privada.

En los sistemas OSX (err, macOS ), GNOME y KDE, ssh-agentgeneralmente se inicia automáticamente para usted. Revisaré los detalles en caso de que, como yo, usted también tenga un entorno Cygwin u otro entorno de Windows donde esto ciertamente no se hace por usted.

Haga clic aquí: man ssh-agent.

Hay varias formas de ejecutar automáticamente el agente. Como explica la página del manual, puede ejecutarla para que sea un padre de todos los demás procesos de su sesión de inicio de sesión. De esa manera, las variables de entorno que proporciona estarán automáticamente en todos sus shells. Cuando (más tarde) invocas ssh-addossh ambos tendrán acceso al agente porque todos tienen las variables de entorno con nombres de ruta de socket mágicos o lo que sea.

Alternativamente, puede ejecutar el agente como un hijo ordinario, guardar la configuración del entorno en un archivo y obtener ese archivo en cada shell cuando se inicie.

Mis sistemas OSX y Ubuntu realizan automáticamente la configuración de inicio del agente, por lo que todo lo que tengo que hacer es ejecutarlo ssh-adduna vez. Intente ejecutar ssh-addy ver si funciona, si es así, solo necesita hacerlo una vez por reinicio.

Mi sistema Cygwin necesitaba hacerlo manualmente, así que hice esto en mi .profiley tengo .bashrcfuente .profile:

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

El .agentarchivo es creado automáticamente por el script; contiene las definiciones de variables de entorno y exportaciones. Lo anterior intenta obtener el archivo .agent y luego intenta con ps(1)el agente. Si no funciona, inicia un agente y crea un nuevo archivo de agente. También puede simplemente ejecutar ssh-addy, si falla, iniciar un agente.


1. E incluso local y remoto sudocon la extensión de pam correcta.

DigitalRoss
fuente
1
En lugar de obtener el resultado ssh-agent, probablemente sea más eval `ssh-agent`
fácil de
285

Tuve un problema similar con el GitHub porque estaba usando el protocolo HTTPS. Para verificar qué protocolo estás usando solo ejecuta

git config -l

y mira la línea que comienza con remote.origin.url. Para cambiar tu protocolo

git config remote.origin.url [email protected]:your_username/your_project.git
Muein Muzamil
fuente
12
Creo que esta debería ser la respuesta oficial, ^ 5 @Muein!
Fer Martin
14
esto no funciona cuando el repositorio es privado y usted no es el propietario. Acabo de enfrentar un Permission deniederror.
Ogzd
77
Esto es solo para un repositorio, ¿cómo puedo hacerlo globalmente?
onmyway133
2
@ogzd GitHub (o cualquier servicio que esté utilizando) necesita su clave SSH pública antes de que esto funcione, pero esta sigue siendo la solución correcta.
MattM
una alternativa esgit remote set-url origin [email protected]:your_username/your_project.git
icosamuel
24

Esto se trata de configurar ssh, no git. Si aún no lo ha hecho, debe usar ssh-keygen(con una frase de contraseña en blanco) para crear un par de claves. Luego, copie la clave pública en el destino remoto con ssh-copy-id. A menos que necesite múltiples claves (por ejemplo, una más segura con una frase de contraseña para otros fines) o tenga algunas cosas realmente raras de identidad múltiple, es así de simple:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

Editar: Realmente deberías leer la respuesta de DigitalRoss, pero: si usas claves con frases de contraseña, deberás usarlas ssh-add <key-file>para agregarlas ssh-agent(y obviamente comenzar y ssh-agentsi tu distribución aún no tiene una para ti).

Cascabel
fuente
2
No estoy seguro de que esto responda la pregunta, ya debe haberlo hecho o no podría acceder al sitio. La respuesta que necesita es: ssh-agentya que quiere evitar el problema de ingresar la frase de contraseña cada vez. No voto negativo, pero creo que necesitas mejorar esta respuesta, a menos que sea yo quien no haya entendido bien ...
DigitalRoss
2
@DigitalRoss: Ah, no estaba seguro al leer la pregunta si el OP realmente tenía las claves configuradas. Probablemente tengas razón, y deliberadamente estaba tratando de sugerir no usar una frase de contraseña. Sin embargo, por supuesto tienes razón ssh-agent. +1 para ti!
Cascabel
Estoy confundido si necesito usar ssh-keygen o ssh-add. En mi directorio ~ / .ssh / solo tengo dos archivos: config y known_hosts. Parece que ssh-add requiere otro archivo ~ / .ssh / id_rsa. ¿Debo crear ese archivo primero usando ssh-keygen como @Jefromi explicó?
reprogramador
Sí, debe crear la clave antes de poder copiarla en el servidor remoto. Creo que quizás estábamos confundidos por su uso de la palabra "frase de contraseña", que es lo que ssh-*se necesita para usar la clave, ¿en qué se refería realmente a su contraseña de usuario real en el control remoto?
Cascabel
Sí, debería haber dicho contraseña en lugar de frase de contraseña.
reprogramador
23

Asegúrese de que cuando clonó el repositorio, lo hizo con la URL SSH y no con el HTTPS; en el cuadro de URL de clonación del repositorio, elija el protocolo SSH antes de copiar la URL. Ver imagen a continuación:

ingrese la descripción de la imagen aquí

Zorayr
fuente
23

Si ha clonado con HTTPS (recomendado), entonces: -

git config --global credential.helper cache

y entonces

git config --global credential.helper 'cache --timeout=2592000'
  • tiempo de espera = 2592000 (30 días en segundos) para habilitar el almacenamiento en caché durante 30 días (o las suites que desee).

  • Ahora ejecute un comando git simple que requiere su nombre de usuario y contraseña.

  • Ingrese sus credenciales una vez y ahora el almacenamiento en caché está habilitado durante 30 días.

  • Intente nuevamente con cualquier comando git y ahora no necesita ninguna credencial.

  • Para más información: - Almacenamiento en caché de su contraseña de GitHub en Git

Nota : Necesita Git 1.7.10 o posterior para usar el asistente de credenciales. Al reiniciar el sistema, es posible que debamos ingresar la contraseña nuevamente.

Nishant Thapliyal
fuente
1
Eres un salvador, estaba cansado de escribir la contraseña del nombre de usuario cada vez. Gracias :)
Dave Ranjan
especifique si esto es solo para Linux o solo para Windows o ambos.
joedotnot
@joedotnot para todos los sistemas operativos. También puede navegar por el enlace mencionado y allí encontrará la opción de SO justo debajo del encabezado.
Nishant Thapliyal
¡Esta! Funciona en todos los casos.
Akaisteph7
@ Charles Hola, acabo de probar lo mismo y está funcionando como se esperaba.
Nishant Thapliyal
8

Extendiendo los pensamientos de Muein para aquellos que prefieren editar archivos directamente sobre la ejecución de comandos en git-bash o terminal.

Vaya al directorio .git de su proyecto (raíz del proyecto en su máquina local) y abra el archivo 'config'. Luego busque ["origen" remoto] y configure la configuración de url de la siguiente manera:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = [email protected]:<username>/<projectname>.git
Uchamp
fuente
1
Esto realmente ayudó. Forma segura y limpia de solucionar el problema. Creo que alguien debería mejorar la respuesta de Muein con esta.
Luis Ortega Araneda
1
"Ve al directorio .git de tu proyecto" intentando por primera vez
amuliar el
Obtener este error "fatal: no manejo el protocolo '[email protected]: <nombre de usuario> / https'"
Shivam Bharadwaj
@ShivamBharadwaj una búsqueda rápida reveló este hilo stackoverflow.com/questions/30474447/… . ¿Existe la posibilidad de que esté copiando el comando git clone de algún sitio web y se encuentre con este problema? En caso afirmativo, intente escribir el comando completo en su lugar.
uchamp
6

Creo que hay dos cosas diferentes aquí. La primera es que la autenticación SSH normal requiere que el usuario coloque la contraseña de la cuenta (donde la contraseña de la cuenta se autenticará con diferentes métodos, dependiendo de la configuración de sshd).

Puede evitar poner esa contraseña usando certificados. Con los certificados todavía tiene que poner una contraseña, pero esta vez es la contraseña de su clave privada (que es independiente de la contraseña de la cuenta).

Para hacer esto, puede seguir las instrucciones señaladas por steveth45:

Con autenticación de clave pública .

Si quiere evitar poner la contraseña del certificado cada vez, puede usar ssh-agent, como lo señala DigitalRoss

La forma exacta de hacerlo depende de Unix vs Windows, pero esencialmente necesita ejecutar ssh-agent en segundo plano cuando inicie sesión, y luego, la primera vez que inicie sesión, ejecute ssh-add para darle al agente su frase de contraseña. Todos los comandos de la familia ssh consultarán al agente y recogerán automáticamente su frase de contraseña.

Comience aquí: man ssh-agent.

El único problema de ssh-agent es que, al menos en * nix, debe colocar la contraseña de los certificados en cada nuevo shell. Y luego el certificado se "carga" y puede usarlo para autenticarse en un servidor ssh sin poner ningún tipo de contraseña. Pero esto está en ese caparazón particular.

Con keychain puede hacer lo mismo que ssh-agent pero "en todo el sistema". Una vez que enciende su computadora, abre un shell y coloca la contraseña del certificado. Y luego, cualquier otro shell usará ese certificado "cargado" y su contraseña nunca será solicitada nuevamente hasta que reinicie su PC.

Gnome tiene una aplicación similar, llamada Gnome Keyring que solicita la contraseña de su certificado la primera vez que la usa y luego la almacena de forma segura para que no se le vuelva a preguntar.

Gaston
fuente
Yo mismo uso el llavero : muy útil.
Jakub Narębski
hay una manera más escribiendo AddKeysToAgent yes.ssh / config. Luego se carga en la memoria hasta que apaga la computadora
infoclogged
4
ssh-keygen -t rsa

Cuando se le solicite una frase de contraseña, déjela en blanco, es decir, simplemente presione Intro. ¡¡Tan sencillo como eso!!

Srinivas Kattimani
fuente
44
Tenga en cuenta que si hace esto, cualquier persona que tenga acceso a su cliente de desarrollo tendrá acceso al servidor de repositorio sin necesidad de una contraseña. El combo ssh-agent / ssh-add brinda una seguridad mucho mejor.
Peter V. Mørch
3

Intente esto desde la caja desde la que está presionando

    ssh [email protected]

Entonces debería recibir una respuesta de bienvenida de github y estará bien para luego presionar.

enviar
fuente
2
Se está trabajando para mí Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Pero de alguna manera GIT todavía me pide la contraseña cuando intento de empujar
gkucmierz
2

Tuve que clonar un repositorio git de un servidor que no permitía iniciar sesión con una clave ssh sino solo con un usuario / contraseña. No encontré ninguna forma de configurar el complemento de Git para usar una combinación simple de usuario / contraseña, así que agregué el siguiente comando de shell como paso previo a la compilación en una máquina de compilación de Linux que depende de la herramienta esperada (apt-get install wait):

¡ESTA NO ES UNA BUENA MANERA DE RESOLVER ESTE PROBLEMA COMO SU CONTRASEÑA SE MUESTRA COMO TEXTO CLARO EN LA CONFIGURACIÓN Y LOS REGISTROS DEL TRABAJO DE JENKINS! ÚNICAMENTE ÚSELO SI NO HAY FORMA DE CONFIGURAR LA AUTENTIFICACIÓN RSA-KEY U OTRAS POSIBILIDADES DE CONFIGURACIÓN.

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'
ene
fuente
1

Agregue una sola línea AddKeysToAgent yesen la parte superior del archivo .ssh / config. Por supuesto, ssh-agent debe estar ejecutándose de antemano. Si no se está ejecutando (verifique porprep ssh-agent ), simplemente ejecúteloeval $(ssh-agent)

Ahora, la clave se carga en todo el sistema en la memoria y no tiene que volver a escribir la frase de contraseña.

La fuente de la solución es /ubuntu/362280/enter-ssh-passphrase-once/853578#853578

infoclogged
fuente
0

He estado tratando de evitar escribir la frase de contraseña todo el tiempo también porque estoy usando ssh en Windows. Lo que hice fue modificar mi archivo .profile, para ingresar mi frase de contraseña en una sesión en particular. Entonces esta es la pieza de código:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

así que con esto escribo mi frase de contraseña una vez en una sesión ...

David Blay
fuente
-1

Intenté todas estas sugerencias y más, solo para poder obtener clon de mi instancia de AWS. Nada funcionó. Finalmente hice trampa por desesperación: copié el contenido de id_rsa.pub en mi máquina local y lo agregué a ~ / .ssh / known_hosts en mi instancia de AWS.

alansendgi
fuente
1
¿Estás seguro de que no te refieres a ~ / .ssh / certified_keys?
Kevin_Kinsey