Вопрос или проблема
Я только что установил Arch и пытаюсь настроить свою оболочку zsh
.
В настоящее время я использую zinit
в качестве менеджера плагинов с powerlevel10k
.
Я хотел автоматизировать активацию ssh-agent
и добавление ключей в него.
Это мой текущий файл .zshrc
:
neofetch
# Включите мгновенный запрос Powerlevel10k. Должен находиться ближе к верхней части ~/.config/zsh/.zshrc.
# Инициализационный код, который может требовать ввода с консоли (подсказки пароля, [y/n]
# подтверждения и т. д.), должен находиться выше этого блока; все остальное может находиться ниже.
if [[ -r "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh" ]]; then
source "${XDG_CACHE_HOME:-$HOME/.cache}/p10k-instant-prompt-${(%):-%n}.zsh"
fi
# Установите каталог для хранения zinit и плагинов
# --- Определен в файле .zshenv
# Загрузите Zinit, если его еще нет
if [ ! -d "$ZINIT_HOME" ]; then
mkdir -p "$(dirname $ZINIT_HOME)"
git clone https://github.com/zdharma-continuum/zinit "$ZINIT_HOME"
fi
# Загрузите zinit
source "${ZINIT_HOME}/zinit.zsh"
# Добавьте Powerlevel10k
zinit ice depth=1; zinit light romkatv/powerlevel10k
# Добавьте плагины zsh
zinit light zsh-users/zsh-syntax-highlighting
zinit light zsh-users/zsh-completions
zinit light zsh-users/zsh-autosuggestions
zinit light Aloxaf/fzf-tab
# Добавьте фрагменты
zinit snippet OMZP::git
zinit snippet OMZP::sudo
zinit snippet OMZP::archlinux
zinit snippet OMZP::command-not-found
zinit snippet OMZP::ssh-agent
# Загрузите завершения
autoload -U compinit && compinit
# Повторите все кэшированные завершения (рекомендуется документацией)
zinit cdreplay -q
# Чтобы настроить подсказку, выполните `p10k configure` или отредактируйте ~/.config/zsh/.p10k.zsh.
[[ ! -f ~/.config/zsh/.p10k.zsh ]] || source ~/.config/zsh/.p10k.zsh
# Привязка клавиш - стиль emacs, включает ^f ^b ^a ^e ...
bindkey -e
bindkey '^p' history-search-backward
bindkey '^n' history-search-forward
# История
# -- некоторые изменения уже в файле .zshenv
setopt appendhistory # добавлять в файл истории вместо перезаписи
setopt sharehistory # делиться историей команд между сессиями
setopt hist_ignore_space # игнорировать команды, начинающиеся с пробела
setopt hist_ignore_dups
setopt hist_ignore_all_dups
setopt hist_save_no_dups
setopt hist_find_no_dups # Не показывать дубликаты в поиске истории
# Стиль завершения
zstyle ':completion:*' matcher-list 'm:{a-zj}={A-Za-z}'
# Установите цвета по умолчанию для LS_COLORS
eval $(dircolors -b)
zstyle ':completion:*' list-colors $LS_COLORS
zstyle ':completion:*' menu no
zstyle ':fzf-tab:complete:cd:*' fzf-preview 'ls --color $realpath'
zstyle ':fzf-tab:complete:__zoxide_z:*' fzf-preview 'ls --color $realpath'
# конфигурации ssh-agent
zstyle :omz:plugins:ssh-agent quiet yes
zstyle :omz:plugins:ssh-agent lazy yes
zstyle :omz:plugins:ssh-agent agent-forwarding yes
zstyle :omz:plugins:ssh-agent identities ~/.ssh/github_rsa
# Псевдонимы
alias ls="ls --color"
alias c="clear"
alias b='cd ..'
# Интеграции оболочки
eval "$(fzf --zsh)" # Неявный поиск
eval "$(zoxide init --cmd cd zsh)"
Как видите, для ssh-ключей я использую:
zinit snippet OMZP::ssh-agent
и следующие настройки:
zstyle :omz:plugins:ssh-agent quiet yes
zstyle :omz:plugins:ssh-agent lazy yes
zstyle :omz:plugins:ssh-agent agent-forwarding yes
zstyle :omz:plugins:ssh-agent identities ~/.ssh/github_rsa
~/.ssh/github_rsa
– это место расположения действующего ключа и он не имеет связанного с ним пароля.
Проблема, с которой я сталкиваюсь, заключается в том, что никаких ключей не добавляется в агент.
Я не нашел никаких упоминаний об этом в интернете.
Как упоминалось в плагине ssh-agent, в разделе “Настройки” / “идентификации” (выделение не моё):
Чтобы загрузить несколько идентификаций, используйте стиль
identities
(это не имеет эффекта, если включена настройка lazy).
Так что в этом и заключается ваша проблема.
Однако, как упоминается на той же странице в разделе “Настройки” / “Специфические настройки для Powerline 10k”:
Powerline10k имеет настройку мгновенного запроса, которая не любит, когда этот плагин записывает в консоль. Рассмотрите возможность использования следующих настроек, если вы используете p10k (документировано выше):
zstyle :omz:plugins:ssh-agent quiet yes zstyle :omz:plugins:ssh-agent lazy yes
Так что вы можете попробовать следующее:
- Игнорировать предупреждение в разделе “Специфические настройки для Powerline 10k” и удалить
zstyle :omz:plugins:ssh-agent lazy yes
. Это, вероятно, стоит попробовать. Однако формулировка в разделе “идентификации” заставляет меня думать, что вам может понадобиться передать больше одной идентификации, поэтому, если простое удалениеzstyle :omz:plugins:ssh-agent lazy yes
не сработает и вы все равно хотите загрузить свою “умолчательную” идентификацию, попробуйте также изменитьzstyle :omz:plugins:ssh-agent identities ~/.ssh/github_rsa
на (предполагая, что ваша “умолчательная” идентификация – это~/.ssh/id_rsa
):zstyle :omz:plugins:ssh-agent identities ~/.ssh/id_rsa ~/.ssh/github_rsa
- Не игнорировать предупреждение в разделе “Специфические настройки для Powerline 10k” и попытаться следовать рекомендациям в разделе “Настройки” / “lazy”:
Вы можете активировать
AddKeysToAgent
, передав-o AddKeysToAgent=yes
в командуssh
, или добавивAddKeysToAgent yes
в ваш файл~/.ssh/config
Ответ или решение
Чтобы решить проблему с добавлением ключей в агент SSH в Zsh с использованием плагина ssh-agent
, нужно учитывать несколько моментов, описанных ниже.
Проблема
Вы описали, что используете zinit
как менеджер плагинов и активно работаете с конфигурацией .zshrc
, но ключи не добавляются в агент SSH. Попробуем разобраться, что может быть не так и как исправить ситуацию.
Анализ конфигурации
-
Параметры плагина ssh-agent: В вашей конфигурации вы используете следующие стили (zstyle):
zstyle :omz:plugins:ssh-agent quiet yes zstyle :omz:plugins:ssh-agent lazy yes zstyle :omz:plugins:ssh-agent agent-forwarding yes zstyle :omz:plugins:ssh-agent identities ~/.ssh/github_rsa
Однако, как указано в документации плагина, использование параметра
lazy
делает невозможным загрузку идентичностей. Удаление этого параметра может помочь:zstyle :omz:plugins:ssh-agent quiet yes zstyle :omz:plugins:ssh-agent agent-forwarding yes zstyle :omz:plugins:ssh-agent identities ~/.ssh/github_rsa
Если вы хотите загружать несколько ключей, можно изменить строку с
identities
. Например, если у вас есть еще пара ключей:zstyle :omz:plugins:ssh-agent identities ~/.ssh/id_rsa ~/.ssh/github_rsa
-
Опция lazy: Если вы оставите
lazy
, то вышеупомянутое не будет работать, как уже упоминалось в документации. Вам необходимо решить, что важнее — использоватьlazy
или загружать ключи.
Альтернатива — использование конфигурации SSH
Если хотите продолжить использовать опцию lazy
, то добавьте следующие строки в ваш файл конфигурации SSH (~/.ssh/config
):
Host *
AddKeysToAgent yes
Это позволит ssh-клиенту автоматически добавлять ключи в агентов.
Пример полного кода
Вот как может выглядеть ваша конфигурация .zshrc
с необходимыми исправлениями:
# Ваша первоначальная конфигурация...
# ssh-agent настройки
zstyle :omz:plugins:ssh-agent quiet yes
# zstyle :omz:plugins:ssh-agent lazy yes # закомментируйте или удалите эту строку
zstyle :omz:plugins:ssh-agent agent-forwarding yes
zstyle :omz:plugins:ssh-agent identities ~/.ssh/id_rsa ~/.ssh/github_rsa
# Остальная часть вашей конфигурации...
Заключение
Следуя данным рекомендациям, вы должны иметь возможность успешно добавлять ключи в агент SSH. Убедитесь, что они имеют правильные права доступа и не имеют пароля, если вы не хотите вводить его каждый раз. Если у вас возникнут дополнительные вопросы или проблемы, не стесняйтесь обратиться за помощью.