ssh-agent e tela

8

Um tempo atrás no StackOverflow, eu perguntei esta questão sobre o ssh-agent e o crontab . Eu tenho uma pergunta semelhante agora sobre o ssh-agent e a tela nos sistemas linux.

Então, no meu Mac, o ssh-agent é iniciado na inicialização do sistema, por isso está sempre disponível para mim. Eu acho que seria verdade no meu Linux (redhat el5 / fedora) se eu estivesse usando o X-Windows. No entanto, esta é uma máquina do servidor remoto e estou sempre fazendo login via ssh.

Eu adoraria ter o ssh-keys configurado corretamente, então não precisei digitar minha senha várias vezes durante uma atualização ou commit do svn. Fico feliz em digitar minha frase-senha uma vez por sessão e desestimulo nossa equipe a ter chaves ssh sem senha.

Por um breve momento brilhante, parecia que fazer "eval 'ssh-agent -s'" no meu .bash_profile, emparelhado com um comando para matar o ssh-agent quando eu me desconectasse, funcionaria. No entanto, usamos muito a tela para gerenciar programas interativos de longa duração e ambientes de desenvolvimento. Se você iniciar & Para o ssh-agent como acabei de descrever, ele é morto quando você sai do terminal e as sub-sessões da tela que estavam se referindo a essa instância do agente ssh são abandonadas.

Então ... como eu posso ser um usuário do console, que usa a tela, que usa uma senha com suas chaves ssh, que não precisa digitar a frase secreta constantemente?

    
por Michael H. 01.07.2010 / 00:50

6 respostas

3

Com a configuração a seguir, você não precisará de nenhum wrapper para invocar screen . Além disso, evita usar /tmp (com os riscos de segurança conseqüentes).

  1. Verifique se você tem um diretório ~ / tmp:

    mkdir ~/tmp
    
  2. Adicione a .screenrc a seguinte linha:

    setenv SSH_AUTH_SOCK "$HOME/tmp/ssh-agent-screen"
    
    • Isso garante que, dentro de screen , ssh procure o soquete sempre no mesmo local, em vez de um caminho de alteração.
    • Você deve usar setenv de acordo com o shell usado, já que é uma tela e não um comando de shell.
  3. Adicione a .bash_profile a seguinte linha:

    [ -n "$SSH_AUTH_SOCK" ] && [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] && ln -sf "$SSH_AUTH_SOCK" "$HOME/tmp/ssh-agent-screen"
    
    • Isso vinculará o local fixo (onde ssh parece) ao real e deverá aparecer após iniciando ssh-agent .
    • A utilização de [ -n "$SSH_AUTH_SOCK" ] impedirá adequadamente erros quando SSH_AUTH_SOCK não estiver definido.
    • [ "$SSH_AUTH_SOCK"!="$HOME/tmp/ssh-agent-screen" ] impedirá sessões de tela ligando $ HOME / tmp / ssh-agent-screen a si mesmo, se as fontes da tela forem .bash_profile .
  4. Em vez de iniciar ssh-agent em .bash_profile , você pode considerar a conexão com ssh -A (para usar o encaminhamento de agentes e fazer com que o computador remoto use seu agente).

Após essa configuração, você pode usar apenas o comando de tela padrão. Você só precisará recriar sessões existentes ou definir manualmente SSH_AUTH_SOCK dentro delas para o local fixo da etapa 2.

Créditos para este site para a ideia; Evitei usar /tmp . Esta resposta é semelhante, mas usa aliases extras.

    
por 19.09.2013 / 10:23
2

Você pode iniciar o ssh-agent a partir de um script em vez de .bash_profile ? Por exemplo, eu poderia colocar

su -c 'ssh-agent -s > ~/.ssh_agent_env' myusername

na parte apropriada de /etc/conf.d/local , embora o RHEL / Fedora provavelmente use um sistema diferente. Como você apontou no seu comentário, as sessões de terminal precisarão se conectar ao agente, e é por isso que o comando cria o arquivo .ssh_agent_env no diretório pessoal do usuário. Então você pode adicionar

[ -f ~/.ssh_agent_env ] && source ~/.ssh_agent_env >/dev/null

em .bash_profile .

Outra coisa que você pode fazer é colocar o seguinte em .bash_profile

ps -U myusername | grep -q ssh-agent || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

que iniciará ssh-agent apenas se ainda não estiver em execução. Então você não precisa matá-lo.

Como uma alternativa ligeiramente diferente à segunda sugestão, em vez de verificar a existência de um processo ssh-agent , você pode verificar a existência do arquivo ~/.ssh_agent_env ,

[ -f ~/.ssh_agent_env ] || ssh-agent -s > ~/.ssh_agent_env
source ~/.ssh_agent_env >/dev/null

Se tudo funcionar corretamente, não deve haver diferença significativa entre as duas formas.

    
por 01.07.2010 / 03:20
2

Confira chaveiro . Ele faz tudo isso. Analise especialmente as opções --clear e --timeout .

    
por 02.07.2010 / 23:25
2

Uma abordagem melhor é usar o encaminhamento de agente ssh ( -A option). Isso permite que a pessoa que usa o ssh use chaves do ssh-agent em execução na máquina de onde elas vêm, presumivelmente a estação de trabalho na qual elas estão realmente sentadas.

    
por 02.07.2010 / 23:29
2

para acompanhar o encaminhamento do agente ssh, você verá que, por padrão, as credenciais ssh encaminhadas não estarão disponíveis para sua sessão de tela quando você fizer logout, efetuar login novamente e anexar novamente à sua sessão.

Você pode contornar isso, porém, definindo a variável de ambiente SSH_AUTH_SOCK como algo bem conhecido e tendo essa localização bem conhecida atualizada para o seu soquete de autenticação atual.

Eu uso esta função de shell para voltar a entrar na tela e corrigir o ssh auth sock:

function sr () { 
    if [ ${+STY} = 1 ] ;then 
            echo already in screen\!
    else
            if [ "${SSH_AUTH_SOCK}x" != "x" ]; then
                    if [ ! -d /tmp/screenssh ]; then
                            mkdir /tmp/screenssh 
                    fi
                    rm -f /tmp/screenssh/socket
                    ln -s $SSH_AUTH_SOCK /tmp/screenssh/socket
                    echo $REMIP > /tmp/screenssh/remip
            fi                
            screen -DR
    fi
}

e eu tenho isso no meu .screenrc:

setenv SSH_AUTH_SOCK /tmp/screenssh/socket

Espero que isso ajude.

    
por 19.01.2011 / 06:04
1

Se eu entendi bem, você quer apenas uma sessão de tela, que você desanexa e reconecta algumas vezes, mas nunca mais deseja inserir novamente as senhas para o agente ssh (sua senha de chave privada).

Eu acho que a maneira mais fácil é iniciar a tela, do que iniciar o ssh-agent com um sub shell e depois ficar nesse sub shell. Ou seja,

screen
ssh-agent bash
ssh-add   # enter your password once

# some commands, some logins and logouts to remote servers via ssh public key

# <ctrl>+<a>, <ctrl>+<d> to detach screen
# you can now logout from this computer
# login again

# reattach to your screen
screen -r
# ssh-agent is still running
    
por 05.02.2014 / 15:09