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?

1

Linux

No meu sistema Linux, eu descriptografo uma chave ssh privada toda vez que inicializo o sistema. Uma vez iniciado, eu abro um terminal e emito:

ssh-add ~/.ssh/id_rsa_some_key

e estou pronto para executar operações do git, como git clone <git-url> , git pull -a e assim por diante. Quando eu abro outro terminal e emito tais comandos novamente, nenhum prompt irá aparecer pedindo para inserir a senha da chave ssh criptografada. Em resumo, no meu sistema linux eu só tenho que digitar a senha uma vez.

Windows

No meu trabalho eu tenho um sistema Windows. Uma vez iniciado, abro git-bash e edito:

eval $(ssh-agent)

e ssh-add ~/.ssh/private_key , insira a senha e emita os comandos git que podem se comunicar com o repositório git. Ao contrário do meu sistema Linux, quando eu abro um novo comando git-bash e issue git, aparece um prompt que pede para entrar a senha. Em resumo, quando a chave privada foi descriptografada em um terminal git-bash, então é 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

Eu 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 depois descobriu-se que não seria possível usar a URL ssh git que começa com git @. Ele teve que ser substituído pelo URL https, mas não é isso que eu quero.

Qual resposta eu prefiro

Eu prefiro uma resposta que satisfaça os seguintes critérios:

  1. A chave Ssh precisa ser descriptografada uma vez quando o sistema Windows foi inicializado e um terminal é 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 será exibido para solicitar a senha.
  3. Eu não estou dedicado a git-bash. Se houver outro terminal no Windows que corresponda aos dois primeiros critérios, então tudo bem por mim.
por 030 03.01.2018 / 22:37

1 resposta

1

O comando

eval $(ssh-agent)

inicia o processo do agente SSH (equivalente ao Pageant) e cria tipicamente duas variáveis de ambiente: SSH_AUTH_SOCK e SSH_AGENT_PID (pelo menos no Linux, não sei se o Windows git-bash faz alguma diferença aqui; provavelmente não).

Se a variável SSH_AUTH_SOCK estiver configurada e apontar para um soquete de agente de autenticação válido, qualquer processo que possa ler a variável poderá utilizá-la. Então você só precisa de uma maneira de ter o valor dessa variável propagada 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 as janelas subsequentes do git-bash possam lê-lo, você pode fazer o script desta maneira:

Sempre que um novo git-bash é iniciado (ou seja, com o script .bashrc ou seu equivalente git-bash)

  • verifique a existência do arquivo de variável de ambiente do agente SSH
  • se o arquivo existir:
    • leia
    • 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 presente ou suas informações estavam obsoletas):
    • executar eval $(ssh-agent)
    • crie um novo arquivo de variável de ambiente do agente SSH
  • pronto!

Além disso, talvez seja necessário inserir o URL do SSH git em 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 prefixo ssh:// é apenas um atalho que é mais conveniente para digitar na linha de comando.

    
por 03.01.2018 / 23:28