Ter ssh-add ficar quieto se a chave já estiver lá

13

Eu quero colocar ssh-add /path/to/special_key no topo de um script. Isso funciona bem, mas sempre solicita a frase secreta. Isso é estranho, e um pouco chato, pois ainda pede a senha mesmo quando ssh-add -l mostra que a chave já foi adicionada.

Existe uma maneira de dizer: "adicione esta chave e peça a passphrase se já não foi adicionada, caso contrário não faça nada"?

    
por Darren Cook 31.05.2014 / 03:26

2 respostas

12

Eu não vejo nenhuma opção para o ssh-add que ajude a alcançar o resultado desejado, mas é muito fácil trabalhar com isso, já que você está preocupado com uma chave em particular.

Primeiro, pegue a impressão digital para sua special_key:

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

Digamos que essa impressão digital pareça 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 -l para verificar se essa chave está carregada antes de solicitá-la:

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
    
por 31.05.2014 / 09:41
5

Não há uma maneira direta de verificar usando apenas ssh-add , mas você pode usar ssh-keygen e 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 imprimirá yes se a impressão digital representada pelo arquivo /path/to/special_key estiver presente na saída de ssh-add -l .

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 de ssh-keygen -lf /path/to/special_key se parece com isto:

$ 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

por 31.05.2014 / 09:49