Faça com que o ssh-add fique quieto se a chave já estiver lá

16

Eu quero colocar ssh-add /path/to/special_keyno topo de um script. Isso funciona bem, mas sempre solicita a senha. Isso é estranho e um pouco irritante, pois ainda pede a senha, mesmo quando ssh-add -lmostra que a chave já foi adicionada.

Existe uma maneira de dizer: "adicione essa chave e pergunte a senha se ela ainda não tiver sido adicionada, caso contrário, não faça nada"?

Darren Cook
fonte
Pergunta semelhante em superuser.com/q/325662
Darren Cozinhe

Respostas:

20

Não vejo opções para adicionar ao ssh que ajudem a alcançar o resultado desejado, mas é muito fácil contornar isso, pois você está preocupado com uma chave em particular.

Primeiro, pegue a impressão digital da sua chave_específica:

ssh-keygen -lf /path/to/special_key  | awk '{print $2}'

Digamos que essa impressão digital se pareça com 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Em seguida, na parte superior do seu script, use ssh-add -lpara verificar se essa chave está carregada, antes de solicitar a adição:

ssh-add -l |grep -q 6d:98:ed:8c:07:07:fe:57:bb:19:12:89:5a:c4:bf:25 || ssh-add /path/to/special_key

Você pode dobrar tudo isso em uma linha, se desejar:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Lars Rohrbach
fonte
O one-liner está funcionando bem, obrigado!
Darren Cozinhe
11
Acho que essa linha simplificada é um pouco mais compreensível e preferível, pois evita ssh-keygen(afinal, eu não quero gerar nenhuma chave), em vez disso, usando o caminho da chave:ssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
ohruunuruus
11
ssh-keygenna resposta não gera uma chave - o mesmo que ssh-add -lno seu exemplo, na verdade, não adiciona nada. Os sinalizadores modificam o comportamento dos comandos para que não correspondam exatamente ao nome. Observe que essas versões diferem funcionalmente - se a verificação por caminho e a chave nesse caminho forem alteradas, sua versão não será atendida. A versão na resposta também detectaria a chave existente, não importando de onde foi carregada.
Richlv 15/05/19
5

Não existe uma maneira direta de verificar usando apenas, ssh-addmas você pode usar ssh-keygene alguns scripts para verificar.

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi

O texto acima seria impresso yesse a impressão digital representada pelo arquivo /path/to/special_keyestivesse presente na ssh-add -lsaída do arquivo .

Exemplo

$ if  ssh-add -l | \
    grep -q "$(ssh-keygen -lf /path/to/special_key | awk '{print $2}')"; \
    then echo yes; \
    else echo no; \
  fi
yes

Onde o conteúdo da saída se ssh-keygen -lf /path/to/special_keyparece com isso:

$ ssh-keygen -lf /path/to/special_key
2048 8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c  dev-servers (RSA)

E estamos usando `awk '{print $ 2}' para selecionar apenas a segunda coluna, que contém a impressão digital, ou seja:

8a:6a:5a:44:20:c8:3a:da:ab:dd:1c:12:2c:e4:20:0c

Referências

slm
fonte
3

Você pode ter motivos específicos para usá-lo ssh-addexplicitamente, mas se quiser apenas "Quero que minha senha seja solicitada na primeira vez em que usar a chave, mas não depois disso", o openssh tem uma solução mais simples:

Coloque AddKeysToAgent yesno seu .ssh/configarquivo.

Nate
fonte
Obrigado. Aparentemente, isso foi adicionado no ssh 7.2 (o Ubuntu 18 parece estar na versão 7.6).
Darren Cozinhe
Sim, "AddKeysToAgent não é suportado pela minha versão do openssh" é um bom motivo para usar o ssh-add explicitamente;
Nate
0

ssh-add -K FILEfuncionou bem para mim no Mac.
Ele ainda mostra as linhas "Identity added:", mas não pede a senha.

Na página do manual:

-K Ao adicionar identidades, cada senha também será armazenada no chaveiro do usuário. Ao remover identidades com -d, cada senha será removida.

Ivan
fonte