ssh percent_expand token %n не работает

Вопрос или проблема

Я вижу на странице 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.

Рекомендации по устранению проблемы

  1. Обновите OpenSSH: Убедитесь, что вы используете последнюю версию OpenSSH. Это позволит вам использовать токены %n для IdentityFile, а также расширит другие возможности конфигурации.

  2. Измените конфигурацию: Если по каким-то причинам обновление невозможно, вы могли бы вручную указать полное имя файла идентификации для каждого хоста. Например:

    host github-MyPackage
        Hostname github.com
        User git
        IdentityFile %d/.ssh/github/github-MyPackage
        IdentitiesOnly yes
  3. Используйте другие методы аутентификации: Рассмотрите альтернативные способы управления SSH-ключами, такие как использование SSH-агента, что может помочь обойти необходимость в указании отдельных файлов идентификации.

Заключение

Использование токенов в конфигурации SSH, таких как %n, может существенно облегчить управление SSH-ключами, особенно в условиях множества проектов, как в вашем случае с GitHub. Однако важно следить за версией OpenSSH, чтобы обеспечить правильную работу всех функций. Обновление до последней версии не только решит вашу текущую задачу, но и обеспечит доступ к новым функциям и улучшенной безопасности.

Оцените материал
Добавить комментарий

Капча загружается...