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

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

Advertisement

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

-i identity_file

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

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

Advertisement
Advertisement

Ответы (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
Advertisement
122
122
2015-01-23 22:08:00 +0000
Advertisement

Существует нет 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
Advertisement
22
22
2016-05-17 15:03:09 +0000
Advertisement

Используйте пользовательскую конфигурацию хоста в ~/.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
Advertisement
17
17
2015-05-28 17:09:40 +0000
Advertisement

После моей борьбы с $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
Advertisement
6
6
2018-03-26 19:26:38 +0000
Advertisement
-->

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

Моим решением было добавить его в мой .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
```.
Advertisement

Похожие вопросы

12
16
13
7
3
Advertisement