2011-01-12 18:20:31 +0000 2011-01-12 18:20:31 +0000
702
702

Как сказать git'у, какой закрытый ключ использовать?

ssh имеет опцию -i для указания, какой файл закрытого ключа использовать при аутентификации:

-i identity_file

Выбор файла, из которого считывается идентификатор (закрытый ключ) для RSA или DSA-аутентификации.  По умолчанию это ~/.ssh/identity для протокола версии 1, и ~/.ssh/id_rsa и ~/.ssh/id_dsa для протокола версии 2. Файлы идентификаторов также могут быть указаны для каждого хоста в конфигурационном файле.  Возможно иметь несколько -i опций (и несколько идентификаторов, указанных в конфигурационных файлах).

Есть ли похожий способ сказать git, какой файл с закрытым ключом использовать в системе с несколькими закрытыми ключами в каталоге ~/.ssh?

Ответы (19)

720
720
720
2011-01-12 19:36:21 +0000

В ~/.ssh/config добавьте:

host github.com
 HostName github.com
 IdentityFile ~/.ssh/id_rsa_github
 User git

Если конфигурационный файл новый, не забудьте сделать chmod 600 ~/.ssh/config

Теперь вы можете сделать git clone git@github.com:{ORG_NAME}/{REPO_NAME}.git

  • Где {ORG_NAME} - имя GitHub URI вашей учётной записи (или учётной записи организации).
  • Обратите внимание, что после : вместо косая черта github.com есть двоеточие / - так как это не URI.
  • А {REPO_NAME} - это URI имя Вашего GitHub repo
  • Например, для ядра Linux это будет git clone git@github.com:torvalds/linux.git).

ПРИМЕЧАНИЕ: В Linux и MacOS, проверьте, что разрешения на Вашу IdentityFile равны 400. SSH отклонит нечетко выраженным образом SSH-ключи, которые слишком читабельны. Это будет выглядеть как отказ от учетных данных. Решение, в данном случае, следующее:

chmod 400 ~/.ssh/id_rsa_github
```.
387
387
387
2015-05-08 09:43:07 +0000

Переменная окружения GIT_SSH_COMMAND:

Начиная с версии 2.3.0 в Git'е можно использовать переменную окружения GIT_SSH_COMMAND следующим образом:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example" git clone example

Обратите внимание, что -i иногда может быть переопределён вашим конфигурационным файлом, и в этом случае нужно дать SSH пустой конфигурационный файл, например:

GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example -F /dev/null" git clone example

Configuration core.sshCommand:

From Git'а версии 2. 10.0, вы можете настроить это за повторное использование или глобально, так что вам больше не придётся устанавливать переменную окружения!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
122
122
122
2015-01-23 22:08:00 +0000

Существует нет direct способ сказать git, какой закрытый ключ использовать, потому что он полагается на ssh для аутентификации репозитория. Тем не менее, есть ещё несколько способов достижения вашей цели:

Вариант 1: ssh-agent

Вы можете использовать ssh-agent для временной авторизации закрытого ключа.

Например:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Вариант 2: GIT_SSH_COMMAND

Передайте аргументы ssh с помощью переменной окружения GIT_SSH_COMMAND (Git 2.3.0+).

Например:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Вы можете ввести все это в одной строке - игнорируйте $ и не указывайте Существует **нет _direct_ способ** сказатьgit, какой закрытый ключ использовать, потому что он полагается наssh` для аутентификации репозитория. Тем не менее, есть ещё несколько способов достижения вашей цели:

Вариант 1: ssh-agent

Вы можете использовать ssh-agent для временной авторизации закрытого ключа.

Например:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'

Вариант 2: GIT_SSH_COMMAND

Передайте аргументы ssh с помощью переменной окружения GIT_SSH_COMMAND (Git 2.3.0+).

Например:

$ GIT_SSH_COMMAND='ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no' \
  git clone user@host

Вы можете ввести все это в одной строке - игнорируйте $ и не указывайте .

Вариант 3: GIT_SSH

Передача аргументов ssh с помощью переменной окружения GIT_SSH для указания альтернативного двоичного ssh.

Например:

$ echo 'ssh -i ~/.ssh/id_rsa -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no $*' > ssh
$ chmod +x ssh
$ GIT_TRACE=1 GIT_SSH='./ssh' git clone user@host

Примечание: Вышеуказанные строки являются командными строками оболочки (терминала), которые вы должны вставить в ваш терминал. Они создадут файл с именем ssh, сделают его исполняемым и (косвенно) выполнят его.

Замечание: GIT_SSH доступен с версии v0.99.4 (2005).

Вариант 4: ~/.ssh/config

Используйте файл ~/.ssh/config, как предложено в других ответах, чтобы указать расположение вашего закрытого ключа, например

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
```.
33
33
33
2011-01-12 18:25:51 +0000

Напишите скрипт, который вызывает ssh с нужными вам аргументами, и поместите имя файла скрипта в $GIT_SSH. Или просто поместите вашу конфигурацию в ~/.ssh/config.

22
22
22
2016-05-17 15:03:09 +0000

Используйте пользовательскую конфигурацию хоста в ~/.ssh/config, как это:

Host gitlab-as-thuc  
    HostName github.com
    User git
    IdentityFile ~/.ssh/id_rsa.thuc
    IdentitiesOnly yes

, а затем используйте ваше пользовательское имя хоста, как это:

git remote add thuc git@gitlab-as-thuc:your-repo.git
22
22
22
2015-07-21 19:44:50 +0000

Если вы не хотите каждый раз указывать переменные окружения при запуске git'а, не хотите использовать другой обёрточный скрипт, не хотите/не можете запускать ssh-agent(1), а также не хотите загружать другой пакет только для этого, используйте внешний транспорт git-remote-ext(1):

$ git clone 'ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git'
Cloning into 'repository'
(...)
$ cd repository
$ git remote -v
origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (fetch)
origin ext::ssh -i $HOME/.ssh/alternate_id git.example.com %S /path/to/repository.git (push)

Я считаю это решение превосходным, потому что:

  • Это репозиторий / удаления конкретных
  • Избегайте оберток скрипт bloat
  • Не нужно SSH агент – полезно, если вы хотите клонов /push/pulls без присмотра (e. g. in cron)
  • Определенно, внешний инструмент не нужен.
17
17
17
2015-05-28 17:09:40 +0000

После моей борьбы с $GIT_SSH я хотел бы поделиться тем, что работало для меня.

На моих примерах я буду считать, что ваш личный ключ находится на /home/user/.ssh/jenkins

Ошибка, которую следует избегать: GIT_SSH значение включает опции

$ export GIT_SSH="ssh -i /home/user/.ssh/jenkins"

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

Рабочий пример $GIT_SSH скрипта /home/user/gssh.sh

Скрипт будет вызван следующим образом:

$ $GIT_SSH [username@]host [-p <port>] <command>

Пример работы скрипта может выглядеть так:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins $*

Обратите внимание, что $* в конце, это важная часть скрипта.

Даже более безопасная альтернатива, которая предотвратит любые возможные конфликты с чем-либо в вашем файле конфигурации по умолчанию (плюс явное упоминание используемого порта) будет:

#!/bin/sh
ssh -i /home/user/.ssh/jenkins -F /dev/null -p 22 $*

Предположив, что скрипт находится в /home/user/gssh.sh, вы должны:

$ export GIT_SSH=/home/user/gssh.sh

и все должно работать.

7
7
7
2013-03-23 01:35:15 +0000

Вы можете просто использовать ssh-ident вместо того, чтобы создавать свою собственную обертку.

Вы можете прочитать больше по ссылке: https://github.com/ccontavalli/ssh-ident

Загружает ssh ключи по требованию, когда это необходимо, один раз, даже с несколькими сеансами входа, xterms или NFS общими домами.

С помощью крошечного конфигурационного файла, он может автоматически загружать различные ключи и держать их разделенными в разных агентах (для переадресации агентов) в зависимости от того, что вам нужно сделать.

6
6
6
2018-03-26 19:26:38 +0000

У меня был клиент, которому нужен был отдельный счет на Гитубе. Поэтому мне нужно было использовать отдельный ключ только для этого проекта.

Моим решением было добавить его в мой .zshrc / .bashrc:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git $@"

Всякий раз, когда я хочу использовать git для этого проекта, я заменяю “infogit” на git:

infogit commit -am "Some message" && infogit push

Для меня это проще запомнить.

5
5
5
2018-12-04 22:21:13 +0000

Поэтому я установил переменную GIT_SSH env в $HOME/bin/git-ssh.

. Для поддержки того, чтобы моя конфигурация repo определяла, какой идентификатор ssh использовать, мой файл ~/bin/git-ssh такой:

#!/bin/sh
ssh -i $(git config --get ssh.identity) -F /dev/null -p 22 $*

. Тогда у меня есть глобальная настройка конфигурации git'а:

$ git config --global ssh.identity ~/.ssh/default_id_rsa

. И в любом git-репозитории я могу просто установить локальное значение ssh.identity git-конфигурации:

$ git config --local ssh.identity ~/.ssh/any_other_id_rsa

Voila!

Если вы можете иметь разные адреса электронной почты для каждого идентификатора, это становится ещё проще, потому что вы можете просто назвать свои ключи в соответствии с email-адресами, а затем с помощью git-конфигуратора user.email выбрать ключ в ~/bin/git-ssh следующим образом:

#!/bin/sh
ssh -i $HOME/.ssh/$(git config --get user.email) -F /dev/null -p 22 $*
3
3
3
2018-05-03 10:17:14 +0000

Я основываюсь на @shellholic и эта SO нить с несколькими тиками. Я использую GitHub в качестве примера и предполагаю, что у вас есть закрытый ключ в ~/.ssh/github (иначе смотрите этот SO-поток ) и что вы добавили открытый ключ в свой профиль GitHub (иначе смотрите справку GitHub’s help ).

При необходимости создайте новый конфигурационный файл SSH на ~/.ssh/config и измените разрешения на 400

Добавьте это в файл ~/.ssh/config:

touch ~/.ssh/config
chmod 600 ~/.ssh/config

Если у вас уже есть удалённая настройка, возможно, вы захотите удалить её, в противном случае у вас всё равно могут появиться запрос на имя пользователя и пароль:

Host github.com
    IdentityFile ~/.ssh/github
    IdentitiesOnly yes

Затем добавьте удалённый файл в git-репозиторий и обратите внимание на двоеточие перед именем пользователя:

git remote rm origin

, после чего команды git'а будут работать нормально, например. g.:

git remote add origin git@github.com:user_name/repo_name.git

@HeyWatchЭто в этот SO-поток предложил добавить IdentitiesOnly yes, чтобы предотвратить поведение SSH по умолчанию при отправке идентификационного файла, совпадающего с именем файла по умолчанию для каждого протокола. Дополнительные сведения и ссылки см. в этом потоке.

3
3
3
2015-12-05 12:22:32 +0000

Моим решением было следующее:

создать скрипт:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in $@;do
   case $i in
    --port=*)
        PORT="${i:7}";;
    --key=*)KEY="${i:6}";;
   esac
done
export GIT_SSH_COMMAND="ssh -i $HOME/.ssh/${KEY} -p ${PORT}"
echo Command: $GIT_SSH_COMMAND

, а затем, когда вам нужно изменить var run:

. ./thescript.sh [--port=] [--key=]

Не забудьте дополнительную точку!!! это делает скрипт устанавливать окружения vars!!! –key и –port необязательны.

3
3
3
2016-02-11 22:44:57 +0000

Обычно вы хотите использовать ~/.ssh/config для этого. Просто свяжите адреса серверов с ключами, которые вы хотите использовать для них следующим образом:

Host github.com
  IdentityFile ~/.ssh/id_rsa.github
Host heroku.com
  IdentityFile ~/.ssh/id_rsa.heroku
Host *
  IdentityFile ~/.ssh/id_rsa

Host * обозначает любой сервер, поэтому я использую его для установки ~/.ssh/id_rsa в качестве ключа по умолчанию.

2
2
2
2018-07-05 09:53:09 +0000

Просто используйте команды ssh-agent и ssh-add.

# create an agent
ssh-agent

# add your default key
ssh-add ~/.ssh/id_rsa

# add your second key
ssh-add ~/.ssh/<your key name>

После выполнения вышеуказанных команд вы можете использовать оба ключа одновременно. Для клонирования репозитория просто введите

git clone git@github.com:<yourname>/<your-repo>.git

.

Вы должны выполнить вышеприведенную команду после перезагрузки машины.

1
1
1
2019-08-31 05:43:47 +0000
# start :: how-to use different ssh identity files

    # create the company identity file
    ssh-keygen -t rsa -b 4096 -C "first.last@corp.com"
    # save private key to ~/.ssh/id_rsa.corp, 
    cat ~/.ssh/id_rsa.corp.pub # copy paste this string into your corp web ui security ssh keys

    # create your private identify file
    ssh-keygen -t rsa -b 4096 -C "me@gmail.com"
    # save private key to ~/.ssh/id_rsa.me, note the public key ~/.ssh/id_rsa.me.pub
    cat ~/.ssh/id_rsa.me.pub # copy paste this one into your githubs, private keys

    # clone company internal repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@git.in.corp.com:corp/project.git

    export git_msg="my commit msg with my corporate identity, explicitly provide author"
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@corp.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # clone public repo as follows
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.corp -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git clone git@github.com:acoolprojectowner/coolproject.git

    export git_msg="my commit msg with my personal identity, again author "
    git add --all ; git commit -m "$git_msg" --author "MeFirst MeLast <first.last@gmail.com>"
    GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa.me -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no" \
    git push ; 
    # and verify 
    clear ; git log --pretty --format='%h %ae %<(15)%an ::: %s

    # stop :: how-to use different ssh identity files
1
1
1
2019-01-07 18:26:23 +0000

Хотя вопрос не требует ответа, я включаю этот ответ для тех, кто ищет решение той же проблемы специально для gitlab .

Решение для gitlab

я пробовал использовать подход environmentment-variables , но даже gith-документация рекомендует использовать ~/.ssh/config для чего-нибудь большего, чем простой случай. В моём случае я нажимаю на gitlab сервер - и я хотел сделать это в качестве конкретного пользователя - что, конечно же, определяется приватная клавиша во время аутентификации , а не именем пользователя git. После реализации я просто выполняю следующее:

~/myrepo> git mycommit -m "Important Stuff"
~/myrepo> git mypush
[proceed to enter passphrase for private key...]

Настройка

Вспомните расположение вашей приватная клавиша /myfolder/.ssh/my_gitlab_id_rsa в моем случае.

Добавить запись в ~/.ssh/config:

Host gitlab-delegate
    HostName gitlab.mydomain.com
    User git
    IdentityFile /myfolder/.ssh/my_gitlab_id_rsa
    IdentitiesOnly yes

Добавить git-alias в ~/.gitconfig:

mypush = "!f() { \
           path=$(git config --get remote.origin.url | cut -d':' -f2); \
           branch=$(git rev-parse --abbrev-ref HEAD); \
           git remote add gitlab_as_me git@gitlab-delegate:$path && \
           git push gitlab_as_me $branch && \
           git pull origin $branch; \
           git remote remove gitlab_as_me; \
         }; f"

В качестве бонуса я выполняю свои коммиты на этом же хосте, что и конкретный пользователь с этим git-alias :

mycommit = "!f() { \
             git -c "user.name=myname" -c "user.email=myname@mysite.com" commit \"$@\"; \
           }; f"

Пояснения

Все вышеперечисленное предполагает, что соответствующим удаленным является origin, а соответствующая ветка в настоящее время проверена. Для справки я наткнулся на несколько пунктов, которые нужно адресовать:

  • Решение требует создания нового удаленного gitlab_as_me, и мне не понравилось видеть дополнительный удаленный болтается в дереве лога , поэтому я удалил его по окончании
  • Чтобы создать удаленный
  • Чтобы создать удаленный, есть необходимость сгенерировать url на лету - в случае gitlab это было достигнуто с помощью простого bash cut
  • При выполнении push to gitlab_as_me вам нужно уточнить, на какую ветку вы нажимаете
  • После выполнения push ваш локальный указатель origin должен быть “обновлен”, чтобы соответствовать gitlab_as_me (git pull origin $branch делает это)
1
1
1
2019-04-06 20:42:39 +0000

Когда у вас несколько учетных записей git'а и вы хотите разные ключи ssh

Вы должны следовать тому же шагу для генерации ключа ssh, но будьте уверены, что вы

ssh-keygen -t ed25519 -C "your-email-id@gmail.com"

Введите путь, который вы хотите сохранить(Ex: my-pc/Desktop/. ssh/ed25519)

Добавить открытый ключ к вашей gitlab Как добавить ключ ssh в gitlab )

Вы должны обновить идентификатор ssh с помощью приведённой ниже команды

ssh-add ~/my-pc/Desktop/.ssh/ed25519
0
0
0
2018-06-06 04:37:12 +0000

Я использую git версии 2.16, и мне не нужен ни один скрипт, даже конфигурация или изменённые команды.

  • Просто скопировал свой личный ключ в .ssh/id_rsa
  • установите права доступа в 600

И git читает ключ автоматически. Я ничего не спрашиваю и это не приводит к ошибке. Просто работает нормально.

0
0
0
2020-01-24 00:58:26 +0000

Если вам нужно подключиться к одному и тому же хосту с разными ключами, то этого можно добиться с помощью:

  1. Настройте ~/.ssh/config с разными хостами, но с одними и теми же именами хостов.
  2. Клонирование репо с помощью соответствующего хоста.

Пример:

~/.ssh/config

Затем instead клонирование вашего репо типа:

Host work
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa_work
 User git

Host personal
 HostName bitbucket.org
 IdentityFile ~/.ssh/id_rsa_personal
 User git

вы должны сделать

git clone git@bitbucket.org:username/my-work-project.git
git clone git@bitbucket.org:username/my-personal-project.git
```.