Как сообщить git, какой секретный ключ использовать?

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

  

-i identity_file

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

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

459 голосов | спросил jrdioko 12 Jpm1000000pmWed, 12 Jan 2011 21:20:31 +030011 2011, 21:20:31

14 ответов


511

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

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

Теперь вы можете сделать git clone [email protected]:username/repo.git.

ПРИМЕЧАНИЕ. Убедитесь, что разрешения для IdentityFile равны 400.SSH неявно отвергает ключи SSH, которые являются слишком читаемыми. Это будет выглядеть как отказ от удостоверения. Решение в этом случае:

chmod 400 ~/.ssh/id_rsa_github
ответил shellholic 12 Jpm1000000pmWed, 12 Jan 2011 22:36:21 +030011 2011, 22:36:21
209

Переменная среды GIT_SSH_COMMAND:

Из Git версии 2.3.0 вы можете использовать переменную окружения 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

Конфигурация core.sshCommand:

Из Git версии 2.10.0 вы можете настроить это для каждого репо или глобально, поэтому вам больше не нужно устанавливать переменную окружения!

git config core.sshCommand "ssh -i ~/.ssh/id_rsa_example -F /dev/null"
git pull
git push
ответил Flimm 8 Maypm15 2015, 12:43:07
63

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

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

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

Например:

$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch [email protected]'

Вариант 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 [email protected]

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

Вариант 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 [email protected]

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

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

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

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

Host github.com
  User git
  Hostname github.com
  IdentityFile ~/.ssh/id_rsa
ответил kenorb 24 Jam1000000amSat, 24 Jan 2015 01:08:00 +030015 2015, 01:08:00
32

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

ответил Ignacio Vazquez-Abrams 12 Jpm1000000pmWed, 12 Jan 2011 21:25:51 +030011 2011, 21:25:51
15

Если вы не хотите указывать переменные окружения при каждом запуске 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)

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

  • Это репозиторий /удаленный специфический
  • Избегайте разрастания сценария оболочки
  • Не нужен агент SSH - полезно, если вы хотите использовать неавтоматизированные клоны /push /pulls (например, в cron)
  • Определенно, никакого внешнего инструмента не требуется
ответил flaviovs 21 J000000Tuesday15 2015, 22:44:50
14

После моей борьбы с $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 [[email protected]]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

и все будет работать.

ответил Jan Vlcinsky 28 Maypm15 2015, 20:09:40
7

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

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

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

git remote add thuc [email protected]:your-repo.git  
ответил thucnguyen 17 Maypm16 2016, 18:03:09
5

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

Вы можете узнать больше:    https://github.com/ccontavalli/ssh-ident

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

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

ответил rabexc 23 MaramSat, 23 Mar 2013 05:35:15 +04002013-03-23T05:35:15+04:0005 2013, 05:35:15
3

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

Мое решение состояло в том, чтобы добавить это в мой .zshrc /.bashrc:

alias infogit="GIT_SSH_COMMAND=\"ssh -i ~/.ssh/id_specialkey\" git [email protected]"

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

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

Для меня это легче запомнить.

ответил Michael Cole 26 MarpmMon, 26 Mar 2018 22:26:38 +03002018-03-26T22:26:38+03:0010 2018, 22:26:38
2

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

создать сценарий:

#!/bin/bash
KEY=dafault_key_to_be_used
PORT=10022 #default port...
for i in [email protected];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:

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

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

ответил Salsicha 5 SatEurope/Moscow2015-12-05T15:22:32+03:00Europe/Moscow12bEurope/MoscowSat, 05 Dec 2015 15:22:32 +0300 2015, 15:22:32
2

Как правило, для этого нужно использовать ~/.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 в качестве используемого по умолчанию ключа.

ответил Zaz 12 FebruaryEurope/MoscowbFri, 12 Feb 2016 01:44:57 +0300000000amFri, 12 Feb 2016 01:44:57 +030016 2016, 01:44:57
0

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

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

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

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

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

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

git remote rm origin

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

git remote add origin [email protected]:user_name/repo_name.git

И тогда команды git работают нормально, например:

git push origin master
git pull origin 

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

ответил mmorin 3 Maypm18 2018, 13:17:14
0

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

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

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

ответил RedPrajapati 6 J0000006Europe/Moscow 2018, 07:37:12
0

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

# create a agent
ssh-agent

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

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

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

git clone [email protected]:<yourname>/<your-repo>.git

для подключения вашего репозитория.

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

Английский язык не мой родной язык; пожалуйста, извините ошибки ввода.

ответил Jinmiao Luo 5 J000000Thursday18 2018, 12:53:09

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

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132