Укажите ключ 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.