Configurando o Git sobre SSH para efetuar login uma vez


195

Eu clonei meu repositório git sobre ssh. Portanto, toda vez que eu me comunico com o mestre de origem pressionando ou puxando, preciso redigitar minha senha. Como posso configurar o git para não precisar digitar minha senha várias vezes?


7
Parece um problema de segurança, você não precisa usar senhas para realizar confirmações normais, mas um push é o tipo de coisa com a qual você deseja se autenticar novamente, mas talvez eu esteja antiquado.
Alex Sexton

Respostas:


104

Tente ssh-add, você precisa ssh-agentestar executando e mantendo sua chave privada

(Ok, respondendo à pergunta atualizada, você primeiro executa ssh-keygena geração de uma chave pública e privada, como Jefromi explicou . Você coloca a chave pública no servidor. Você deve usar uma senha, se não tiver o equivalente a uma planilha simples. senha de texto em sua chave privada. Mas, quando o fizer, você precisará, na prática, ssh-agentconforme explicado abaixo.)

Você deseja executar ssh-agentem segundo plano enquanto faz login. Depois de fazer login, a idéia é executar ssh-adduma e apenas uma vez, a fim de fornecer sua senha ao agente e decodificar sua chave. O agente fica na memória com a chave desbloqueada e carregada, pronta para ser usada sempre que você fizer uma busca em algum lugar.

Todos os comandos da família ssh 1 consultarão o agente e poderão usar automaticamente sua chave privada.

Nos sistemas OSX (err, macOS ), GNOME e KDE, ssh-agentgeralmente é iniciado automaticamente para você. Analisarei os detalhes caso, como eu, você também tenha um Cygwin ou outro ambiente Windows, onde isso certamente não seja feito para você.

Comece por aqui: man ssh-agent.

Existem várias maneiras de executar automaticamente o agente. Como a página de manual explica, você pode executá-lo para que ele seja o pai de todos os outros processos da sua sessão de login. Dessa forma, as variáveis ​​de ambiente que ele fornece estarão automaticamente em todos os seus shells. Quando você (mais tarde) chamar ssh-addou sshambos terão acesso ao agente porque todos eles têm as variáveis ​​de ambiente com nomes de caminhos de soquete mágicos ou o que for.

Como alternativa, você pode executar o agente como um filho comum, salvar as configurações do ambiente em um arquivo e originar esse arquivo em todos os shell quando for iniciado.

Meus sistemas OSX e Ubuntu executam automaticamente a instalação do agente, então tudo o que preciso fazer é executar ssh-adduma vez. Tente executar ssh-adde veja se funciona, se for o caso, basta fazer isso uma vez por reinicialização.

Meu sistema Cygwin precisava ser feito manualmente, então fiz isso no meu .profilee tenho .bashrcfonte .profile:

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

O .agentarquivo é criado automaticamente pelo script; Ele contém as definições e exportações de variáveis ​​de ambiente. O acima tenta originar o arquivo .agent e tenta ps(1)o agente. Se não funcionar, inicia um agente e cria um novo arquivo de agente. Você também pode simplesmente executar ssh-adde, se falhar, iniciar um agente.


1. E até local e remoto sudocom a extensão pam certa.


1
Ao invés de abastecimento a saída ssh-agenté provavelmente mais limpa ao uso:eval `ssh-agent`
scottsome

285

Tive um problema semelhante com o GitHub porque estava usando o protocolo HTTPS. Para verificar qual protocolo você está usando, basta executar

git config -l

e olhe para a linha que começa com remote.origin.url. Para mudar seu protocolo

git config remote.origin.url git@github.com:your_username/your_project.git

12
Eu acho que essa deve ser a resposta oficial, ^ 5 @Muein!
Fer Martin

14
isso não funciona quando o repo é privado e você não é o proprietário. Acabei de enfrentar um Permission deniederro.
ogzd

7
Isso é apenas para um repo, como posso fazer isso globalmente?
onmyway133

2
O @ogzd GitHub (ou qualquer outro serviço que você esteja usando) precisa da sua chave SSH pública antes que isso funcione, mas ainda é a solução correta.
MattM

uma alternativa égit remote set-url origin git@github.com:your_username/your_project.git
icosamuel

24

Trata-se de configurar o ssh, não o git. Se você ainda não o fez, use ssh-keygen(com uma senha em branco) para criar um par de chaves. Em seguida, copie a chave pública para o destino remoto com ssh-copy-id. A menos que você precise de várias chaves (por exemplo, uma mais segura com uma senha para outros fins) ou se você tem coisas muito estranhas de identidade múltipla, isso é simples:

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

Edit: Você realmente deve apenas ler a resposta do DigitalRoss, mas: se você usar chaves com frases secretas, precisará usá ssh-add <key-file>-las para adicioná-las ssh-agent(e obviamente iniciar uma ssh-agentse sua distribuição ainda não tiver uma em execução).


2
Não sei se isso responde à pergunta, ele já deve ter feito isso ou não conseguiria acessar o site. A resposta que ele precisa é:, ssh-agentpois ele deseja ignorar o problema de inserir a senha sempre. Não downvoting mas eu acho que você precisa para melhorar esta resposta, a menos que eu sou o único que mal entendido ...
DigitalRoss

2
@DigitalRoss: Ah, eu não tinha certeza de ler a pergunta se o OP realmente tinha as chaves configuradas. Você provavelmente está certo, e eu estava deliberadamente tentando sugerir não usar uma senha. No entanto, é claro que você está certo ssh-agent. +1 para você!
Cascabel

Estou confuso se preciso usar ssh-keygen ou ssh-add. No meu diretório ~ / .ssh /, só tenho dois arquivos: config e known_hosts. Parece que o ssh-add requer outro arquivo ~ / .ssh / id_rsa. Devo criar esse arquivo primeiro usando ssh-keygen como o @Jefromi explicou?
Reprogramador

Sim, você precisa criar a chave antes de copiá-la para o servidor remoto. Acho que talvez tenhamos ficado confusos com o uso da palavra "senha" - é o que ssh-*chama a senha necessária para usar a chave - onde você realmente quis dizer sua senha de usuário real no controle remoto?
Cascabel

Sim, eu deveria ter dito a senha em vez da senha.
Reprogramador

23

Certifique-se de que quando você clonou o repositório, fez isso com o URL SSH e não o HTTPS; na caixa URL do clone do repositório, escolha o protocolo SSH antes de copiar o URL. Veja a imagem abaixo:

insira a descrição da imagem aqui


23

Se você clonou usando HTTPS (recomendado), então: -

git config --global credential.helper cache

e depois

git config --global credential.helper 'cache --timeout=2592000'
  • timeout = 2592000 (30 dias em segundos) para ativar o cache por 30 dias (ou o que for necessário).

  • Agora execute um comando git simples que requer seu nome de usuário e senha.

  • Digite suas credenciais uma vez e agora o cache está ativado por 30 dias.

  • Tente novamente com qualquer comando git e agora você não precisa de credenciais.

  • Para obter mais informações: - Armazenando em cache sua senha do GitHub no Git

Nota : Você precisa do Git 1.7.10 ou mais recente para usar o auxiliar de credencial. Na reinicialização do sistema, talvez seja necessário inserir a senha novamente.


1
Você é um salvador, estava cansado de digitar a senha do nome de usuário toda vez. Obrigado :)
Dave Ranjan

especifique se é apenas para Linux ou Windows ou ambos.
joedotnot

@joedotnot para todos os sistemas operacionais. Você também pode navegar no link mencionado e lá encontrará a opção SO logo abaixo do cabeçalho.
Nishant Thapliyal

Este! Funciona em todos os casos.
precisa saber é o seguinte

@ Charles Oi, Acabei de testar o mesmo e está funcionando como esperado.
Nishant Thapliyal

8

Estendendo os pensamentos de Muein para aqueles que preferem editar arquivos diretamente sobre a execução de comandos no git-bash ou no terminal.

Vá para o diretório .git do seu projeto (raiz do projeto na sua máquina local) e abra o arquivo 'config'. Em seguida, procure por [origem "remota"] e defina a configuração da URL da seguinte maneira:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git

1
Isso realmente ajudou. Maneira segura e limpa de corrigir o problema. Acho que alguém deveria melhorar a resposta de Muein com essa.
Luis Ortega Araneda

1
"Vá para o diretório .git do seu projeto" tentando pela primeira vez
peculiar

Obtendo este erro "fatal: não ligo para o protocolo 'git@github.com: <username> / https'"
Shivam Bharadwaj

@ShivamBharadwaj uma pesquisa rápida revelou este tópico stackoverflow.com/questions/30474447/… . Existe a possibilidade de você estar copiando o comando git clone de algum site e enfrentando esse problema? Se sim, tente digitar o comando completo.
Uchamp

6

Eu acho que há duas coisas diferentes aqui. O primeiro é que a autenticação SSH normal exige que o usuário coloque a senha da conta (onde a senha da conta será autenticada com diferentes métodos, dependendo da configuração do sshd).

Você pode evitar colocar essa senha usando certificados. Com os certificados, você ainda precisa inserir uma senha, mas desta vez é a senha da sua chave privada (independente da senha da conta).

Para fazer isso, você pode seguir as instruções indicadas por steveth45:

Com autenticação de chave pública .

Se você quiser evitar colocar a senha do certificado todas as vezes, poderá usar o ssh-agent, como apontado pelo DigitalRoss

A maneira exata de fazer isso depende do Unix e do Windows, mas essencialmente você precisa executar o ssh-agent em segundo plano ao fazer login e, na primeira vez em que fizer login, execute o ssh-add para fornecer sua senha ao agente. Todos os comandos da família ssh consultarão o agente e escolherão automaticamente sua senha.

Comece aqui: man ssh-agent.

O único problema do ssh-agent é que, pelo menos no * nix, você deve colocar a senha dos certificados em cada novo shell. E o certificado é "carregado" e você pode usá-lo para se autenticar em um servidor ssh sem colocar nenhum tipo de senha. Mas isso é nesse shell em particular.

Com o chaveiro, você pode fazer o mesmo que o ssh-agent, mas "em todo o sistema". Depois de ligar o computador, você abre um shell e coloca a senha do certificado. E então, todos os outros shell usarão esse certificado "carregado" e sua senha nunca será solicitada novamente até que você reinicie o seu PC.

O Gnome tem um aplicativo semelhante, chamado Gnome Keyring, que solicita a senha do seu certificado na primeira vez em que você o utiliza e, em seguida, armazena-o com segurança para que você não seja solicitado novamente.


Eu mesmo uso o chaveiro : muito útil.
Jakub Narębski 20/10/09

existe mais uma maneira escrevendo AddKeysToAgent yesem .ssh / config. Em seguida, ele é carregado na memória até você desligar o computador
infoclogado em 23/08/19


4
ssh-keygen -t rsa

Quando for solicitada uma senha, deixe em branco, ou seja, pressione enter. tão simples como isso!!


4
Esteja ciente de que, se você fizer isso, qualquer pessoa que tenha acesso ao seu cliente de desenvolvimento terá acesso ao servidor de repositório sem precisar de uma senha. A combinação ssh-agent / ssh-add oferece segurança muito melhor.
Peter V. Mørch

3

Tente isso na caixa da qual você está empurrando

    ssh git@github.com

Você deve receber uma resposta bem-vinda do github e será bom empurrá-lo.


2
Ele está trabalhando para mim Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Mas de alguma forma ainda git me pedir a senha quando eu tentar empurrar
gkucmierz

2

Eu tive que clonar um repositório git de um servidor que não permitia o login vie ssh key, mas apenas com um usuário / senha. Não encontrei nenhuma maneira de configurar o plug-in Git para usar uma combinação simples de usuário / senha, então adicionei o seguinte comando shell como etapa de pré-construção em uma máquina de compilação linux que depende da ferramenta esperada (apt-get install expect):

ESTE NÃO É UM BOM MODO DE RESOLVER ESTE PROBLEMA, COMO SUA SENHA É APRESENTADA COMO TEXTO CLARO NA CONFIGURAÇÃO E NO LOGS DO TRABALHO DE JENKINS! USE-O SOMENTE SE NÃO EXISTE MANEIRA DE CONFIGURAR A AUTENTIFICAÇÃO RSA-KEY OU OUTRAS POSSIBILIDADES DE CONFIGURAÇÃO!

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

1

Adicione uma única linha AddKeysToAgent yesna parte superior do arquivo .ssh / config. É claro que o ssh-agent deve estar executando antecipadamente. Se não estiver em execução (verifique porprep ssh-agent ), basta executá-loeval $(ssh-agent)

Agora, a chave é carregada em todo o sistema na memória e você não precisa digitar a senha novamente.

A fonte da solução é /ubuntu/362280/enter-ssh-passphrase-once/853578#853578


0

Eu estou tentando evitar digitar a senha o tempo todo também porque estou usando o ssh no windows. O que fiz foi modificar meu arquivo .profile, para inserir minha senha em uma sessão específica. Portanto, este é o trecho 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

então com isso eu digito minha senha uma vez em uma sessão ..


-1

Tentei todas essas sugestões e muito mais, apenas para poder clonar minha instância da AWS. Nada funcionou. Finalmente saí do desespero: copiei o conteúdo do id_rsa.pub na minha máquina local e o anexei a ~ / .ssh / known_hosts na minha instância da AWS.


1
Tem certeza de que não quer dizer ~ / .ssh / allowed_keys?
Kevin_Kinsey
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.