53 votos

Cómo dar nombre de usuario/contraseña a git clone en un script, pero no almacenar las credenciales en .git/config

Estoy clonando un repositorio git en un script así:

git clone https://user:password@host.com/name/.git

Esto funciona, pero mi nombre de usuario y mi contraseña! se almacenan ahora en la url de origen en .git/config .

¿Cómo puedo evitar esto, pero todavía hacer esto en un script (por lo que no hay entrada manual de la contraseña)?

0 votos

Probablemente puedas actualizar el origen después: git remote set-url origin https://host.com/name/.git

0 votos

@ceejayoz Sí, eso es posible. Gracias por la idea. Todavía estoy esperando una solución, que ni siquiera almacenar temporalmente las credenciales.

4 votos

Claro, utilice la autenticación basada en SSH con una clave.

29voto

Vaidas Zilionis Puntos 630

El método que yo utilizo es usar realmente un git pull en lugar de un clon. El script quedaría así:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:password@github.com/name/repo.git master

Esto no almacenará su nombre de usuario o contraseña en .git/config . Sin embargo, a menos que se tomen otras medidas, el nombre de usuario y la contraseña en texto plano serán visibles mientras el proceso se esté ejecutando desde los comandos que muestran los procesos actuales (por ejemplo ps ).

Como se ha mencionado en los comentarios, ya que este método utiliza HTTPS debe codificar en la URL cualquier carácter especial que también puede aparecer en su contraseña.

Una sugerencia más que haría (si no puedes usar ssh) es usar un token OAuth en lugar de nombre de usuario/contraseña en texto plano, ya que es un poco más seguro. Puedes generar un token OAuth desde la configuración de tu perfil: https://github.com/settings/tokens .

Entonces usando ese token el comando pull sería

git pull https://$OAUTH_TOKEN:x-oauth-basic@github.com/name/repo.git master

0 votos

No puedo usar tokens de autenticidad. No estoy usando github pero un servidor privado.

3 votos

También hay que tener en cuenta que el nombre de usuario y la contraseña serán visibles en, por ejemplo, ps mientras se ejecuta el pull (al menos, a menos que haya impedido que los usuarios vean los procesos de los demás)

0 votos

Puntos por el uso del juramento. Es exactamente lo que necesitaba en producción/establecimiento/dev.

25voto

user26405 Puntos 11

IMO la mejor solución es usar un GIT_ASKPASS helper y entregar la contraseña como otra variable de entorno. Así, por ejemplo, crear un archivo git-askpass-helper.sh como:

#!/bin/sh
exec echo "$GIT_PASSWORD"

y luego ejecutar git clone https://username@hostname/repo con variables de entorno GIT_ASKPASS=/path/to/git-askpass-helper.sh y GIT_PASSWORD=nuclearlaunchcodes .

Esto tiene la ventaja de que la contraseña no será visible también en la lista de procesos.

0 votos

+1 a la solución creativa. Esto sería un poco más seguro que el git pull y le permite almacenar la contraseña en texto plano como un secreto en su herramienta de despliegue automatizado de elección.

1 votos

No ha funcionado. Todavía pide una contraseña en git clone

0 votos

¿Hay alguna forma de hacerlo funcionar en Windows? Creo que vi la solución para reemplazar el archivo .sh con exe, pero no quiero (No puedo enfatizar lo suficiente) commit un exe en mi repo

16voto

CoolAJ86 Puntos 189

Después de repasar docenas de los puestos de SO, blogs, etc, probé cada método, y esto es lo que se me ocurrió. Cubre TODO.

Ver Hoja de trucos sobre credenciales Git y paquetes privados

Estas son todas las formas y herramientas por las que puedes autentificar git de forma segura para clonar un repositorio sin una solicitud de contraseña interactiva .

  • Claves públicas SSH
    • SSH_ASKPASS
  • Tokens de acceso a la API
    • GIT_ASKPASS
    • .gitconfig en lugar de
    • .gitconfig [credencial]
    • .git-credentials
    • .netrc
  • Bonificación: Funciona con paquetes privados
    • node / npm package.json
    • Python / pip / huevos requirements.txt
    • ruby gems Gemfile
    • golang go.mod

Las mejores opciones para no almacenar texto plano

Por lo que se pide aquí ya sea Claves SSH, GIT_ASKPASS o git credential store utilizar el gestor de llaveros del sistema operativo podría ser la mejor opción.

Como GIT_ASKPASS es probablemente el menos comprendido de los 3, lo detallaré aquí - y los otros están en la hoja de trucos.

GIT_ASKPASS

Cómo crear un GIT_ASKPASS script:

echo 'echo $MY_GIT_TOKEN' > $HOME/.git-askpass

Cómo utilizarlo:

export MY_GIT_TOKEN=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
export GIT_ASKPASS=$HOME/.git-askpass
git clone https://token@code.example.com/project.git

El script recibe stdin en forma de:

Password for 'scheme://host.tld':

El script recibe ENVs de Git como:

GIT_DIR=/Users/me/project/.git
GIT_EXEC_PATH=/usr/local/Cellar/git/2.19.0_1/libexec/git-core
GIT_PREFIX=

Más detalles en el hoja de trucos .

15voto

Brett Levene Puntos 196

Puede introducir sus credenciales de conexión en su ~/.netrc archivo. Algo parecido a:

machine host.example.net
login bart
password eatmyshorts

Sólo asegúrese de chmod ese archivo a 600. Si utiliza Windows, el siguiente enlace puede ser útil: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on-Windows-to-save-user-and-password

Personalmente, tiendo a utilizar claves SSH para fines de autenticación (si se le permite, por supuesto).

0 votos

Bueno, esto dejaría mi contraseña dentro de ~/.netrc. Yo también no quiero eso.

0 votos

Esto me ha funcionado, cuando la sugerencia de GIT_ASKPASS de arriba ha fallado; gracias.

0voto

Kyle Puntos 1

Guarda tu token o contraseña en algún lugar seguro, por ejemplo pasar .

A continuación, utilice un bash script para asignar git host a su almacén de contraseñas, por ejemplo

#!/usr/bin/env bash
# assuming "get" action from git and a config like this
# git config --global credential.helper $XDG_BIN_HOME'/git_credentials_from_pass $@'
while IFS= read -r line
do
  echo "$line"
  if [[ "$line" =~ host=.*github.com.* ]]; then
      echo "username=your_user_name"
      echo "password=$(pass show token_github.com/your_username)"
  #else ...
  fi
done

Cambiar your_username y token_github.com la forma en la que lo has configurado.

Fuente .

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: