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


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

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

8 284

8 ответов:

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

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

преимущества по отношению к подходу псевдонима хоста в другом ответе:

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

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

git admin push 

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

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

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

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

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

#!/bin/bash
SSH_KEYFILE= 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/

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

Другой альтернативой является использование ssh-ident, чтобы управлять своими SSH-идентификаторами.

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

одна система на базе 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/.файл : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

так что каждый раз, когда вы используете ssh или git или scp (фактически ssh тоже), вы не должны использовать опцию

Я использую 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, а не просто "имя" или ref для вашего хоста. Например,

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

путь также может быть записан в /c / users/[имя_пользователя]/.... формат

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

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

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

здесь /c на c:

чтобы проверить, в bash Git может сделать

cd ~/.ssh
pwd 

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