Executando o ssh-agent a partir de um shell script

14

Estou tentando criar um script de shell que, entre outras coisas, inicializa o ssh-agent e adiciona uma chave privada ao agente. Exemplo:

#!/bin/bash
# ...
ssh-agent $SHELL
ssh-add /path/to/key
# ...

O problema com isso é que o ssh-agent aparentemente inicia outra instância do $ SHELL (no meu caso, bash) e da perspectiva do script é executado tudo e ssh-add e qualquer coisa abaixo dele nunca é executado.

Como posso executar o ssh-agent do meu shell script e mantê-lo seguindo em frente a lista de comandos?

    
por Dan 22.10.2013 / 22:57

7 respostas

7

O ssh-agent deve iniciar uma sessão e, quando terminar, a sessão do usuário termina. Portanto, qualquer comando após o ssh-agent talvez seja executado após o logoff.

O que você quer é um session-script que contenha seus comandos de sessões como este:

#!/bin/bash
ssh-add /path/to/key
bash -i # or other session starter

Em seguida, inicie ssh-agent session-script .

    
por 22.10.2013 / 23:18
14

Coloque o seguinte no topo do seu script:

eval 'ssh-agent'

Seu script deve ficar assim:

#!/bin/bash
eval 'ssh-agent'
ssh-add /path/to/key
...
...

Explicação

Os backticks em torno de ssh-agent coletam sua saída. eval coleta essa saída, concatena-a em um único comando e, em seguida, executa o comando. Então você pode usar ssh-add para fornecer suas principais credenciais.

    
por 14.07.2015 / 16:29
5

Eu costumo fazer algo assim em scripts que exigem um agente.

#!/bin/bash

# if we can't find an agent, start one, and restart the script.
if [ -z "$SSH_AUTH_SOCK" ] ; then
  exec ssh-agent bash -c "ssh-add ; $0"
  exit
fi

... and so on.

Basicamente, a primeira coisa que o script faz é verificar se um agente está sendo executado. Se não for exec é usado para iniciar um novo processo no lugar do script. O agente é iniciado, as chaves são adicionadas e, finalmente, o script é chamado novamente (consulte o $0 ).

    
por 22.10.2013 / 23:14
4

Eu achei que isso funciona para mim.

eval 'ssh-agent' # create the process
ssh-add ~/.ssh/priv_key # add the key
git -C $repo_dir pull # this line is the reason for the ssh-agent
eval 'ssh-agent -k' # kill the process

Eu crio o processo ssh-agent, adiciono a chave, faço o que preciso fazer e mato-a. Não há necessidade de verificar se está sendo executado posteriormente.

    
por 14.10.2015 / 21:43
3

É melhor usar o keychain neste caso

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Adicione ao seu .bashrc o seguinte:

eval 'keychain --eval id_rsa'
    
por 12.06.2015 / 21:42
2

Eu encontrei com a solução do Zoredache, a chave estaria disponível para qualquer shell que compartilhasse o mesmo ssh-agent como o shell que chamou o script. Eu queria evitar isso em um script que exigia acesso root a uma máquina remota, por motivos óbvios de segurança.

Eu encontrei colocando o seguinte shebang no topo do script funciona:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
    
por 24.02.2015 / 19:01
-1

Eu tentei e muito, e a solução que finalmente funcionou estava substituindo minha frase-senha por uma string vazia.

ssh-keygen -p
    
por 21.08.2014 / 09:40