Executando ssh-agent a partir de um script de shell

19

Estou tentando criar um script de shell que, entre outras coisas, inicia 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, ele executa tudo e o ssh-add e qualquer coisa abaixo dele nunca é executada.

Como posso executar o ssh-agent no meu script de shell e mantê-lo na lista de comandos?

Dan
fonte

Respostas:

8

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-scriptque contenha seus comandos de sessões como este:

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

Então comece ssh-agent session-script.

Michael Suelmann
fonte
Obrigado! Criar um script separado e finalizar o script com exito truque.
Dan
2
o que é um script de sessão?
Alexander Mills
15

Coloque o seguinte na parte superior 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 ssh-agentcoletam sua produção. evalcoleta essa saída, concatena-a em um único comando e, em seguida, executa o comando. Em seguida, você pode usar ssh-addpara fornecer suas principais credenciais.

scottyseus
fonte
9
Isso é exatamente o que eu precisava, obrigado, embora valha a pena ressaltar que os backticks estão saindo. No novo formulário bash, que deveria sereval $(ssh-agent)
sibaz
Essa solução não funcionou para mim até que eu coloquei bash -ino final do script.
Adolfo Correa
6

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á em execução. 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).

Zoredache
fonte
Mas isso não preservará nenhum parâmetro de script. E se algum dos parâmetros tiver espaço em branco, não será fácil transmiti-los.
Denilson Sá Maia
3
Você pode usar .. "ssh-add ; $0 $*"ou .. "ssh-add ; $0 $@", em vez disso, o que pode funcionar. O que não seria perfeito, mas certamente funcionaria em muitos casos. A melhor solução é quase sempre fazer com que seu agente seja executado antes de mais nada, isso é apenas algo que pode ser útil em casos obscuros.
Zoredache
6

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

Crio o processo ssh-agent, adiciono a chave, faço o que preciso e depois o mato. Não é necessário verificar se está funcionando mais tarde.

a vapor
fonte
4

É melhor usar chaveiro neste caso

Debian / Ubuntu:

apt-get install keychain

RHEL / Fedora / CentOS

yum install keychain

Adicione no seu .bashrc o seguinte:

eval `keychain --eval id_rsa`
ZIADI Mohamed ali
fonte
Melhor? Porque é melhor?
JFlo
@JFlo "Melhor" nisso, ele salvará as variáveis ​​env em $ HOME / .keychain / <file>. A execução desse comando novamente capturará um ssh-agent existente se ele ainda estiver em execução. Em seguida, pode ser reutilizado entre shells / scripts. Em alguns cenários que não são super seguros, é necessário fazer essa ligação. Para mim, é uma melhoria sobre alguns scripts que eu tinha escrito para realizar a mesma tarefa
Scott Carlson
2

Descobri que com a solução do Zoredache, a chave estaria disponível para qualquer shell que compartilhe o mesmo agente ssh que o shell que chamou o script. Eu queria evitar isso em um script que exigisse acesso root a uma máquina remota, por razões óbvias de segurança.

Eu descobri que colocar o seguinte shebang na parte superior do script funciona:

#!/usr/bin/ssh-agent bash

ssh-add /path/to/ssh-key
ssh root@remotehost "remote commands"
Andy Wood
fonte
-2

Eu tentei muito e a solução que finalmente funcionou foi substituir minha senha por uma string vazia.

ssh-keygen -p
Stephan Weinhold
fonte
Esta é uma prática muito insegura. Por que se preocupar em usar ssh? Se você não proteger sua chave privada, poderá estar falando em texto não criptografado.
JFlo
@ JFlo: não se o sistema do seu cliente for suficientemente seguro, o que pode ser. Especialmente se você (puder e fizer) adicionar ACL, SELinux ou similar, o que é fácil com um arquivo estático, mas menos com o soquete aleatório do ssh-agent. Dito isto, eu normalmente não o recomendaria como primeira escolha.
dave_thompson_085 5/03
Embora esse seja um processo muito útil para você, não acho que responda nada à pergunta do OP.
Alexander Bird