Usar git pull via comando ssh invoke

2

Quando eu fizer login no meu servidor via SSH, eu posso usar o git sobre o ssh (repositório privado):

user@local:~$ ssh example.com
Welcome to Ubuntu 14.04.1 LTS (GNU/Linux 2.6.32-042stab083.2 i686)

 * Documentation:  https://help.ubuntu.com/
Last login: Thu Oct 30 10:46:22 2014 from 123.123.123.123
user@remote:~$ cd ~/path/to/project/
user@remote:~/path/to/project$ git pull
Enter passphrase for key '/home/user/.ssh/id_rsa': 
Already up-to-date.
user@remote:~/path/to/project$ ps -aux | grep ssh-agent
user     450  0.0  0.0   4396   832 pts/4    S+   10:57   0:00 grep ssh-agent
user   32680  0.0  0.0   4168   696 ?        Ss   10:50   0:00 ssh-agent
user@remote:~/path/to/project$

Note, no entanto, que devo inserir a senha, mesmo que em uma sessão separada, eu adicionei a chave usando ssh-add para ssh-agent. O agente ssh ainda está em execução, conforme mostrado acima. Presumi que isso me permitiria usar a chave ssh sem inserir a senha novamente. Eu estava errado.

Como estou usando um script de implantação que envolvia clonagem ou extração do repositório (depende do projeto), eu o executava do servidor de IC da seguinte forma:

ssh [email protected] '~/path/to/deployment/script.sh'

Como resultado, recebo uma "Permissão negada (publickey)". erro, uma vez que a chave precisa ser desbloqueada usando uma senha e nenhuma é dada.

Existem maneiras de contornar isso além de criar uma chave ssh sem uma frase secreta?

    
por mingos 30.10.2014 / 11:10

1 resposta

4

Para se conectar ao cliente ssh-agent , ssh (ou qualquer outro processo, para esse assunto) precisa saber como se conectar a ele. Esta informação é emitida pelo ssh-agent quando iniciado na forma de comandos shell. Geralmente parece assim:

$ ssh-agent
SSH_AUTH_SOCK=/tmp/ssh-H8yPWdYCNFmT/agent.506989; export SSH_AUTH_SOCK;
SSH_AGENT_PID=506990; export SSH_AGENT_PID;
echo Agent pid 506990;

Normalmente, o aplicativo de distribuição apenas avalia esses comandos para carregar as variáveis no ambiente de processo atual (que é então propagado para todos os processos filhos).

Assim, você precisa localizar o soquete apropriado para se conectar ao processo de ssh-agent correto (sim, você pode ter vários agentes em execução ao mesmo tempo, mesmo para um usuário). Existem duas maneiras de fazer isso:

  1. verifique o PID do agente em questão e verifique todos os diretórios /tmp/ssh-* para um soquete com PID mais próximo menor (pois ssh-agent forks para se tornar um daemon, o PID usado em nome de o soquete é menor que o PID do daemon real)

    Se o programa que gerou o agente em questão ainda estiver em execução (ou um de seus filhos for), você poderá extrair as informações de seu ambiente:

    $ strings /proc/<PID>/environ | grep SSH_
    
  2. Sempre inicie o agente dizendo qual soquete ele deve usar:

    $ ssh-agent -a /path/to/ssh_agent/socket
    

    Isso pode ser útil, por exemplo, também quando você está trabalhando em uma máquina local e remotamente - você pode conectá-lo aos scripts de inicialização do shell e ao se conectar à máquina em que o agente foi gerado pelo ambiente de desktop, você só terá acesso a todas as chaves que você carregou lá. O mesmo vale para usar multiplexadores de terminal e assim por diante.

por 30.10.2014 / 12:19

Tags