ssh
имеет -i
возможность указать, какой файл закрытого ключа использовать при аутентификации:
-i identity_file
Выбирает файл, из которого читается идентификатор (закрытый ключ) для аутентификации RSA или DSA. По умолчанию используется
~/.ssh/identity
версия протокола 1~/.ssh/id_rsa
и~/.ssh/id_dsa
версия протокола 2. Файлы идентификации также могут быть указаны для каждого хоста в файле конфигурации. Можно иметь несколько-i
параметров (и несколько идентификаторов, указанных в файлах конфигурации).
Есть ли аналогичный способ сказать, git
какой файл закрытого ключа использовать в системе с несколькими закрытыми ключами в ~/.ssh
каталоге?
ssh
git
authentication
private-key
jrdioko
источник
источник
Ответы:
В
~/.ssh/config
добавьте:Теперь вы можете сделать
git clone git@github.com:username/repo.git
.ПРИМЕЧАНИЕ. Убедитесь, что разрешения для IdentityFile равны 400. SSH будет неявным образом отклонять слишком читаемые ключи SSH. Это будет выглядеть как отказ от полномочий. Решение в этом случае:
источник
HostName
: Указывает реальное имя хоста для входа в систему. Это можно использовать для указания псевдонимов или сокращений для хостов." Моя версия ssh - openssh-6.7p1.chmod 600 ~/.ssh/config
core.sshCommand
конфигурацию git. superuser.com/a/912281/162466Переменная среды
GIT_SSH_COMMAND
:Начиная с версии Git 2.3.0, вы можете использовать переменную окружения
GIT_SSH_COMMAND
следующим образом:Обратите внимание, что
-i
иногда это может быть изменено вашим конфигурационным файлом, и в этом случае вы должны дать SSH пустой конфигурационный файл, например так:Конфигурация
core.sshCommand
:Начиная с Git версии 2.10.0, вы можете настроить это для репо или глобально, так что вам больше не нужно устанавливать переменную окружения!
источник
export GIT_SSH_COMMAND="ssh -i ~/.ssh/id_rsa_example"
git clone example
example=hello /usr/bin/env | grep example
./dev/null
- это только допустимое имя файла в UNIX-подобных операционных системах, оно не работает в Windows.GIT_SSH_COMMAND
не работал , пока я не использовалIdentitiesOnly
, например, командой:GIT_SSH_COMMAND="ssh -i ~/.ssh/mysubdir/id_rsa -o 'IdentitiesOnly yes'" git push
.Там нет нет прямого способа сказать ,
git
который секретный ключ использовать, потому что она опирается наssh
для аутентификации в хранилище. Тем не менее, есть еще несколько способов достижения вашей цели:Опция 1:
ssh-agent
Вы можете использовать
ssh-agent
для временной авторизации вашего личного ключа.Например:
Вариант 2:
GIT_SSH_COMMAND
Передайте аргументы ssh, используя
GIT_SSH_COMMAND
переменную окружения (Git 2.3.0+).Например:
Вы можете напечатать все это в одной строке - игнорируйте
$
и пропустите\
.Вариант 3:
GIT_SSH
Передайте аргументы ssh, используя
GIT_SSH
переменную окружения, чтобы указать альтернативныйssh
двоичный файл.Например:
Примечание. Вышеуказанные строки являются командными строками оболочки (терминала), которые вы должны вставить в свой терминал. Они создадут файл с именем
ssh
, сделают его исполняемым и (косвенно) выполнят его.Примечание:
GIT_SSH
доступно с версии v0.99.4 (2005).Вариант 4:
~/.ssh/config
Используйте
~/.ssh/config
файл, как предложено в других ответах, чтобы указать местоположение вашего личного ключа, напримеристочник
$ ssh-agent sh -c 'ssh-add ~/.ssh/id_rsa; git fetch user@host'
работал для меня, когда больше ничего не будет. Престижность.~/.ssh/config
метод, env vars не работал для меня ...GIT_SSH
доступен начиная с версии 0.99.4 (август 2005 г.) , поэтому в основном существует с Git (апрель 2005 г.).Напишите скрипт, который вызывает
ssh
нужные аргументы, и укажите имя файла скрипта$GIT_SSH
. Или просто введите вашу конфигурацию~/.ssh/config
.источник
~/.ssh/config
Есть путь.$GIT_SSH
и скрипт решили эту проблему. Спасибо!Если вы не хотите указывать переменные окружения каждый раз, когда вы запускаете git, не хотите другой скрипт-обертку, не запускаете ssh-agent (1) и не хотите загружать другой пакет только для этого, используйте git -remote-ext (1) внешний транспорт:
Я считаю это решение превосходным, потому что:
источник
git
ресурс Chef использовал специфичные для репозитория ключи развертывания для клонирования / извлечения из частных репозиториев Github. Дополнительное преимущество этого метода по сравнению со средой / сценарием состоит в том, что, поскольку путь к ключу закодирован в конфигурации рабочего репозитория, он будет использовать один и тот же ключ как при первоначальном клонировании, так и при последующих выборках / толчках..ssh/config
и т. Д. +1!ext
транспорт в каждом подмодуле, чтобы рекурсия в родительском работала.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 позволяют злоумышленнику запросить у клиента выборку произвольных URL-адресов git. hackerone.com/reports/104465Используйте пользовательскую конфигурацию хоста
~/.ssh/config
, например:затем используйте свое собственное имя хоста следующим образом:
источник
Host work.github.com
HostName github.com
IdentityFile ~/.ssh/work
, а затем заменить «github.com» на «work.github.com» всякий раз, когда я клонирую рабочий репозиторий. Он по-прежнему подключается к «github.com», но использует пару ключей не по умолчанию.~/.ssh/config
файл. В каждом другом ответе не указывается, как вы можете установить хост при добавлении источника, что автоматически позволяет git использовать правильный файл ключа. БЛАГОДАРЮ ВАС!!После моей борьбы
$GIT_SSH
я хотел бы поделиться тем, что сработало для меня.На моих примерах я предполагаю, что у вас есть личный ключ, расположенный по адресу
/home/user/.ssh/jenkins
Ошибка, которую следует избегать: значение GIT_SSH включает опции
или что-то подобное не удастся, так как git попытается выполнить значение в виде файла . По этой причине вы должны создать скрипт.
Рабочий пример сценария $ GIT_SSH
/home/user/gssh.sh
Сценарий будет вызываться следующим образом:
Пример работы скрипта может выглядеть так:
Обратите внимание
$*
на в конце, это важная часть этого.Еще более безопасная альтернатива, которая предотвратит любой возможный конфликт с чем-либо в вашем конфигурационном файле по умолчанию (плюс явное упоминание используемого порта):
Предполагая, что сценарий включен
/home/user/gssh.sh
, вы должны:и все будет работать.
источник
Вы можете просто использовать ssh-идент вместо создания своей собственной оболочки.
Вы можете прочитать больше на: https://github.com/ccontavalli/ssh-ident
Он загружает ssh-ключи по требованию при первой необходимости, один раз, даже с несколькими сеансами входа в систему, xterms или общими домами NFS.
С крошечным файлом конфигурации он может автоматически загружать разные ключи и хранить их разделенными в разных агентах (для переадресации агентов) в зависимости от того, что вам нужно сделать.
источник
У меня был клиент, которому нужна была отдельная учетная запись на github. Поэтому мне нужно было использовать отдельный ключ только для этого проекта.
Моим решением было добавить это в мой .zshrc / .bashrc:
Всякий раз, когда я хочу использовать git для этого проекта, я заменяю "infogit" на git:
Для меня это легче запомнить.
источник
Поэтому я установил переменную env GIT_SSH в
$HOME/bin/git-ssh
.Для поддержки того, чтобы моя конфигурация репозитория диктовала, какую идентификационную информацию ssh использовать, мой
~/bin/git-ssh
файл таков:Тогда у меня есть глобальная настройка git config:
И в любом git-репозитории я могу просто установить локальное
ssh.identity
значение git config:Вуаля!
Если вы можете иметь разные адреса электронной почты для каждой личности, это становится еще проще, потому что вы можете просто назвать свои ключи после своих адресов электронной почты, а затем использовать user.email из git config для выбора ключа
~/bin/git-ssh
следующим образом:источник
Мое решение было таким:
создать скрипт:
затем, когда вам нужно изменить запуск var:
Не забывайте лишнюю точку! это заставляет скрипт устанавливать окружение vars !! --key и --port не обязательны.
источник
Как правило, вы хотите использовать
~/.ssh/config
для этого. Просто соедините адреса серверов с ключами, которые вы хотите использовать для них, следующим образом:Host *
обозначает любой сервер, поэтому я использую его, чтобы установить~/.ssh/id_rsa
в качестве ключа по умолчанию для использования.источник
Я основываюсь на @shellholic и этой ТАКОЙ ветке с несколькими тиками. Я использую GitHub в качестве примера и предполагаю, что у вас есть закрытый ключ
~/.ssh/github
(в противном случае см. Эту ветку SO ), и что вы добавили открытый ключ в свой профиль GitHub (в противном случае см. Справку GitHub ).При необходимости создайте новый файл конфигурации SSH
~/.ssh/config
и измените разрешения на 400Добавьте это в
~/.ssh/config
файл:Если у вас уже есть удаленная настройка, вы можете удалить ее, в противном случае вам все равно может быть предложено ввести имя пользователя и пароль:
Затем добавьте пульт в репозиторий git и обратите внимание на двоеточие перед именем пользователя:
И тогда команды git работают нормально, например:
@HeyWatchЭто в этой теме SO предлагает добавить,
IdentitiesOnly yes
чтобы предотвратить поведение SSH по умолчанию при отправке файла идентификации, соответствующего имени файла по умолчанию для каждого протокола. Смотрите эту ветку для получения дополнительной информации и ссылок.источник
Просто используйте
ssh-agent
иssh-add
команды.После выполнения вышеуказанных команд вы можете использовать обе клавиши одновременно. Просто введите
клонировать ваш репозиторий.
Вы должны выполнить вышеуказанную команду после перезагрузки компьютера.
источник
Я использую git версии 2.16, и мне не нужен ни один фрагмент скрипта, даже конфигурация или измененные команды.
И Git читает ключ автоматически. Я ничего не спрашиваю, и это не выдает ошибку. Просто отлично работает.
источник
~/.ssh
каталоге»?Хотя вопрос не требует этого, я включаю этот ответ для всех, кто хочет решить эту проблему специально для gitlab .
Гитлаб раствор
Я попытался использовать подход с переменными окружения , но даже в документации git рекомендуется использовать
~/.ssh/config
что-то большее, чем простой случай. В моем случае я отправляю на сервер gitlab - и я хотел сделать это как определенный пользователь - который, конечно, определяется закрытым ключом во время аутентификации, а не именем пользователяgit
. После внедрения я просто выполняю следующее:Настроить
Вспомните расположение вашего личного ключа
/myfolder/.ssh/my_gitlab_id_rsa
в моем случае.Добавить запись в
~/.ssh/config
:Добавьте псевдоним в
~/.gitconfig
:В качестве бонуса я выполняю свои коммиты на этом же хосте как определенный пользователь с этим git-псевдонимом :
объяснение
Все вышеперечисленное предполагает, что соответствующий удаленный узел
origin
и соответствующая ветвь в настоящее время извлечены. Для справки я столкнулся с несколькими пунктами, которые необходимо было решить:gitlab_as_me
, и мне не нравилось видеть, как лишний пульт висит в дереве журналов, поэтому я удаляю его, когда закончуgitlab_as_me
вам, вы должны четко указать, какую ветку вы толкаетеorigin
указатель должен быть «обновлен», чтобы соответствоватьgitlab_as_me
(этоgit pull origin $branch
делает)источник
Введите путь, который вы хотите сохранить (например: my-pc / Desktop / .ssh / ed25519)
Добавьте открытый ключ к вашему gitlab ( Как добавить ключ ssh в gitlab )
источник
источник