(Li muitas das perguntas neste site que parecem relacionadas e acredito que essa é uma pergunta genuinamente nova.)
Eu tenho muitas chaves em muitos servidores e todas elas estão protegidas com senhas.
Gosto de digitar senhas tanto quanto gosto de digitar senhas - é uma perda real de produtividade.
Os comandos ssh-agent + ssh-add podem ser usados em um shell de login para significar que você só precisa digitar sua senha uma vez no login
as chaves podem ser usadas para manter um agente ssh ativo após o logout, por exemplo, você pode tê-lo para inserir a senha apenas uma vez na inicialização ou pode mantê-lo vivo por mais ou menos uma hora.
O problema que tenho é que essas duas soluções geralmente são iniciadas em um logon do shell (por exemplo .zshrc
) dependem de que eu digite minha senha quando eu efetuar login, mesmo que não precise desbloqueá-la. (Não estou feliz com as chaves mantendo um agente vivo por tempo indeterminado.)
O que eu gostaria é que uma senha seja solicitada (para um agente) somente quando necessário .
Para que eu possa entrar no servidor A, fazer algumas coisas, então ssh no servidor B e , nesse momento, ser solicitada a senha. Faça algumas coisas no servidor B, efetue logout. De volta a A, faça mais algumas coisas, ssh para B novamente e não preciso da minha senha (ela é mantida por um agente).
Percebo que isso é possível em áreas de trabalho gráficas como o Gnome - você recebe um pop-up solicitando a senha para desbloquear sua chave privada assim que você tenta ssh. Então é isso que eu estou procurando, mas em um console.
Respostas:
Não adicione nada a nenhum dos seus scripts de inicialização do shell, isso é uma invasão desnecessária.
Em vez disso, adicione
para o seu .ssh / config
Assim, o ssh-add é executado automaticamente na primeira vez que você ssh em outra caixa. Você só precisa digitar novamente sua chave quando ela expirar do ssh-agent ou após a reinicialização.
fonte
O Zsh possui um
preexec
gancho que executa uma função antes que um comando digitado na linha de comando seja executado. Aqui está um gancho que procurassh
na sua linha de comando e, se encontrado, verifica a existência de um agente ssh. Se isso não for encontrado, ele executa o chaveiro.Dessa forma, o chaveiro é executado apenas antes dos comandos ssh e, somente se necessário.
Coloque isso no seu
~/.zshrc
:O que acontece aqui é que sempre que um comando é digitado,
check_ssh
é chamado antes que o comando seja executado.A primeira linha da função verifica o comando expandido para
ssh
usar um regex Zsh.ssh
deve ter limites de palavras em\b
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 ainda existe na tabela de processos e se pelo menos uma chave foi adicionada ao agente. Se tudo estiver correto, o agente ssh está configurado e não precisamos fazer nada; portanto, ele retorna.
Finalmente começamos o chaveiro, com o agente sendo mantido vivo por uma hora.
Ainda deixa o problema sobre coisas ssh incorporadas, como
git
oursync
ouscp
como que não vai acionar a função (você pode adicioná-los à regex).fonte
zsh
, pode-se criar um script curto com o mesmo efeito e colocá-loPATH
diante dossh
cliente real . Pode até funcionar comrsync
et al, se eles lerem emPATH
vez de executar/usr/bin/ssh
diretamente.Para o zsh, escrevi um conjunto de utilitários e wrappers para fazer mais ou menos o que você deseja: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils
Na verdade, isso faz ainda mais, porque o
ssh-agent
será compartilhado por todas as sessões de login (desktop ou via SSH, e o GNU Screen também é suportado se você iniciar os shells de login a partir dele, por exemplo,shell -zsh
no~/.screenrc
arquivo), e só será fechado após o a última sessão termina.Nota: Eu uso apenas uma senha para todas as minhas chaves. Não tenho certeza do comportamento de diferentes senhas; pode haver algumas mudanças.
fonte