Zsh possui um preexec
hook que executa uma função antes que um comando digitado na linha de comando seja executado. Aqui está um gancho que procura por ssh
em sua linha de comando e, se encontrado, verifica a existência de um agente ssh. Se isso não for encontrado, ele executa o keychain.
Desta forma, o keychain é executado apenas antes dos comandos ssh, e somente se necessário.
Coloque isso no seu ~/.zshrc
:
function check_ssh {
[[ $3 =~ '\bssh\b' ]] || return
[[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
&& ssh-add -l >/dev/null && return
eval 'keychain --eval id_dsa --timeout 60'
}
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh
O que acontece aqui é sempre que um comando é digitado, check_ssh
é chamado antes do comando ser executado.
A primeira linha da função verifica o comando expandido para ssh
usando um regex Zsh. ssh
deve ter limites de palavras \b
em ambos os lados. Se isso não for encontrado, a função retornará.
A próxima linha verifica se há um processo do agente SSH na variável de ambiente, e se esse processo existe na tabela de processos ainda e, em seguida, que pelo menos uma chave foi adicionada ao agente. Se tudo isso estiver correto, então o agente ssh está configurado e não precisamos fazer nada, então ele retorna.
Finalmente, começamos o chaveiro, com o agente a ser mantido vivo por uma hora.
Ele ainda deixa o problema sobre o material ssh incorporado, como git
ou rsync
ou scp
, pois isso não acionará a função (você pode adicioná-los à regex).