Linux
No meu sistema Linux, eu descriptografo uma chave ssh privada sempre que inicializo o sistema. Depois de inicializado, abro um terminal e emito:
ssh-add ~/.ssh/id_rsa_some_key
e estou pronto para realizar operações git, como git clone <git-url>
e git pull -a
assim por diante. Quando eu abro outro terminal e emito esses comandos novamente, nenhum prompt aparecerá solicitando a inserção da senha da chave ssh criptografada. Resumindo, no meu sistema Linux só preciso digitar a senha uma vez.
janelas
No meu trabalho tenho um sistema Windows. Depois de inicializado, eu abrogit-bashe emitir:
eval $(ssh-agent)
e ssh-add ~/.ssh/private_key
, insira a senha e emita comandos git que sejam capazes de se comunicar com o repositório git. Em contraste com meu sistema Linux, quando abro um novo git-bash e emito comandos git, aparece um prompt solicitando a inserção da senha. Em resumo, quando a chave privada foi descriptografada em um terminal git-bash, é possível interagir com o repositório git, mas quando um novo terminal é aberto, a chave ssh deve ser descriptografada novamente.
O que eu tentei
Tentei usar o concurso. Este primeiro problema é que o id_rsa não era adequado. Uma nova chave teve que ser criada usando puttygen, mas descobriu-se que não seria possível usar o url ssh git que começa com git@. Teve que ser substituído pelo URL https, mas não é isso que eu quero.
Que resposta eu prefiro
Prefiro uma resposta que satisfaça os seguintes critérios:
- A chave Ssh deve ser descriptografada uma vez quando o sistema Windows for inicializado e um terminal for aberto para executar ações git
- Quando um novo terminal é aberto, pode-se continuar a interagir com o repositório git, ou seja, nenhum prompt aparecerá solicitando a inserção da senha.
- Não sou dedicado ao git-bash. Se houver outro terminal no Windows que corresponda aos dois primeiros critérios, para mim tudo bem.
Responder1
O comando
eval $(ssh-agent)
inicia o processo do agente SSH (equivalente ao Pageant) e cria normalmente duas variáveis de ambiente: SSH_AUTH_SOCK e SSH_AGENT_PID (pelo menos no Linux, não sei se o git-bash do Windows faz alguma diferença aqui; provavelmente não).
Se a variável SSH_AUTH_SOCK estiver definida e apontar para um soquete de agente de autenticação válido, qualquer processo que possa ler a variável poderá usá-la. Então você só precisa de uma maneira de fazer com que o valor dessa variável seja propagado de uma sessão git-bash para outra. A variável SSH_AGENT_PID é apenas uma conveniência, para permitir que o agente seja facilmente eliminado se/quando necessário.
Se você puder armazenar essas variáveis de ambiente (ou mesmo apenas SSH_AUTH_SOCK) em um arquivo, para que suas janelas git-bash subsequentes possam lê-lo, você poderá fazer o script desta maneira:
Sempre que um novo git-bash é iniciado (ou seja, com o .bashrc
script ou seu equivalente no git-bash)
- verifique a existência do arquivo de variável de ambiente do agente SSH
- se o arquivo existir:
- Leia-o
- se o soquete do agente (e opcionalmente o processo) listado no arquivo ainda existir, use as variáveis como estão em sua sessão atual
- else (ou seja, se o arquivo não estava lá ou suas informações estavam obsoletas):
- correr
eval $(ssh-agent)
- crie um novo arquivo de variável de ambiente do agente SSH
- correr
- feito!
Além disso, pode ser necessário inserir o URL git do SSH no formato completo, ou seja, em vez de apenas [email protected]/project.git
, você deve digitá-lo assim:
ssh://[email protected]/project.git
Tecnicamente, o formulário sem o ssh://
prefixo é apenas uma abreviação que é mais conveniente para digitar na linha de comando.