Как сообщить git, какой секретный ключ использовать?
ssh
имеет параметр -i
, чтобы указать, какой файл закрытого ключа использовать при аутентификации:
-i identity_file
Выбирает файл, из которого идентификатор (закрытый ключ) для аутентификации RSA или DSA считывается. », По умолчанию используется
~/.ssh/identity
для версии протокола 1, и~/.ssh/id_rsa
и~/.ssh/id_dsa
для версии протокола 2.â €, Идентификационные файлы также могут быть указаны на основе каждого узла в файле конфигурации. Возможно иметь несколько опций-i
(и несколько идентификаторов, указанных в файлах конфигурации).
Есть ли аналогичный способ сообщить git
, какой файл закрытого ключа использовать в системе с несколькими закрытыми ключами в каталоге ~/.ssh
?
14 ответов
В ~/.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
Переменная среды 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
Существует не 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
Напишите сценарий, который вызывает ssh
с необходимыми аргументами, и поместите имя файла сценария в $GIT_SSH
. Или просто поместите свою конфигурацию в ~/.ssh/config
.
Если вы не хотите указывать переменные окружения при каждом запуске 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)
- Определенно, никакого внешнего инструмента не требуется
После моей борьбы с $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
и все будет работать.
Используйте конфигурацию настраиваемого хоста в ~/.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
Вы можете просто использовать ssh-ident вместо создания собственной оболочки.
Вы можете узнать больше: https://github.com/ccontavalli/ssh-ident
Он загружает ключи ssh по требованию, когда это необходимо, один раз, даже при нескольких сеансах входа в систему, в xterms или в общих домах NFS.
С помощью крошечного файла конфигурации он может автоматически загружать разные ключи и сохранять их в разных агентах (для перенаправления агентов) в зависимости от того, что вам нужно делать.
У меня был клиент, которому нужна отдельная учетная запись 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
Для меня это легче запомнить.
Мое решение было следующим:
создать сценарий:
#!/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 являются необязательными.
Как правило, для этого нужно использовать ~/.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
в качестве используемого по умолчанию ключа.
Я строил на @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 по отправке файла идентификатора, соответствующего имени файла по умолчанию для каждого протокола. См. Этот поток для получения дополнительной информации и ссылок.
Я использую git версии 2.16, и мне не нужна ни одна сценарий, даже не конфигурация или измененные команды.
- Просто скопировал мой закрытый ключ в .ssh /id_rsa
- установить разрешения на 600
И git автоматически считывает ключ. Я ничего не прошу, и это не вызывает ошибки. Просто отлично работает.
Просто используйте команды 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
для подключения вашего репозитория.
Вам необходимо выполнить команду выше после перезагрузки компьютера.
Английский язык не мой родной язык; пожалуйста, извините ошибки ввода.