Script para ssh Agent Management: Isso é adequado? Algum erro?

2

O seguinte é algo que eu uso para gerenciar minhas configurações de agente ssh.

#!/bin/echo "Must source this:" 
## Ensure that ~/.ssh/env contains valid values

unset SSH_AGENT_PID SSH_ENV_REFRESH

[ -r ~/.ssh/env ] && . ~/.ssh/env
[ -n "$SSH_AGENT_PID" ]  || {
    # No env file (or it's badly corrupted:
    eval $(ssh-agent &>/dev/null) &> /dev/null
    SSH_ENV_REFRESH=1
    }

# Ping the agent process:
kill -0 "$SSH_AGENT_PID" >& /dev/null || {
    # No process, so start a new one:
    eval $(ssh-agent &>/dev/null) &> /dev/null
    SSH_ENV_REFRESH=1
    }

ssh-add -l &> /dev/null
[ "$?" -gt 1 ] && {
    # Process alive but unable to be contacted
    # for some reason (wedged/defunct process,
    # or damaged/corrupt UNIX domain socket node?)

    # So kill it:
    kill "$SSH_AGENT_PID" >& /dev/null
    # ... with extreme prejudice if necessary:
    kill -0 "$SSH_AGENT_PID" >& /dev/null \
    || kill kill -9 "$SSH_AGENT_PID" >& /dev/null

    # ... and start a new one
    eval $(ssh-agent &>/dev/null) &> /dev/null
    SSH_ENV_REFRESH=1
    }

[ -z "$SSH_ENV_REFRESH" ] || {
    # Over-write old env file:
    printenv | grep "^SSH_A" > ~/.ssh/env
    # Append export command:
    echo "export SSH_AGENT_PID SSH_AUTH_SOCK" >> ~/.ssh/env

    # Load the (null-passphrase) identites into the agent:
    ssh-add  < /dev/null &> /dev/null
    }

Pretende ser originado ( . ~/lib/sshagent.sh ) de ~ / .bashrc ou outro login ou arquivos de inicialização do shell ... ou até mesmo tarefas do cron. Funciona para mim, mas espero que as pessoas aqui o analisem e ofereçam sugestões sobre qualquer caso de esquina que esteja faltando.

Eu costumava apenas executá-lo em ~ / .bash_login ... mas depois eu descobria que, em alguns casos, minhas conchas não pegaria as configurações (gerenciador de exibição X e eu acho que sessões ssh não-login remotas ... casos em que o ssh é chamado com um comando). Em outros casos, as configurações antigas persistiriam e não seriam atualizadas quando um processo do agente fosse reiniciado (por qualquer motivo). Então eu corro em ~ / .bashrc e tento evitar qualquer saída perdida ... como é recomendado para ~ / .bashrc em geral.

Então, há algum caso ou erro evidente? Isso faria sentido para algo como / etc / bashrc ? É razoavelmente portátil para outras conchas?

    
por Jim Dennis 13.09.2010 / 23:20

2 respostas

2

Um problema de portabilidade no seu script é o uso de &> /dev/null para redirecionar stdout e stderr. Este é um bashumano e não necessariamente funcionará em outros shells. (Eu fui mordido recentemente por este aqui). A maneira mais portátil é usar > /dev/null 2>&1 .

    
por 14.09.2010 / 01:28
1

Por que você está escrevendo o seu próprio? Por que não usar um pequeno e prático produto chamado keychain ?

Aqui está o Guia do Keychain do Gentoo (possivelmente uma nova versão do mesmo artigo no Funtoo )

É basicamente um pequeno programa que permite usar chaves protegidas por senha, sem digitar a senha o tempo todo. (Deve estar disponível em qualquer distro que você esteja usando)

Você também pode estar interessado na série Open SSH Key Management do Gentoo: parte 1 , parte 2 e part 3 . O que parece incluir algumas coisas que você está tentando fazer.

    
por 13.09.2010 / 23:57

Tags