Как получить запрос на ключевую фразу ключевого слова SSH один раз и только при необходимости?

(Я прочитал многие вопросы на этом сайте, которые выглядят связанными, и я считаю, что это действительно новый вопрос.)

У меня много ключей на множестве серверов, и все они защищены парольной фразой.

Мне нравится вводить парольные фразы примерно так же, как мне нравится вводить пароли - это реальная утечка производительности.

  • ssh-agent + команды ssh-add могут использоваться в оболочке входа, чтобы иметь в виду, что вам нужно только ввести парольную фразу после входа в систему

  • keychain может использоваться для хранения ssh-агента, живущего вне выхода из системы, поэтому, например, вы можете его использовать, поэтому вам нужно только вводить парольную фразу один раз при загрузке, или вы можете он сохраняет его в течение часа или около того.

Проблема заключается в том, что оба этих решения обычно запускаются в логическом интерфейсе (например, .zshrc) полагаются на меня, вводя мой passphrase, когда я вхожу в систему, даже если мне не понадобится его разблокировать. (Я не доволен тем, что брелок хранит агента на неопределенное время.)

Мне хотелось бы получить подсказку для ключевой фразы (для агента) только при необходимости .

Итак, я могу войти на сервер A, сделать некоторые вещи, затем ssh на сервер B и в этой точке запросить парольную фразу. Сделайте некоторые вещи на сервере B, выйдите из системы. Вернемся к A, сделайте еще несколько вещей, ssh для B снова и не нуждайтесь в моей кодовой фразе (она удерживается агентом).

Я отмечаю, что это возможно на графических десктопах, таких как Gnome, - вы получаете всплывающее окно с просьбой ввести ключевую фразу, чтобы разблокировать ваш закрытый ключ, как только вы попытаетесь выполнить ssh. Итак, это то, что мне нужно, но с консоли.

13 голосов | спросил artfulrobot 20 Jpm1000000pmTue, 20 Jan 2015 18:53:23 +030015 2015, 18:53:23

2 ответа


6

Zsh имеет крючок preexec, который выполняет функцию перед выполнением команды, введенной в командной строке. Вот крючок, который ищет в командной строке ssh, и если он найден, проверяет наличие агента ssh. Если это не найдено, он запускает брелок.

Таким образом, keychain запускается только перед командами ssh, а затем только при необходимости.

Поместите это в свой ~/.zshrc:

function check_ssh {
  [[ $3 =~ '\bssh\b' ]] || return
  [[ -n "$SSH_AGENT_PID" && -e "/proc/$SSH_AGENT_PID" ]] \
    && ssh-add -l >/dev/null && return
  eval `keychain --eval id_dsa --timeout 60`
}    
autoload -U add-zsh-hook
add-zsh-hook preexec check_ssh

Что происходит, когда вся команда набирается, ---- +: = 4 =: + ---- вызывается перед выполнением команды.

Первая строка функции проверяет расширенную команду для check_ssh с использованием регулярного выражения Zsh. ssh должны иметь границы слов ssh с обеих сторон , Если это не будет найдено, функция вернется.

Следующая строка проверяет, что в переменной среды есть агент агента SSH, и что этот процесс существует в таблице процессов, а затем, по крайней мере, один ключ был добавлен к агенту. Если все это в порядке, то агент ssh настроен, и нам не нужно ничего делать, поэтому он возвращается.

Наконец, мы запускаем брелок, и агент должен оставаться в живых в течение часа.

Он по-прежнему оставляет проблему со встроенным файлом ssh, например \b или git или rsync, поскольку это не вызовет функцию (вы можете добавить их в регулярное выражение).

ответил artfulrobot 21 Jpm1000000pmWed, 21 Jan 2015 19:17:10 +030015 2015, 19:17:10
2

Для zsh я написал набор утилит и оберток для более или менее того, что вы хотите: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils

На самом деле это делает еще больше, потому что ssh-agent будет использоваться всеми сеансами входа (рабочий стол или через SSH и экран GNU также поддерживается, если вы запускаете из него оболочки входа, например, с помощью shell -zsh в ~/.screenrc), и он выйдет только после завершения последнего сеанса.

Примечание. Я использую только одну кодовую фразу для всех моих ключей. Я не уверен в поведении для разных кодовых фраз; могут потребоваться некоторые изменения.

ответил vinc17 20 Jpm1000000pmTue, 20 Jan 2015 20:40:26 +030015 2015, 20:40:26

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132