Por que o git não consegue se lembrar da minha senha no Windows

144

Acabei de começar a usar o git e não consigo lembrar a minha senha. Estou usando o cmd.exe elevado e meu host do git é o github, e criei uma chave ssh como essa no github

mas eu ainda entendo

*\subnus.mvc>git push origin master
Enter passphrase for key '/c/Users/Subnus/.ssh/id_rsa':
Nesizer
fonte
Eu mesmo não usei o msysgit, mas o agente de autenticação de concurso pode ser útil.
Cebjyre
1
Eu tentei de tudo e depois encontrei isso que funcionou.
Blake Niemyjski 28/08/2012
1
O Windows 10 vem com o OpenSSH há algum tempo. Habilite o serviço ssh-agent, use ssh-add para adicionar sua chave ao armazenamento ssh e defina GIT_SSHem seu ambiente (se necessário) e o git / ssh lembrará sua senha através do ssh-agent. Veja minha resposta abaixo para obter instruções mais detalhadas.
D3r3kk 9/11/19
1
2019, basta instalar o git no windows 10 e o git solicita a senha uma vez e se lembra dela.
Jean-François Fabre
@ Jean-FrançoisFabre Talvez você não esteja usando o OpenSSL.
RoadRunner

Respostas:

206

Percebo que essa pergunta está chegando aos dois anos de idade, mas eu tive o mesmo problema e várias respostas aqui não responderam completamente a pergunta para mim. Aqui estão duas soluções passo a passo, dependendo se você usa o TortoiseGit além do msysgit ou não.

Primeira solução Supõe Windows, msysgit e PuTTY.

  1. Instale o msysgit e o PuTTY conforme as instruções.
  2. (Opcional) Adicione PuTTY ao seu caminho. (Se você não fizer isso, todas as referências aos comandos PuTTY abaixo deverão ser prefixadas com o caminho completo para o executável apropriado.)
  3. Se você ainda não o fez, gere um hash de chave conforme as instruções no GitHub ou conforme as instruções do seu host Git.
  4. Novamente, se você ainda não o fez, converta sua chave para uso com o pageant.exe do PuTTY usando puttygen.exe . As instruções estão na documentação do PuTTY, neste guia útil e em vários outros locais do ciberespaço.
  5. Execute o pageant.exe do PuTTY , abra o arquivo .ppk ("Adicionar chave") e forneça sua senha para sua chave.
  6. Acesse a caixa de diálogo de variáveis ​​de ambiente do Windows (clique com o botão direito do mouse em "Computador", clique em "Propriedades", clique em "Configurações avançadas do sistema" ou na guia "Avançado", clique em "Variáveis ​​de ambiente"). Adicione a seguinte variável de ambiente:

    GIT_SSH = C: \ caminho completo \ para \ plink.exe

    Substitua "C: \ full \ path \ to" pelo caminho de instalação completo para PuTTY, onde o plink.exe é encontrado. Provavelmente é melhor adicioná-lo à seção "Variáveis ​​do usuário". Além disso, verifique se o caminho usado para plink.exe corresponde ao caminho usado para o Pageant (pageant.exe). Em alguns casos, você pode ter várias instalações do PuTTY porque ele pode ser instalado junto com outros aplicativos. O uso do plink.exe de uma instalação e o pageant.exe de outra provavelmente causarão problemas.

  7. Abra um prompt de comando.

  8. Se você está tentando se conectar a um repositório git hospedado no Github.com, execute o seguinte comando:

    plink.exe [email protected]

    Se o repositório git ao qual você está tentando se conectar estiver hospedado em outro lugar, substitua [email protected] por um nome de usuário e URL apropriados. (Assumindo o Github) Você deve ser informado de que a chave do host do servidor não está armazenada em cache e perguntada se você confia nela. Responda com um y . Isso adicionará a chave de host do servidor à lista de hosts conhecidos do PuTTY. Sem esta etapa, os comandos git não funcionarão corretamente. Depois de pressionar Enter, o Github informa que o Github não fornece acesso ao shell. Tudo bem ... não precisamos disso. (Se você estiver se conectando a outro host, e isso lhe der acesso ao shell, provavelmente é melhor encerrar o link sem fazer mais nada.)

  9. Tudo feito! Os comandos Git agora devem funcionar na linha de comando. Convém que o pageant.exe carregue o arquivo .ppk automaticamente no momento da inicialização , dependendo da frequência com que você precisará dele.

Segunda solução Supõe Windows, msysgit e TortoiseGit.

O TortoiseGit vem com executáveis ​​PuTTY e uma versão especialmente modificada do plink (chamada TortoisePlink.exe) que facilitará as coisas.

  1. Instale o msysgit e o TortoiseGit conforme as instruções.
  2. Se você ainda não o fez, gere um hash de chave conforme as instruções no GitHub ou conforme as instruções do seu host Git.
  3. Novamente, se você ainda não o fez, converta sua chave para usar com o pageant.exe do TortoiseGit usando o puttygen.exe do TortoiseGit . As instruções estão na documentação do PuTTY, no guia útil vinculado à primeira solução e em vários outros locais no ciberespaço.
  4. Execute o pageant.exe do TortoiseGit , abra o arquivo .ppk ("Adicionar chave") e forneça sua senha para sua chave.
  5. Acesse a caixa de diálogo de variáveis ​​de ambiente do Windows (clique com o botão direito do mouse em "Computador", clique em "Propriedades", clique em "Configurações avançadas do sistema" ou na guia "Avançado", clique em "Variáveis ​​de ambiente"). Adicione a seguinte variável de ambiente:

    GIT_SSH = C: \ caminho completo \ to \ TortoisePlink.exe

    Substitua "C: \ full \ path \ to" pelo caminho completo de instalação do TortoiseGit, onde o TortoisePlink.exe está localizado. Provavelmente é melhor adicioná-lo à seção "Variáveis ​​do usuário". Além disso, verifique se o caminho usado para o TortoisePlink.exe corresponde ao caminho usado para o Pageant (pageant.exe). Em alguns casos, você pode ter várias instalações do PuTTY porque ele pode ser instalado junto com outros aplicativos. O uso do TortoisePlink.exe da instalação do TortoiseGit e do pageant.exe de outra instalação de um aplicativo diferente (ou de uma instalação independente do PuTTY) provavelmente causará problemas.

  6. Tudo feito! Os comandos Git agora devem funcionar na linha de comando. Na primeira vez que você tentar se conectar ao seu repositório git, provavelmente será informado que a chave do host do servidor não está armazenada em cache e perguntará se você confia no servidor. Clique em "Sim". (Este é o TortoisePlink.exe em ação.)

    Convém que o pageant.exe carregue o arquivo .ppk automaticamente no momento da inicialização , dependendo da frequência com que você precisará dele.

Terceira solução Assume janela, msysgit e prompt de comando nativo.

  1. Instale o msysgit
  2. Certifique-se de permitir que o git seja usado no prompt de comando do MS-DOS
  3. Corre start-ssh-agent
  4. Digite as senhas SSH
  5. Tudo feito! Os comandos Git agora devem funcionar no prompt de comando nativo.
Matt Clarkson
fonte
3
Se você possui GitExtensions e TortoiseGit, cada um com sua própria versão de massa, defina a variável de ambiente GIT_SSH como o caminho do plink para o concurso que você está realmente usando.
21411 shovavnik
15
Caso alguém encontre esse erro estúpido: verifique se você está usando o formato de URL remoto SSH (git @ host: accountname / reponame.git) e não o URL HTTPS, caso contrário, continuará pedindo a senha ...
dain
Quando executo plink.exe [email protected], recebo "FATAL ERROR: Server inesperadamente fechou a conexão de rede"
Brett
4
Nota: o método três foi introduzido no msysgit para que você possa digitar apenas start-ssh-agentna linha de comando para que ele salve sua senha SSH.
Matt Clarkson
6
A terceira solução funciona apenas até o prompt de comando ser fechado e somente para esse prompt de comando - todos os outros CMDs ainda solicitam uma senha. Além disso, todos os outros clientes (código VS, VS) falham na comunicação com o git remoto.
Dima
21

Toda vez que configuro uma nova área de trabalho, esqueço essas instruções, por isso estou adicionando outra resposta aqui, pois tropeço nela com a mesma frequência!


Etapas rápidas para usuários impacientes como eu

  1. Ative o OpenSSH Authentication Agentserviço e faça com que ele inicie automaticamente.
  2. Adicione sua chave SSH ao agente ssh-addna linha de comando.
  3. Teste a integração do git, se ainda solicitar sua senha, continue.
  4. Adicione a variável de ambiente $ENV:GIT_SSH=C:\Windows\System32\OpenSSH\ssh.exeà sua sessão ou permanentemente ao seu ambiente de usuário.

Etapas detalhadas: visão geral

O Windows já vem com o OpenSSH há algum tempo. Ele inclui todos os bits necessários para o ssh funcionar junto com o Git, mas ainda parece precisar de algum TLC antes de funcionar 100% sem problemas. Aqui estão as etapas que eu tenho seguido com êxito a partir da versão 10.0.18362.449 do Windows (você pode ver sua versão do Windows 10 abrindo um shell cmd.exe e digitando ver).

Presumo aqui que você já tenha sua chave SSH configurada e esteja localizado em ~/.ssh/id_rsa

Ative o serviço ssh-agent na sua caixa do Windows 10.

  1. Iniciar-> Digite 'Serviços' e clique no Aplicativo de Serviços que aparece.
  2. Encontre o OpenSSH Authentication Agentserviço na lista.
  3. Clique com o botão direito do mouse no OpenSSH Authentication Agentserviço e escolha 'Propriedades'.
  4. Mude Startup type:para Automatic.
  5. Clique no Startbotão para alterar o status do serviço Running.
  6. Ignore a caixa de diálogo clicando OKe feche o aplicativo Serviços.

Adicione sua chave ao ssh-agent

  1. Abra seu shell de preferência (usarei o Windows Powershell neste exemplo, também se aplica ao Powershell Core) .
  2. Adicione sua chave SSH ao ssh-agent: ssh-add (você pode adicionar o caminho à sua chave como o primeiro argumento, se for diferente do padrão) .
  3. Digite sua senha se / quando solicitado.

Experimente o Git + SSH

  1. Abra seu shell (novamente, estou usando o Powershell) e clone um repositório.git clone [email protected]:octocat/Spoon-Knife
  2. Se você vir esse prompt, continue na próxima seção:
Enter passphrase for key '/c/Users/your_user_name/.ssh/id_rsa':

Defina sua GIT_SSHvariável de ambiente

Em qualquer sessão, você pode simplesmente definir essa variável de ambiente e o prompt da sua senha passará a aparecer e o ssh usará isso ssh-agentem seu nome. Como alternativa, você pode definir sua frase secreta no ambiente do usuário permanentemente.

Para definir apenas GIT_SSHno shell atual:

  1. Abra seu shell de preferência. (PowerShell para mim)
  2. Defina a variável de ambiente GIT_SSH como apropriada ssh.exe:$Env:GIT_SSH=$((Get-Command -Name ssh).Source)
  3. Repita as etapas em Experimente o Git + SSH acima.

Para definir GIT_SSHpermanentemente

  1. Abra o Explorador de Arquivos. Inicie-> digite 'File Explorer' e clique nele na lista.
  2. Clique com o botão direito do mouse em 'Este PC' e clique em 'Propriedades'.
  3. Clique em 'Configurações avançadas do sistema'.
  4. Clique no botão 'Variáveis ​​de ambiente ...'.
  5. Em 'Variáveis ​​de usuário para o seu nome_de_usuário', clique em Novo ...
  6. Defina o Variable name:campo como GIT_SSH
  7. Defina o Variable value:campo como path-to-ssh.exe (normalmente C:\Windows\System32\OpenSSH\ssh.exe).
  8. Clique em OK para fechar a caixa de diálogo Nova variável de usuário.
  9. Clique em OK para fechar a caixa de diálogo Variáveis ​​de ambiente.
  10. Repita as etapas em Experimente o Git + SSH acima.

Observe que isso provavelmente vai mudar com novas etapas / procedimentos à medida que o Windows 10 avança e à medida que eu aprendo mais. Vou tentar manter isso atualizado, estou ansioso para receber comentários nos comentários.

d3r3kk
fonte
3
Essa é a resposta mais completa em 31/1/2020, pelo menos para o Windows. Não é necessário instalar o PUTTY nem nada.
Jake
Acordado. Parece que o suporte interno finalmente chegou.
Eron Lloyd
Lenda! Isso resolveu meu problema. Procuro uma solução há um tempo, tentando coisas diferentes e isso é, sem dúvida, o mais completo problema para esse problema
Collin
Obrigado por uma boa resposta e que provavelmente me salvou algumas horas de brincadeira. +1
Irritado
20

Para quem precisar de instruções mais detalhadas, consulte esta página: http://help.github.com/working-with-key-passphrases/

Franz
fonte
Exatamente o que eu precisava para usar o msysgitshell.
Arthurakay #
1
Funcionou para mim ao usar o aplicativo Git Bash Desktop. Eu usei notepad ~/.profilee cópia colado o conteúdo desse link, reiniciado o Git Bash, entrou na minha senha, lucrou ...
Daryn
Eu segui a seção "Iniciando automaticamente o ssh-agent no Git for Windows" (usando o git 2.x no Win 10), mas ele ainda me pedia senha o tempo todo. Após a primeira solução (massa) da resposta aceita, isso foi corrigido para mim.
jakub.g
20

Caso esteja usando o Git bash no Windows, você pode executar o seguinte:

eval `ssh-agent -s`
ssh-add ~/.ssh/*_rsa

ele solicitará a frase secreta no segundo comando, e é isso. Cada ação adicional que você precisará executar (que exigia uma frase secreta) não solicitará a frase secreta (veja um exemplo na captura de tela abaixo):

adicionando frase secreta no Git bash no Windows

Guy Avraham
fonte
2
Isso também funciona no subsistema Ubuntu no Windows 10.
meetar
1
Observe que se o seu par de chaves estiver localizado em outro lugar, você poderá substituir ~ / .ssh / * _ rsa pelo caminho do arquivo * .pem
alex_danielssen
13

Uma solução extra 5 anos, 8 meses e 6 dias após a postagem da pergunta não seria uma má idéia, então aqui vai.

NOTA: Supõe que você esteja usando um computador Windows.

  1. Faça o download do git-credential-winstore .
  2. Executá-lo! Se você tiver GIT em sua PATHvariável de ambiente, ele deverá funcionar. Se não, corra git-credential-winstore -i C:\Path\To\Git.exe.

Na próxima vez que você tentar se comprometer com um repositório, você será solicitado a inserir suas credenciais. Deve ser isso. Você não precisará mais de suas credenciais até alterar sua senha.


Apenas para seu conhecimento ... Suas credenciais são armazenadas no Windows Credential Store

Onde você está armazenando minhas credenciais?

Este aplicativo apenas usa o Windows Credential Store existente para manter suas credenciais. Você pode ver as credenciais armazenadas em Painel de controle> Contas de usuário> Gerenciador de credenciais e escolhendo "Credenciais do Windows". As entradas que começam com "git:" são de git-credential-winstore.

Alex Essilfie
fonte
8
Esta solução parece não funcionar com repositórios SSH, apenas HTTPS. / angryface
JasonCoder
8

Se você definir uma senha para o seu arquivo de chave, sempre precisará digitar essa senha ao se conectar. Se você criar uma chave sem senha, não precisará digitá-la toda vez; no entanto, qualquer pessoa com acesso ao seu arquivo de chave poderá se conectar à sua conta do github.

O ssh-agent também pode funcionar. Tente executar isso e veja se ele se lembrará da sua senha.

Grant Limberg
fonte
a execução ssh-keygen -pdeve permitir que o OP não defina a senha
luchosrock 15/04
Ainda solicitando senha.
versedi
7

[editar - interpretou mal a pergunta, esta é uma resposta para um problema relacionado. deixando a versão reformulada para a posteridade]

Meu caso foi que eu estava tentando enviar para um repositório que estava hospedado em um de nossos servidores. Sempre que eu tentava fazer um push, o git solicitava minha senha (nb - senha, não a senha da minha chave privada).

Ao adicionar minha chave pública às chaves autorizadas no servidor, eu consegui obter notificações sem senha para esse servidor. E, como não havia senha na minha chave privada (o que é uma prática recomendada!), Eu não precisava digitar nada.

Aqui está o comando para adicionar sua chave pública a um servidor. Ele assume que o usuário gité o usuário no servidor.

cat .ssh/id_rsa.pub | ssh git@GIT_MASTER_IP 'cat >> .ssh/authorized_keys'

Você pode conseguir o mesmo fazendo logon no servidor e anexando manualmente sua chave pública ao arquivo em ~/.ssh/authorized_keys

hwjp
fonte
Você poderia converter isso em uma descrição utilizável por alguém que não tem acesso a um shell? Por exemplo, o que devemos colocar em autorizado_keys usando o bloco de notas ou similar?
John Little
4

Percebo que isso está atrasado há vários anos, mas me deparei com essa pergunta, tentando encontrar uma solução para ela, e encontrei algo que se adapta a todos os níveis de conhecimento, então pensei em compartilhar.

O GitHub fornece um instalador muito útil que facilita e facilita tudo: https://help.github.com/articles/caching-your-github-password-in-git/

roobeedeedada
fonte
Observe que isso está armazenando em cache sua senha do GitHub , não uma senha de chave da GPG.
precisa saber é o seguinte
4

Vamos supor que você gostaria de usar uma solução apenas para Git Bash pura sem usar TortoiseGit ou PuTTY. Além disso, você não deseja armazenar suas frases-senha permanentemente, pois é quase o mesmo como se você tivesse gerado sua chave SSH sem uma frase-senha em primeiro lugar. Mas você ainda deseja usar algum cache.

Para fins de armazenamento em cache, ssh-agenté usado o processo, incluído na distribuição do Git Bash. Como esse processo não é iniciado por padrão, ele precisa ser iniciado primeiro. Para que quaisquer chaves SSH sejam armazenadas em cache, elas devem ser adicionadas a esse processo com o ssh-addcomando que solicitará a senha da chave e a armazenará na memória.

Desvantagens de outras soluções:

  • A inicialização automática, ssh-agentcomo no artigo do GitHub, pede uma senha desde o início quando você inicia o Git Bash, independentemente de você precisar usar sua chave SSH nesta sessão ou não. Se você estiver trabalhando com seu repo local hoje, provavelmente fornecerá uma senha apenas quando realmente necessário (por exemplo, ao interagir com um repo remoto).
  • Se você inicia o seu ssh-agentlike no artigo do GitLab,eval $(ssh-agent -s) provavelmente está cansado de digitar isso toda vez. Provavelmente, você adicionou essas duas linhas à sua .bashrcconfiguração para iniciar automaticamente. As desvantagens são as mesmas acima e mais uma: cada vez que você inicia um novo terminal Git Bash, recebe um processo extra do ssh-agent (o script bash do GitHub verifica se esse processo já foi iniciado).
  • Como os dois acima, mas especialmente quando você tem chaves SSH separadas para hosts diferentes, por exemplo, uma para o GitHub e outra para o GitLab, fornecê-las de uma só vez é irritante e inconveniente.

Portanto, esta solução é para quem quer saber como fazer o Git Bash solicitar uma senha apenas uma vez por sessão do Windows e somente quando realmente necessário. Assemelha-se ao comportamento do gerenciamento de senhas com o GnuPG confirma a assinatura automática usando default-cache-ttl.

Configurando o SSH para solicitar senhas uma vez, quando necessário, usando apenas o Git Bash

  1. Primeiro, queremos iniciar automaticamente o arquivo ssh-agentao iniciar um shell do Git Bash. Usaremos um script modificado do GitHub para isso, pois ele verifica se o processo já foi iniciado, mas não queremos que ele use as ssh-addchaves imediatamente. Este script vai para o seu ~/.bashrcou ~/.profileou ~/.bash_profile( ~é como o diretório inicial do usuário C:\Users\Username- execute cd ~e, pwdem seguida, para o Git Bash imprimi-lo):

    ### Start ssh-agent
    
    env=~/.ssh/agent.env
    
    agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
    
    agent_start () {
        (umask 077; ssh-agent >| "$env")  # use -t here for timeout
        . "$env" >| /dev/null ; }
    
    agent_load_env
    
    # agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
    agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
    
    if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
        agent_start
    fi
    
    unset env
  2. Agora edite ou crie um ~/.ssh/configarquivo e adicione uma AddKeysToAgentopção para cada sub-rotina do host em que você deseja ativar o cache (você também pode ativá-lo globalmente, colocando a diretiva no início do arquivo antes de todas as declarações do host):

    # GitHub.com
    Host github.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_github
      AddKeysToAgent yes
    
    # GitLab.com
    Host gitlab.com
      Preferredauthentications publickey
      IdentityFile ~/.ssh/id_ed25519_gitlab
      AddKeysToAgent yes

    Na página de manual ssh config : Se esta opção estiver configurada como yes e uma chave for carregada de um arquivo, a chave e sua senha serão adicionadas ao agente com a vida útil padrão, como se fosse ssh-add (1).

A vida útil máxima padrão é para sempre ou até que o ssh-agentprocesso seja interrompido (manualmente no gerenciador de tarefas ou quando o PC for desligado). Se você deseja usar um tempo limite finito, pode configurá-lo com o -tparâmetro ssh-agent . Altere a linha no script bash da primeira etapa acima, por exemplo, por 30 minutos de duração do cache de chaves:

(umask 077; ssh-agent -t 30m >| "$env")

Veja aqui para outros qualificadores de formato de hora.

Nikolay Kotlyarov
fonte
3

Você pode criar um .bashrcarquivo no diretório inicial do seu usuário C:/Users/yourusere colocar lá:

env=~/.ssh/agent.env

agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }

agent_start () {
    (umask 077; ssh-agent >| "$env")
    . "$env" >| /dev/null ; }

agent_load_env

# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)

if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
    agent_start
    ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
    ssh-add
fi

unset env

Este script é executado sempre que o bash é executado. Então, você precisará digitar a senha apenas uma vez, quando git-bashfor iniciado!

Algumas versões do bash requerem .bash_profilearquivo .bashrc, portanto, apenas no caso de clone .bashrc:

copy .bashrc .bash_profile
Alexander Goncharov
fonte
1

pode tentar adicionar -k arg quando o fizer;

ssh-add -k ~/.ssh/id_rsa
tarikakyol
fonte