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-add
comando que solicitará a senha da chave e a armazenará na memória.
Desvantagens de outras soluções:
- A inicialização automática,
ssh-agent
como 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-agent
like no artigo do GitLab,eval $(ssh-agent -s)
provavelmente está cansado de digitar isso toda vez. Provavelmente, você adicionou essas duas linhas à sua .bashrc
configuraçã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
Primeiro, queremos iniciar automaticamente o arquivo ssh-agent
ao 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-add
chaves imediatamente. Este script vai para o seu ~/.bashrc
ou ~/.profile
ou ~/.bash_profile
( ~
é como o diretório inicial do usuário C:\Users\Username
- execute cd ~
e, pwd
em 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
Agora edite ou crie um ~/.ssh/config
arquivo e adicione uma AddKeysToAgent
opçã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-agent
processo 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 -t
parâ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.