Вкажіть ключ SSH для git push для певного домену

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

(Крім того, гітоліт відрізняє, хто робить натискання на основі ключового слова, тому це не проблема, з точки зору доступу, власності та аудиту, що рядок користувача @ сервер ідентичний для різних користувачів.)

279
Тісно пов'язані: stackoverflow.com/questions/4565700/ …
додано Автор Ciro Santilli 包子露宪 六四事件 法轮功, джерело

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 [email protected]:whatever.git
git remote add bob [email protected]:whatever.git

Примітка

You want to include the option IdentitiesOnly yes to prevent the use of default ids. Otherwise, if you also have id files matching the default names, they will get tried first because unlike other config options (which abide by "first in wins") the IdentityFile option appends to the list of identities to try. See: https://serverfault.com/questions/450796/how-could-i-stop-ssh-offering-a-wrong-key/450807#450807

506
додано
Я використовую Windows з Git Bash. Для рядка ідентифікаційних файлів я пишу: IdentityFile ~ davey/.ssh/id_rsa.davey або IdentityFile c: \ Users \ davey \ .ssh \ id_rsa.davey ?
додано Автор David West, джерело
Не забудьте додати HostName до known_hosts: stackoverflow.com/questions/13363553/…
додано Автор rottenoats, джерело
Переконайтеся, що ви додали ключ до ssh , використовуючи ssh-add ~/.ssh/identity (Linux, Mac), в іншому випадку він не буде використовуватися, навіть якщо він вказаний у ідентифікаційному файлі.
додано Автор Tim, джерело
Чудово, спасибі. Я не зрозумів, що ви можете вільно вибирати "псевдонім" для специфікації хоста в ~/.ssh/config
додано Автор Confusion, джерело
Частина git @ на пульті не потрібна, як це вказано в рядку User config.
додано Автор dolmen, джерело
Ви можете використовувати github-keygen , щоб легко додати таку конфігурацію для Рахунки Github.
додано Автор dolmen, джерело
великий обхід !!! Я шукав рішення на віки.
додано Автор didando8a, джерело
Дякую вам за ясну і дуже корисну відповідь. Я намагався отримати це деякий час і відмовився від попереднього припущення, що одному і тому ж користувачеві довелося використовувати той же файл приватного ключа id_rsa.
додано Автор DrCord, джерело
Я боровся з цим рішенням, доки я не додавав інший рядок, що містить IdentitiesOnly yes відразу після рядка з IdentityFile для хоста. Схоже, що це проходило декілька ідентичностей, і один з них був заблокований доступом до хосту.
додано Автор Fitter Man, джерело
Дякую за цю відповідь! Одним з них для мене було те, що IdentityFile має бути повним шляхом (я лише поставив id_rsa.rick як мій аргумент на IdentityFile, і це не вдалося). Див. Скрипт ssh_config (5) для іншого синтаксису для IdentityFile.
додано Автор rickumali, джерело
Я постійно отримував помилку repository denied з командами git при роботі команд ssh. Додавання рядка IdentitiesOnly yes вирішило проблему.
додано Автор Justin Lau, джерело
працювати як чарівність.
додано Автор Gaurav, джерело

Альтернативний підхід до одного, запропонованого вище Марком Лонгайром , - це використання псевдоніму, який запускатиме будь-який git команда на будь-якому віддаленому, з альтернативним ключем SSH. Ідея полягає в тому, щоб змінити ідентифікатор SSH під час запуску команд git.

Переваги щодо підходу псевдонімування хоста в іншій відповіді:

  • Буде працювати з будь-якими git командами або псевдонімами, навіть якщо ви не можете точно вказати remote .
  • легше працювати з багатьма сховищами, оскільки вам потрібно встановити його лише один раз на клієнтську машину, а не раз на сховище на кожному клієнтському комп'ютері.

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

git admin push 

Щоб перейти до стандартного пульта, використовуючи альтернативний ("адміністратор") SSH-ключ. Знову ж таки, ви можете використовувати будь-яку команду (а не лише push ) з цим псевдонімом. Ви навіть можете зробити git admin clone ... для клонування сховища, що ви матимете доступ лише до використання вашого ключа "admin".

Step 1: Create the alternative SSH keys, optionally set a passphrase in case you're doing this on someone else's machine.

Step 2: Create a script called “ssh-as.sh” that runs stuff that uses SSH, but uses a given SSH key rather than the default:

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

Step 3: Create a script called “git-as.sh” that runs git commands using the given SSH key.

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

Step 4: Add an alias (using something appropriate for “PATH_TO_SCRIPTS_DIR” below):

# 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"

More details at: http://noamlewis.wordpress.com/2013/01/24/git-admin-an-alias-for-running-git-commands-as-a-privileged-ssh-identity/

53
додано
Дуже гарна відповідь. Не забудьте додати подвійні лапки біля $ @ -> "$ @" , щоб бути в безпеці.
додано Автор kevinarpe, джерело
@sinelaw Чи все ще працює? Я отримую дозвіл відхилено помилку постійно
додано Автор Alok Kumar, джерело

Ви можете використовувати змінну середовища 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 тощо.

18
додано
Повний документ знаходиться на сторінці git-scm.com/docs/git#git-codeGITSSHcode; проте потрібен recentish Gіt (> = 2.3. *).
додано Автор Christian Ulbrich, джерело
Дякуємо за просте рішення, яке не вимагає нічого, крім встановлення однієї змінної середовища.
додано Автор Noah Sussman, джерело

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

If you have another private key you want to use, for example $HOME/.ssh/deploy_key, you have to use ssh -i ~/.ssh/deploy_key ...

It is annoying. You can add the following lines in to your $HOME/.bash_profile : ssh-add ~/.ssh/deploy_key ssh-add ~/.ssh/id_rsa

Тому кожного разу, коли ви використовуєте ssh або git або scp (в основному ssh ), вам не потрібно скористайтеся опцією -i .

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

10
додано

Іншою альтернативою є використання ssh-ident, щоб керувати вашими ідентифікаціями ssh .

Він автоматично завантажує та використовує різні ключі на основі вашого поточного робочого каталогу, параметрів ssh та ін ... що означає, що ви можете легко мати робочий/каталог та приватний/каталог, які прозоро в кінцевому підсумку використовують різні ключі та ідентифікатори з ssh.

10
додано

Я використовую 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]/....

The solution provided by Giordano Scalzo is great too. https://stackoverflow.com/a/9149518/1738546

7
додано

Якщо ви використовуєте версію ssh git у вікнах, то виглядає лінія ідентифікації файлу у конфігурації ssh

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

where /c is for c:

Щоб перевірити, в GIT's Bash робити

cd ~/.ssh
pwd 
3
додано

You might need to remove (or comment out) default Host configuration .ssh/config

2
додано