Имейте ssh-add молчите, если ключ уже там

16

Я хочу поставить ssh-add /path/to/special_keyв верхней части сценария. Это работает нормально, но всегда запрашивает пароль. Это странно и немного раздражает, так как все еще запрашивает фразу-пароль, даже когда ssh-add -lпоказывает, что ключ уже был добавлен.

Есть ли способ сказать это: «добавить этот ключ и спросить пароль, если он еще не был добавлен, иначе ничего не делать»?

Даррен Кук
источник
Аналогичный вопрос на superuser.com/q/325662
Даррен Кук,

Ответы:

20

Я не вижу каких-либо опций для ssh-add, которые бы помогли достичь желаемого результата, но это довольно легко обойти, учитывая, что вас интересует только один ключ.

Сначала возьмите отпечаток пальца для вашего special_key:

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

Допустим, этот отпечаток выглядит как 6d: 98: ed: 8c: 07: 07: fe: 57: bb: 19: 12: 89: 5a: c4: bf: 25

Затем, в верхней части вашего скрипта, используйте, ssh-add -lчтобы проверить, загружен ли этот ключ, прежде чем предлагать добавить его:

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

Вы можете сложить все это в одну строку, если хотите:

ssh-add -l |grep -q `ssh-keygen -lf /path/to/special_key  | awk '{print $2}'` || ssh-add /path/to/special_key
Ларс Рорбах
источник
Однострочник работает хорошо, спасибо!
Даррен Кук
1
Я считаю, что этот упрощенный ssh-keygenssh-add -l | grep -q 'path/to/key' || ssh-add /path/to/key
однострочный
1
ssh-keygenв ответ не генерирует ключ - так же, как ssh-add -lв вашем примере, на самом деле ничего не добавляется. Флаги изменяют поведение команд, поэтому оно не совсем соответствует названию. Обратите внимание, что эти версии функционально отличаются - если проверка по пути и ключ на этом пути изменится, ваша версия не подберет его. Версия в ответе также обнаружит существующий ключ независимо от того, откуда он был загружен.
Richlv
5

Нет прямого способа проверить с помощью just, ssh-addно вы можете использовать ssh-keygenи некоторые сценарии для проверки.

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

Выше будет напечатано, yesесли отпечаток, представленный файлом, /path/to/special_keyприсутствовал в ssh-add -lвыводе.

пример

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

Где содержимое вывода из ssh-keygen -lf /path/to/special_key выглядит так:

$ 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)

И мы используем `awk '{print $ 2}', чтобы выбрать только 2-й столбец, который содержит отпечаток, то есть:

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

Ссылки

SLM
источник
3

У вас могут быть конкретные причины для ssh-addявного использования , но если вы просто хотите «Я хочу, чтобы мне выдавали фразу-пароль при первом использовании ключа, но не после этого», openssh предлагает более простое решение:

Положите AddKeysToAgent yesв свой .ssh/configфайл.

Nate
источник
Благодарю. По-видимому, это было добавлено в ssh 7.2 (Ubuntu 18, похоже, на версии 7.6).
Даррен Кук
Да, «AddKeysToAgent не поддерживается моей OpenSSH версии» хорошая причина для использования SSH-добавить явно ;-)
Nate
0

ssh-add -K FILE работал нормально для меня на Mac.
Он по-прежнему показывает строки «Идентификация добавлена:», но не запрашивает фразу-пароль.

С man-страницы:

-K При добавлении идентификаторов каждая ключевая фраза также будет храниться в цепочке для ключей пользователя. При удалении идентификаторов с помощью -d каждая фраза будет удалена из него.

Иван
источник