Вопрос или проблема
Я вижу на странице man ssh_config и на сайте openssh, что я должен иметь возможность использовать %n token при указании файла идентификации для данной записи хоста.
percent_expand токены, используемые OpenSSH ssh(1) и sshd(8)
GitHub позволяет использовать ssh токены в качестве токенов развертывания, но не позволяет использовать токен более одного раза на нескольких репозиториях. Поэтому я хотел использовать глоббинг, чтобы создать один профиль, независимо от того, сколько индивидуальных ключей проекта мне нужно создать:
host github-*
Hostname github.com
User git
IdentityFile %d/.ssh/github/%n
IdentitiesOnly yes
Затем я поместил пару открытых/закрытых ключей github-MyPackage в каталог ~/.ssh/github/
.
Система находит глоббированный профиль, и %d работает нормально, но если я пытаюсь выполнить git clone с %n, чтобы найти имя файла идентификации по исходному алиасу хоста, указанному в командной строке:
> git clone github-MyPackage:/myorganization/MyPackage.git
Клонирование в 'MyPackage'...
percent_expand: неизвестный ключ %n
fatal: Не удалось прочитать удаленный репозиторий.
Пожалуйста, убедитесь, что у вас есть правильные права доступа
и что репозиторий существует.
Это не просто потому, что git к нему обращается, так как это также не удается при выполнении простой ssh команды:
> ssh github-MyPackage
percent_expand: неизвестный ключ %n
Я пытался гуглить, но не нашел ничего по %n. Это не полностью реализовано или есть что-то, что я делаю неправильно?
Вероятно, ваша версия ssh слишком старая, вы можете проверить с помощью ssh -V
.
OpenSSH_7.9p1 поддерживает %n
только для некоторых ключевых слов (из локальной установленной man страницы):
Match exec ControlPath LocalCommand RemoteCommand
Я не могу сказать, какая конкретная версия добавляет этот токен в IdentityFile
, но это работает с OpenSSH_8.9p1 для большего количества ключевых слов:
CertificateFile ControlPath IdentityAgent IdentityFile LocalForward Match exec RemoteCommand RemoteForward UserKnownHostsFile ProxyCommand
Ответ или решение
Проблема с использованием токена %n в SSH
При работе с SSH и конфигурацией для GitHub пользователи часто сталкиваются с неожиданными проблемами, связанными с токенами, такими как %n
. В данной статье мы рассмотрим детали проблемы с токеном %n
, что он значит, и какие версии OpenSSH его поддерживают.
Что такое токен %n?
В OpenSSH токен %n
используется для представления имени хоста (или псевдонима хоста), указанного в конфигурации SSH. Это позволяет создавать более динамичные конфигурационные файлы, где имя хоста будет автоматически подставляться в разные поля, такие как файлы идентификации.
Описание проблемы
Вы указали в конфигурации SSH следующий блок:
host github-*
Hostname github.com
User git
IdentityFile %d/.ssh/github/%n
IdentitiesOnly yes
Находясь в каталоге ~/.ssh/github/
, вы создали пары ключей для каждого отдельного проекта с именами, начинающимися на github-
. Несмотря на то что параметр %d
(ваша директория) работает корректно, при использовании %n
вы получаете ошибку:
percent_expand: unknown key %n
fatal: Could not read from remote repository.
Поведение также повторяется и при использовании чистой команды SSH:
ssh github-MyPackage
percent_expand: unknown key %n
Причины проблемы
Как было упомянуто в вашем вопросе, причина может заключаться в версии OpenSSH, которую вы используете. Токен %n
для IdentityFile
был добавлен в версии OpenSSH 8.9p1, тогда как в более ранних версиях (например, 7.9p1) поддержка этих токенов была ограниченной.
В частности, для OpenSSH 7.9p1 токен %n
поддерживается только для следующих параметров:
- Match exec
- ControlPath
- LocalCommand
- RemoteCommand
Это означает, что ваша версия не поддерживает %n
в параметре IdentityFile
. Вы можете проверить текущую версию SSH с помощью команды:
ssh -V
Если ваша версия ниже 8.9p1, рекомендуется обновить OpenSSH до актуальной версии, чтобы использовать все возможности, включая токен %n
.
Рекомендации по устранению проблемы
-
Обновите OpenSSH: Убедитесь, что вы используете последнюю версию OpenSSH. Это позволит вам использовать токены
%n
дляIdentityFile
, а также расширит другие возможности конфигурации. -
Измените конфигурацию: Если по каким-то причинам обновление невозможно, вы могли бы вручную указать полное имя файла идентификации для каждого хоста. Например:
host github-MyPackage Hostname github.com User git IdentityFile %d/.ssh/github/github-MyPackage IdentitiesOnly yes
-
Используйте другие методы аутентификации: Рассмотрите альтернативные способы управления SSH-ключами, такие как использование SSH-агента, что может помочь обойти необходимость в указании отдельных файлов идентификации.
Заключение
Использование токенов в конфигурации SSH, таких как %n
, может существенно облегчить управление SSH-ключами, особенно в условиях множества проектов, как в вашем случае с GitHub. Однако важно следить за версией OpenSSH, чтобы обеспечить правильную работу всех функций. Обновление до последней версии не только решит вашу текущую задачу, но и обеспечит доступ к новым функциям и улучшенной безопасности.