Укажите ключ SSH для git push для данного домена - PullRequest
315 голосов
/ 28 октября 2011

У меня есть следующий вариант использования: я хотел бы иметь возможность нажать на git@git.company.com:gitolite-admin, используя закрытый ключ пользователя gitolite-admin, в то время как я хочу нажать на git@git.company.com:some_repo, используя «мой собственный» закрытый ключ.AFAIK, я не могу решить эту проблему, используя ~/.ssh/config, потому что имя пользователя и имя сервера идентичны в обоих случаях.Поскольку я в основном использую свой собственный закрытый ключ, он определен в ~/.ssh/config для git@git.company.com.Кто-нибудь знает способ переопределения ключа, который используется для одного git вызова?

(Кроме того: gitolite различает, кто выполняет нажатие, основываясь на ключе, так что это не проблема, с точки зрениядоступа, владения и аудита, что строка user @ server одинакова для разных пользователей.)

Ответы [ 10 ]

553 голосов
/ 28 октября 2011

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

Host gitolite-as-alice
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_rsa.alice
  IdentitiesOnly yes

Host gitolite-as-bob
  HostName git.company.com
  User git
  IdentityFile /home/whoever/.ssh/id_dsa.bob
  IdentitiesOnly yes

Тогда вы просто используете gitolite-as-alice и gitolite-as-bob вместо имени хоста в вашем URL:

git remote add alice git@gitolite-as-alice:whatever.git
git remote add bob git@gitolite-as-bob:whatever.git

Примечание

Вы хотите включить параметр IdentitiesOnly yes, чтобы запретить использование идентификаторов по умолчанию. В противном случае, если у вас также есть идентификаторы, совпадающие с именами по умолчанию, они будут опробованы в первую очередь, потому что, в отличие от других опций конфигурации (которые соблюдают «first in wins»), опция IdentityFile добавляет в список идентификаторов. пытаться. Смотри: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

54 голосов
/ 24 января 2013

Альтернативный подход к , предложенному выше Марком Лонгэйром , заключается в использовании псевдонима, который будет запускать команду any git, на any remote сальтернативный ключ SSH.Основная идея заключается в том, чтобы переключать вашу SSH-идентичность при выполнении команд git.

Преимущества относительно подхода псевдонима хоста в другом ответе:

  • Будет работать с any команды или псевдонимы git, даже если вы не можете указать remote явно.
  • Проще работать со многими репозиториями, потому что вам нужно настроить его только один раз для каждого клиентского компьютера, а не для каждого репозитория вкаждый клиентский компьютер.

Я использую несколько небольших скриптов и псевдоним git admin.Таким образом, я могу сделать, например:

git admin push 

Нажать на удаленный по умолчанию пульт с помощью альтернативного («admin») ключа SSH.Опять же, вы можете использовать любую команду (не только push) с этим псевдонимом.Вы даже можете сделать git admin clone ..., чтобы клонировать репозиторий, доступ к которому у вас будет только при использовании вашего ключа администратора.

Шаг 1: Создайте альтернативные ключи SSH, при желании установите фразу-парольв случае, если вы делаете это на чужой машине.

Шаг 2: Создайте скрипт с именем «ssh-as.sh», который запускает материал, который использует SSH, но использует данный SSHключ, а не по умолчанию:

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "$@"

Шаг 3: Создайте скрипт с именем «git-as.sh», который запускает команды git с использованием данного ключа SSH.

#!/bin/bash
SSH_KEYFILE=$1 GIT_SSH=${BASH_SOURCE%/*}/ssh-as.sh exec git "${@:2}"

Шаг 4: Добавьте псевдоним (используя что-то подходящее для «PATH_TO_SCRIPTS_DIR» ниже):

# Run git commands as the SSH identity provided by the keyfile ~/.ssh/admin
git config --global alias.admin \!"PATH_TO_SCRIPTS_DIR/git-as.sh ~/.ssh/admin"

Подробнее на: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

37 голосов
/ 13 мая 2017

Вы можете использовать переменную окружения git GIT_SSH_COMMAND. Запустите это в своем терминале под своим репозиторием git:

GIT_SSH_COMMAND='ssh -i ~/.ssh/your_private_key' git submodule update --init

Замените ~/.ssh/your_private_key на путь закрытого ключа ssh, который вы хотите использовать. И вы можете изменить последующую команду git (в примере это git submodule update --init) на другие, такие как git pull, git fetch и т. Д.

12 голосов
/ 05 июня 2016

Одна система на основе Unix (Linux, BSD, Mac OS X), удостоверение по умолчанию хранится в каталоге $ HOME / .ssh , в 2 файлах: private key: $HOME/.ssh/id_rsa public key: $HOME/.ssh/id_rsa.pub При использовании sshбез опции -i он использует закрытый ключ по умолчанию для аутентификации на удаленной системе.

Если у вас есть другой закрытый ключ, который вы хотите использовать, например, $ HOME / .ssh / deploy_key, вы должны использовать ssh -i ~/.ssh/deploy_key ...

Это раздражает.Вы можете добавить следующие строки в ваш $ HOME / .bash_profile : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

Поэтому каждый раз, когда вы используете ssh или git или scp (в основном ssh тоже), вам больше не нужно использовать опцию -i.

Вы можете добавить в файл столько ключей, сколько захотите $ HOME / .bash_profile .

10 голосов
/ 02 января 2014

Другой альтернативой является использование ssh-identifier для управления вашими ssh-удостоверениями .

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

9 голосов
/ 18 сентября 2014

Я использую Git Bash на Win7. Следующее сработало для меня.

Создайте файл конфигурации в ~ / .ssh / config или в c: / users / [your_user_name] /. Ssh / config. В файле введите:

Host your_host.com
     IdentityFile [absolute_path_to_your_.ssh]\id_rsa

Я полагаю, что хост должен быть URL-адресом, а не просто именем или ссылкой для вашего хоста. Например,

Host github.com
     IdentityFile c:/users/[user_name]/.ssh/id_rsa

Путь также можно записать в / c / users / [user_name] / .... format

Отличное решение от Джордано Скальцо. https://stackoverflow.com/a/9149518/1738546

3 голосов
/ 28 октября 2017

Возможно, вам придется удалить (или закомментировать) конфигурацию хоста по умолчанию .ssh/config

3 голосов
/ 20 августа 2014

При использовании sit-версии Git для Windows строка файла идентификации в конфигурации ssh выглядит следующим образом:

IdentityFile /c/Users/Whoever/.ssh/id_rsa.alice

, где /c для c:

.git's bash do

cd ~/.ssh
pwd 
2 голосов
/ 10 июня 2019

Начиная с git 2.10 и выше, также можно использовать параметр gitconfig sshCommand. Состояние документов :

Если эта переменная установлена, git fetch и git push будут использовать указанную команду вместо ssh, когда им необходимо подключиться к удаленной системе.Команда находится в той же форме, что и переменная среды GIT_SSH_COMMAND, и переопределяется, когда установлена ​​переменная среды.

Пример использования: git config core.sshCommand "ssh -i ~/.ssh/[insert_your_keyname]

В некоторых случаяхне работает, потому что ssh_config переопределяет команду, в этом случае попробуйте ssh -i ~/.ssh/[insert_your_keyname] -F /dev/null, чтобы не использовать ssh_config.

1 голос
/ 26 января 2019

вы больше всего указали в файле конфигурации ключ ssh:

# Default GitHub user
Host one
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-one
 IdentitiesOnly yes

#two user
Host two
 HostName gitlab.com
 User git
 PreferredAuthentications publickey
 IdentityFile ~/.ssh/key-two
 IdentitiesOnly yes
...