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

31

Estoy clonando un repositorio git en un script como este:

git clone https://user:[email protected]/name/.git

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

¿Cómo puedo evitar esto, pero aún así hacerlo en un script (por lo que no hay entrada de contraseña manual)?

Nathan
fuente
Probablemente podría actualizar el origen después:git remote set-url origin https://host.com/name/.git
ceejayoz
@ceejayoz Sí, eso es posible. Gracias por la idea. Todavía espero una solución, que ni siquiera almacena temporalmente las credenciales.
Nathan
44
Claro: use la autenticación basada en SSH con una clave.
ceejayoz
2
¿Hay alguna razón por la que usas https en lugar de SSH? SSH admite claves.
mzhaase
1
@MartijnCourteaux La contraseña se le da realmente al script a través de una variable de entorno. Así que realmente hago: git clone username: $ PASSWORD @ ...
Nathan

Respuestas:

20

El método que uso es en realidad usar un en git pulllugar de un clon. El guión se vería así:

mkdir repo
cd repo
git init
git config user.email "email"
git config user.name "user"
git pull https://user:[email protected]/name/repo.git master

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

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

Luego, usando ese token, el comando de extracción sería

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
FGreg
fuente
Desafortunadamente no puedo usar tokens de autenticación. No estoy usando github sino un servidor privado.
Nathan
3
También se debe tener en cuenta que el nombre de usuario y la contraseña serán visibles, por ejemplo, psmientras se ejecuta el pull (al menos a menos que haya impedido que los usuarios vean los procesos de los demás)
derobert
Puntos por uso de juramento. Es exactamente lo que necesitaba en producción / puesta en escena / desarrollo.
RobotHumans
Un millón de gracias a ti amigo. horas desperdiciadas n horas n finalmente su respuesta vino a salir. :
thumbsup
17

En mi opinión, la mejor solución es usar un GIT_ASKPASSayudante personalizado y entregar la contraseña como otra variable de entorno. Entonces, por ejemplo, cree un archivo git-askpass-helper.shcomo:

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

y luego correr git clone https://username@hostname/repocon variables de entorno GIT_ASKPASS=/path/to/git-askpass-helper.shy GIT_PASSWORD=nuclearlaunchcodes.

Esto tiene la ventaja de que la contraseña tampoco estará visible en la lista de procesos.

intgr
fuente
+1 para solución creativa. Esto sería un poco más seguro que la git pullsolución y le permitiría almacenar la contraseña de texto sin formato como un secreto en la herramienta de implementación automática que elija.
FGreg
13

Puede ingresar sus créditos de conexión en su ~/.netrcarchivo. Algo en la línea de:

machine host.example.net
login bart
password eatmyshorts

Solo asegúrate de cambiar ese archivo a 600. Si estás usando Windows, el siguiente enlace puede ser útil: /programming/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

Personalmente, tengo tendencia a usar claves SSH para fines de autenticación (si está permitido, por supuesto).

Brett Levene
fuente
Bueno, esto dejaría mi contraseña dentro de ~ / .netrc. Yo tampoco quiero eso.
Nathan
2

Después de revisar docenas de publicaciones SO, blogs, etc., probé todos los métodos, y esto es lo que se me ocurrió. Cubre TODO.

Vea la hoja de referencia de credenciales y paquetes privados de Git

Estas son todas las formas y herramientas mediante las cuales puede autenticar de forma segura git para clonar un repositorio sin una solicitud de contraseña interactiva .

  • SSH Public Keys
    • SSH_ASKPASS
  • Tokens de acceso API
    • GIT_ASKPASS
    • .gitconfig en su lugar
    • .gitconfig [credencial]
    • .git-credentials
    • .netrc
  • Bonificación: funciona con paquetes privados
    • nodo / npm package.json
    • python / pip / eggs require.txt
    • gemas de rubí Gemfile
    • golang go.mod

Las mejores opciones para almacenamiento sin texto sin formato

De lo que se pregunta aquí, ya sea SSH Keys, GIT_ASKPASSo git credential storeusar el OS Keychain Manager podría ser la mejor opción.

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

GIT_ASKPASS

Cómo crear un GIT_ASKPASSscript:

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

Cómo usarlo:

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 Git ENV 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 la hoja de trucos .

CoolAJ86
fuente