Como evitar que uma chave ssh usada para executar ações git seja descriptografada apenas uma vez também quando novos terminais forem abertos posteriormente no Windows?

Como evitar que uma chave ssh usada para executar ações git seja descriptografada apenas uma vez também quando novos terminais forem abertos posteriormente no Windows?

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 -aassim 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:

  1. A chave Ssh deve ser descriptografada uma vez quando o sistema Windows for inicializado e um terminal for aberto para executar ações git
  2. 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.
  3. 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 .bashrcscript 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):
    • correreval $(ssh-agent)
    • crie um novo arquivo de variável de ambiente do agente SSH
  • 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.

informação relacionada