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


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

-i identity_file

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

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


461
2018-01-12 18:20


Источник


Видеть этот вопрос в StackOverflow также. - Flimm
Также связанные serverfault.com/questions/194567/... - Machavity


Ответы:


В ~/.ssh/config, Добавить:

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

Теперь вы можете сделать git clone git@github.com:username/repo.git,

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

chmod 400 ~/.ssh/id_rsa_github

512
2018-01-12 19:36



Что делать, если вам нужно подключиться к одному и тому же хосту с разными ключами? - Valentin Klinghammer
@Quelltextfabrik - вы можете добавить другой раздел с другим хостом: nerderati.com/2011/03/... - Ben Challenor
@Cliff Nop, на моей странице:HostName: Указывает имя реального хоста для входа в систему. Это можно использовать для указания псевдонимов или сокращений для хостов. «Моя версия ssh - openssh-6.7p1. - Grissiom
@Grissiom Это именно то, что он говорит. Но вы, кажется, понимаете смысл в обратном направлении. Требуется хост (или матч). Чтобы создать ник хоста, вы помещаете ник в строку Host и реальное имя хоста в строку HostName. Примеры: saltycrane.com/blog/2008/11/... - Cliff
Если файл конфигурации является новым, не забудьте сделать chmod 600 ~/.ssh/config - elysch


Переменная среды 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

212
2018-05-08 09:43



Мне пришлось экспортировать оболочка переменную переменной окружения, чтобы сделать эту работу, т.е. export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example", тогда git clone example - Abdull
@Abdull В Bash выполнение задания в той же строке, что и команда, экспортирует переменную окружения только для этой команды. Попробуй: example=hello /usr/bin/env | grep example, - Flimm
все стало еще лучше: с Git 2.10 вы можете сохранить команду в своей конфигурации Git: stackoverflow.com/a/38474220/520162 - eckes
@Noitidart /dev/null является только допустимым именем файла в UNIX-подобных операционных системах, он не работает в Windows. - Flimm
Если вам нужно несколько ключей, параметр -i может быть повторен, и ssh будет пытаться каждый ключ по очереди. git config core.sshcommand "ssh -i /path/to/keyA -i /path/to/keyB", Это позволяет git использовать разные ключи с разными удаленными хостами. - Mark


Там есть нет непосредственный путь рассказать 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

62
2018-01-23 22:08



//, Что делать, если ваша личность в ssh-agent пересылается, хотя, как в этом вопросе? superuser.com/questions/971732/... - Nathan Basanese
Я разрешил мне переформатировать этот пост: IMO это, безусловно, самый полный ответ. В своем оригинальном дизайне быстрое сканирование предложило сообщение, в котором описывается одно сложное решение проблемы, поэтому я пропустил его. - Alberto
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host' работал на меня, когда ничего другого не было. Престижность. - Daniel Dewhurst
Мне пришлось использовать ~/.ssh/config метод, env vars не работал для меня ... - Greg Dubicki
GIT_SSH с тех пор v0.99.4 (август 2005 г.), так что в основном с Git существует (апрель 2005 г.). - Dominik


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


32
2018-01-12 18:25



Другое объяснение как это сделать. - Sithsu
~/.ssh/config Является  путь. - hek2mgl
Я работаю на машине (A), с которой я нажимаю на сервер (B), который принимает только аутентификацию ssh-ключа. Хотя моя настройка ~ / .ssh / config на (A) отлично работает, когда я работаю напрямую на эта машина, это не когда я вхожу из какого-либо другого места (C). С помощью $GIT_SSH и сценарий решил эту проблему. Благодаря! - bsumirak


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

14
2017-07-21 19:44



//, Отличное решение. Интересно, однако, если это позволит указать идентификатор, пройденный с помощью перенаправления агентов. Большинство моих ключей не являются локальными для серверов, на которых я их использую. Я спросил об этом здесь: superuser.com/questions/971732/... - Nathan Basanese
Ответ касается только способа указания произвольных командных строк, которые будут использоваться в качестве репозиториев git. ИМХО, вы должны попытаться разобраться в своей проблеме, сначала используя ssh (например, «ssh хозяин«должен подключиться с помощью правой клавиши). Однако я постараюсь предоставить дополнительную информацию по вашему другому вопросу. - flaviovs
Этот ответ был именно тем, что мне нужно было, чтобы заставить шеф-повара git ресурс для использования ключей развертывания конкретного хранилища для клонирования / извлечения из частных репозиториев Github. Дополнительным преимуществом этого метода над основами среды / сценария является то, что, поскольку ключ-путь закодирован в конфигурации рабочего-репо, он будет использовать тот же ключ как для начального клонирования, так и для последующих наборов / нажатий. - Adam Franco
ВАУ! Это просто здорово, не знал об этом. Спасибо за ответ, весьма полезный и в марионеточных средах, чтобы избежать лишних хлопот .ssh/config и т.д. +1! - gf_
Если вы столкнулись со следующей ошибкой fatal: transport 'ext' not allowed, вы должны белить белый протокол ext через export GIT_ALLOW_PROTOCOL=ext, В основном, удаленный помощник git-remote-ext (который поддерживает URL-адреса ext :: ssh example.com% S foo / repo) позволяет выполнять произвольную команду. Это обычно не вызывает беспокойства, потому что пользователь всегда видит и доверяет URL-адресу, который они передают git. Однако git-подмодули через файл .gitmodules позволяют злоумышленнику запрашивать у клиента выборки произвольных git-адресов. hackerone.com/reports/104465 - Gomino


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

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


13
2018-05-28 17:09



Благодарю. Просто обратите внимание: используйте «$ @» вместо $ * для аргументов pass-thru, поскольку прежний ведет себя правильно, когда аргументы содержат пробелы. - Piotr Findeisen
@PiotrFindeisen Спасибо за ваше примечание. Тем не менее, я не понимаю его полностью - в zsh это помогает мне держать строки с пространством в одном куске, но в bash нет. Можете ли вы рассказать мне больше или указать на какое-то объяснение? Я не хочу добавлять некоторые изменения вслепую. - Jan Vlcinsky
Вы должны удалить первую половину своего ответа. Никто не заинтересован в решении, которое не работает, и оно пропадает, читая, что затуманивает правильный ответ внизу, который прекрасно работает. - Cerin
@Cerin Если вы хотите удалить «Ошибка, чтобы избежать», я собираюсь сохранить ее там. Он разделяет общую ловушку, чтобы ее избежать, и она очень короткая. Я уверен, кто-то попытается оптимизировать решение, предоставив все вещи переменной (это случилось со мной), поэтому я попытался сократить путь к успеху. - Jan Vlcinsky


Использовать настраиваемую конфигурацию хоста ~/.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  

6
2018-05-17 15:03



Это тот ответ, который я искал, поскольку у меня есть отдельные учетные записи GitHub для дома и работы. Мне просто нужно было установить Host work.github.com  HostName github.com  IdentityFile ~/.ssh/work, а затем замените «github.com» на «work.github.com» всякий раз, когда я клонирую рабочий репозиторий. Он по-прежнему подключается к «github.com», но использует пару ключей по умолчанию. - Mikkel
URL-адрес для подробностей ("itblog.study.land / ...») больше не работает :( - Carl Smotricz


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

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

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

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


5
2018-03-23 01:35