Укажите ключ SSH для нажатия git для заданного домена

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

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

Ответ 1

Даже если пользователь и хост одинаковы, их все еще можно отличить в ~/.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 [email protected]:whatever.git
git remote add bob [email protected]:whatever.git

Примечание

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

Ответ 2

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

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

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

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

git admin push 

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

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

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

#!/bin/bash
exec ssh ${SSH_KEYFILE+-i "$SSH_KEYFILE"} "[email protected]"

Шаг 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/

Ответ 3

Вы можете использовать переменную среды 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 и т.д.

Ответ 4

Одна система на основе Unix (Linux, BSD, Mac OS X), идентификатор по умолчанию хранится в каталоге $HOME/.ssh, в двух файлах: 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.

Ответ 5

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

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

Ответ 6

Я использую 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

Решение, предоставленное Джордано Скальцо, тоже велико. fooobar.com/questions/17366/...

Ответ 7

Если вы используете версию ssh для Windows Git, строка идентификационного файла в конфигурации ssh выглядит как

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

где /c для c:

Чтобы проверить, в Git bash do

cd ~/.ssh
pwd 

Ответ 8

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

Ответ 9

Вы больше всего указали в файле конфигурации ключ 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

Ответ 10

Начиная с 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.