Como dar nome de usuário / senha ao clone do git em um script, mas não armazenar credenciais no .git / config

31

Estou clonando um repositório git em um script como este:

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

Isso funciona, mas meu nome de usuário e minha senha! agora são armazenados no URL de origem .git/config.

Como posso evitar isso, mas ainda faço isso em um script (para que não haja entrada manual de senha)?

Nathan
fonte
Você provavelmente poderia atualizar a origem mais tarde:git remote set-url origin https://host.com/name/.git
ceejayoz
@ceejayoz Sim, isso é possível. Obrigado pela idéia. Ainda estou esperando uma solução, que nem armazene temporariamente as credenciais.
Nathan
4
Claro - use autenticação baseada em SSH com uma chave.
ceejayoz
2
Existe um motivo para você usar https em vez de SSH? SSH suporta chaves.
mzhaase
11
@MartijnCourteaux A senha é realmente fornecida ao script através de uma variável de ambiente. Então, eu realmente fazer: git clone usuário: $ password @ ...
Nathan

Respostas:

20

O método que eu uso é realmente usar um em git pullvez de um clone. O script ficaria assim:

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

Isso não armazenará seu nome de usuário ou senha .git/config. No entanto, a menos que outras etapas sejam tomadas, o nome de usuário e a senha em texto sem formatação serão visíveis enquanto o processo estiver sendo executado a partir de comandos que mostram os processos atuais (por exemplo ps).

Outra sugestão que eu faria (se você não pode usar o ssh) é realmente usar um token OAuth em vez de nome de usuário / senha em texto sem formatação, pois é um pouco mais seguro. Você pode gerar um token OAuth a partir das configurações do seu perfil: https://github.com/settings/tokens .

Então, usando esse token, o comando pull seria

git pull https://$OAUTH_TOKEN:[email protected]/name/repo.git master
FGreg
fonte
Infelizmente, não posso usar tokens de autenticação. Não estou usando o github, mas um servidor privado.
Nathan
3
Também deve-se notar que o nome de usuário e a senha estarão visíveis, por exemplo, psenquanto o pull for executado (pelo menos, a menos que você impeça os usuários de ver os processos uns dos outros)
derobert
Pontos para uso de juramento. É exatamente o que eu precisava em produção / teste / dev.
RobotHumans
um milhão graças ao seu amigo. horas perdidas n horas n finalmente, sua resposta veio a ser exibida. : thumbsup
JasdeepSingh
17

Na IMO, a melhor solução é usar um GIT_ASKPASSauxiliar personalizado e entregar a senha como outra variável de ambiente. Por exemplo, crie um arquivo git-askpass-helper.shcomo:

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

e, em seguida, execute git clone https://username@hostname/repocom variáveis ​​de ambiente GIT_ASKPASS=/path/to/git-askpass-helper.she GIT_PASSWORD=nuclearlaunchcodes.

Isso tem a vantagem de que a senha também não estará visível na lista de processos.

intgr
fonte
+1 para solução criativa. Isso seria um pouco mais seguro que a git pullsolução e permitirá que você armazene a senha de texto sem formatação como um segredo na sua ferramenta de implantação automatizada de sua escolha.
FGreg
13

Você pode inserir seus creds de conexão no seu ~/.netrcarquivo. Algo ao longo das linhas de:

machine host.example.net
login bart
password eatmyshorts

Apenas certifique-se de chmod esse arquivo para 600. Se você estiver usando o Windows, o seguinte link pode ser útil: https://stackoverflow.com/questions/6031214/git-how-to-use-netrc-file-on- windows-to-save-user-and-password

Pessoalmente, tenho a tendência de usar chaves SSH para fins de autenticação (se for permitido, é claro).

Brett Levene
fonte
Bem, isso deixaria minha senha dentro de ~ / .netrc. Eu também não quero isso.
Nathan
2

Depois de revisar dezenas de posts, blogs, etc., experimentei todos os métodos, e foi isso que eu criei. Abrange tudo.

Consulte a Cheatsheet de credenciais e pacotes particulares do Git

Essas são todas as formas e ferramentas pelas quais você pode autenticar com segurança o git para clonar um repositório sem um prompt de senha interativo .

  • Chaves públicas SSH
    • SSH_ASKPASS
  • Tokens de acesso à API
    • GIT_ASKPASS
    • .gitconfig
    • .gitconfig [credencial]
    • .git-credentials
    • .netrc
  • Bônus: Funciona com pacotes particulares
    • nó / npm package.json
    • python / pip / eggs requirements.txt
    • gemas de rubi Gemfile
    • golang go.mod

Melhores opções para nenhum armazenamento de texto sem formatação

Do que é solicitado aqui, SSH Keys, GIT_ASKPASSou git credential storeusar o gerenciador de chaves do SO pode ser a melhor opção.

Como GIT_ASKPASS é provavelmente o menos compreendido dos 3, detalharei isso aqui - e os outros estão na folha de dicas.

GIT_ASKPASS

Como criar um GIT_ASKPASSscript:

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

Como usá-lo:

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

O script recebe stdin na forma de:

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

O script recebe ENVs do Git, como:

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

Mais detalhes na folha de dicas .

CoolAJ86
fonte