Использование отдельных различных SSH ключей для различных GIT репозиториев

Зайчатки разума

Записная книжка айтишника

Использование отдельных различных SSH ключей для различных GIT репозиториев

2020-03-06 14:55:17 — Evgeniy Shumilov

  Сегодня нашёл метод решения одной из небольших, но досадных проблем, которые меня мучали годами. Собственно, описание проблемы понятно из заголовка. Если чуть более подробно, то для того, чтобы использовать git pull/fetch/push и тому подобные команды с GitHub/GitLab, git может использовать либо подключение через ssh, в том числе использованием доступа по ключу, либо через https, что заставляет вас каждый раз вводить логин и пароль. В данном случае речь идёт не о средах разработки, где все учётные данные в этом случае прекрасно сохраняются, а о работе с консолью и использовании скриптов в автоматическом режиме например, для деплоя. В случае использования пары ключей конечно, можно создать ключ без пароля и всё будет прекрасно ровно до того момента, пока вам не понадобится использовать разные ключи для разных репозиториев. Например, в случае с разными учётными записями на GitHub/GitLab - домашней и рабочей. Или если вы получили так называемый deploy key от удалённого репозитория.


  Известный многим способ - создаём в ~/.ssh/config описание нужного количества хостов по одному на ключ, меняем для каждого значение Host и прописываем нужные ключи в IdentityFile. Вот пример части такого конфигурационного файла:

Host user1.github.com
HostName github.com
User git
IdentityFile ~/.ssh/user1_private_rsa_key
IdentitiesOnly yes

Host user2.github.com
HostName github.com
User git
IdentityFile ~/.ssh/user2_private_rsa_key
IdentitiesOnly yes

  В этом случае мы должны клонировать репозиторий уже с использованием нового url примерно так:

git clone git@user1.github.com:someuser/somerepo.git

  Либо необходимо изменить remote origin, что можно сделать в содержимом .git/config ручками в поле url секции origin или с помощью команды 

git remote set-url origin git@user1.github.com:someuser/somerepo.git

  Конечно, всё это прекрасно работает и этот способ описан на реддите и stackoverflow столько раз, сколько был задан вопрос о том, как это сделать. Но мне такой способ никогда не нравился тем, что кроме клонирования репозитория нам необходимо ещё править конфигурационные файлы у какого-то определённого пользователя, помнить об этом. Я хочу в случае крайней необходимости выполнить sudo git pull и получить результат, а не искать по домашним директориям всех пользователей конфиг с нужным корректно прописанным хостом. Вариант, когда  настройки репозитория остаются в пределах самого репозитория кажется мне намного более логичным и переносимым (надеюсь, я подобрал правильный перевод к слову portable).

  И вот, спустя лет 10 работы с гитом я нашёл способ и он оказался очень простым. Как выяснилось, для git можно задавать кастомную команду для установки коннекта по ssh по аналогии с тем, как это делается для rsync, только почему-то об этом практически нигде не пишут. Предположим, что наш ключ для репозитория git@github.com/someuser/somerepo.git лежит по пути /home/someuser/.ssh/specialkey_rsa, тогда последовательность действий, которую нам нужно будет совершить, будет следующей:

mkdir somerepo
cd somerepo
git remote add git@github.com/someuser/somerepo.git
git config --local core.sshCommand 'ssh -i /home/someuser/.ssh/specialkey_rsa'

 Всё, можно пользоваться в рамках этой директории командой git как обычно, она при этом будет использовать указанный нами ключ. Так как git config мы вызывали с ключом --local, то глобальные настройки не будут изменены. По умолчанию параметр core.sshCommand пуст и git в этом случае использует первый найденный в $PATH бинарник с именем ssh. Проверить, что всё верно можно запустив указанную ниже команду внутри нашего репозитория и за его пределами.

git config --local core.sshCommand

 

Теги: админское

comments powered by Disqus