Ключи развертывания github: как авторизовать более одного репозитория для одной машины

Итак, у меня есть хозяин, позвони rob, Я использовал ssh-keygen на rob чтобы получить открытый ключ, который я дал github в окне добавления нового ключа развертывания для хранилища cheech, Теперь я хочу развернуть chong на rob также. Но если я пойду на экран добавления нового ключа развертывания для хранилища chong на GitHub, и вставьте открытый ключ, который я сгенерировал на rob это говорит key already in use, Я подумал, если бы они использовали ключ, я мог бы клонировать chong на rob но это говорит, что разрешение отказано.

Очевидно, что это сложнее, чем я думал, и включает несколько ключей или что-то в этом роде. Что я должен сделать, чтобы клонировать chong на rob?

Спасибо за помощь.

9 ответов

После того, как ключ был прикреплен к одному репо в качестве ключа развертывания, его нельзя использовать в другом репо. Если вы столкнулись с этой ошибкой при настройке ключей развертывания, вам нужно будет изменить свой пульт и настроить свой~/.ssh/config файл, в котором будет использоваться несуществующее имя хоста github.com, которое ssh сможет использовать для выбора правильного ключа развертывания ssh для вашего хранилища.

# first we remove the origin
$ git remote -v
origin  git@github.com:username/foo.git (fetch)
origin  git@github.com:username/foo.git (push)
$ git remote rm origin

# here we add a new origin using a host nickname called
# foo.github.com that we will reference with a Host stanza in our
# ~/.ssh/config to specify which key to use with which fake hostname.
$ git remote add origin git@fake-hostname-foo.github.com:username/foo.git
$ git remote -v
origin  git@fake-hostname-foo.github.com:username/foo.git (fetch)
origin  git@fake-hostname-foo.github.com:username/foo.git (push)

Сгенерируйте ключ развертывания для своего репозитория и назовите его как-нибудь так:

$ ssh-keygen -t rsa -f ~/.ssh/id_rsa-foo -C https://github.com/username/foo
Generating public/private rsa key pair.
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/username/.ssh/id_rsa-foo.
Your public key has been saved in /home/username/.ssh/id_rsa-foo.pub.
The key fingerprint is:
c0:ff:ee:34:24:11:5e:6d:7c:4c:b1:a0:de:ad:be:ef https://github.com/username/foo
The key's randomart image is:
+--[ RSA 2048]----+
|  E   o..o.oo.   |
| M o o o .+CoW   |
|  + o = o. ..    |
| .   . +         |
|        S        |
|       o .       |
|        +        |
|       . o       |
|        ..o.     |
+-----------------+

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

Host fake-hostname-foo.github.com
    Hostname github.com
    IdentityFile ~/.ssh/id_rsa-foo

Теперь вы можете проверить это с:

$ ssh -T git@fake-hostname-foo.github.com
Hi username! You've successfully authenticated, but GitHub
does not provide shell access.

Самое простое решение, которое я нашел, было изложено здесь.

1) Введите эту команду (вы сделаете это для любого необходимого вам количества ключей):

ssh-keygen -t rsa -C "your_email@example.com"

2) При появлении запроса с приведенным ниже оператором введите уникальное имя (например,foo1_rsa). Файл будет создан в вашем текущем каталоге, и вам может потребоваться переместить его в.ssh, если вы хотите быть аккуратным:

Введите файл для сохранения ключа (/Users/you/.ssh/id_rsa): [Нажмите enter]

3) Обновите ваш конфигурационный файл SSH:

vi ~ /.ssh / config

Который может быть пустым:

Host cheech github.com
Hostname github.com
IdentityFile ~/.ssh/foo1_rsa

Host chong github.com
Hostname github.com
IdentityFile ~/.ssh/foo2_rsa

Как указывали другие, ключи развертывания уникальны. На данный момент лучший подход - это псевдоним ssh.config, но я нашел более чистый способ:

Это можно сделать, настроив GIT_SSH_COMMAND. Поскольку ssh.config получает только хост, вам нужно создать псевдонимы для обработки разных путей. В качестве альтернативы, поскольку git CLI отправляет путь репо в GIT_SSH_COMMAND, вы можете перехватить запрос в настраиваемом скрипте, добавленном между git и ssh.

Вы можете создать решение, в котором вы извлекаете путь и добавляете связанный файл удостоверений, если он доступен на сервере.

Один из подходов к этому можно найти здесь.

Применение:

cp deploy_key_file ~/.ssh/git-keys/github-practice
GIT_SSH_COMMAND=custom_keys_git_ssh git clone git@github.com:github/practice.git

Вы можете определить GIT_SSH_COMMAND=custom_keys_git_ssh глобально, и вам нужно только добавить ключевые файлы в ~/.ssh/git-keys/ папка.

Я знаю, что этому больше 5 лет, но нет общепринятого ответа на этот популярный вопрос, поэтому вот что я считаю лучшим способом, учитывая чистоту и читабельность в будущем:


ДОБАВИТЬ DEPLOY ПОЛЬЗОВАТЕЛЯ В ВАШУ КОМАНДУ

Шаг 1. Создайте новый адрес электронной почты в домене вашей организации для нового пользователя развертывания. Что-то вроде deploy@organisation.example.com.

Шаг 2: Используйте этот почтовый ящик для создания новой учетной записи GitHub ( GitHub называет этих "пользователей компьютеров"), дайте ему имя пользователя, например deploy-ExampleOrganisation, чтобы его роль была ясна.

Шаг 3: Создайте пользователя на вашем сервере с именем "deploy" с помощью команды, подобной этой:

useradd -d /home/deploy -m deploy

Сгенерируйте ключ SSH для deploy @ servername, указав без пароля и /home/deploy/.ssh/id_rsa в качестве расположения файла:

ssh-keygen -t rsa -b 4096 -C "deploy@servername"

Добавьте содержимое /home/deploy/.ssh/id_rsa.pub в качестве ключа SSH в новую учетную запись GitHub deploy-ExampleOrganisation: выберите "Настройки"> "Ключи SSH и GPG"> "Новый ключ SSH".

Шаг 4. Создайте команду в своей организации, которая называется "Развертывание пользователей только для чтения", добавьте в нее нового пользователя и предоставьте команде доступ на чтение к любым репозиториям, которые будут развернуты. (Если у вас нет учетной записи организации, вы можете предоставить этому пользователю доступ к нескольким закрытым репозиториям)

Шаг 5. Добавьте SSH-ключ своего личного компьютера для развертывания файла авторизованных ключей пользователя (/home/deploy/.ssh/authorized_keys), чтобы вы (или ваш сценарий развертывания) могли входить в систему как развертывание при развертывании кода.

Boom! Вот и все... Теперь у вас есть чистый и самодокументированный поток.


PS Я попробовал высоко оцененный ответ aculich, но это было грязно, возиться с фальшивыми именами хостов, и я подумал, что если я вернусь к этому через несколько лет, я собираюсь легко выяснить, что я сделал, чтобы создать все ключи и понять как этот файл конфигурации SSH заставляет работать эти забавные несуществующие удаленные адреса? Возможно нет!

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

  • Нет хаков! Это стандартные учетные записи пользователей с четкими именами, доступ к репо через реальные имена хостов.
  • Меньше ключей, плавающих вокруг.
  • Если / когда вы переходите на дополнительные серверы, вы легко можете назначить пользователю Deploy учетную запись на всех из них, и, просто добавив 1 новый ключ к его учетной записи GitHub, его учетная запись на новом сервере готова к развертыванию кода.
  • Развертывание пользователя имеет только привилегированный доступ только для чтения только к тем репозиториям, которые указаны в команде, а ваши личные SSH-ключи хранятся вне сервера, поэтому, если какой-нибудь злой человек получит доступ к вашему серверу, он не сможет нанести ущерб всем вашим репозиториям. также.
  • Файлы конфигурации инструмента развертывания (например, Capistrano) не загрязняются, так как содержат эти запутанные поддельные имена хостов. (Именно тогда, когда они начали распространяться за пределы сервера, мне действительно стало не по себе от этого метода.)
  • Если вы забудете, как, черт возьми, вы это сделали за годы, владение файлом приведет вас к пользователю развертывания. ls -la, ключ SSH приведет вас к имени учетной записи GitHub ssh -T git@github.com и, надеюсь, вы снова наберете скорость.
  • И наконец... это метод, рекомендованный GitHub.

Ключ развертывания для github уникален... Вы должны сгенерировать новый ключ для другого хранилища. Просто запустите ssh-keygen снова

Смотрите документацию по github: https://help.github.com/articles/managing-deploy-keys

Я не видел ни одного хорошего или простого ответа здесь, поэтому я решил добавить свое решение. Мне не нравятся ответы, когда вам нужно изменить имя домена, использовать сценарии-обертки, обойти с помощью связки ключей или возиться с файлами конфигурации.ssh. SSH - это всего лишь транспорт для git, поэтому я не хочу, чтобы мои важные ssh-папки и конфиги заполнялись хаком и настройками, чтобы использовать несколько ключей развертывания, которые когда-то меня не интересуют и будут иметь только один ключ на репо. Это должен быть git config - и это так.

Кроме того, почему бы не сохранить учетные данные в папке репозитория.git, чтобы при удалении папки репо вы удаляли ключ развертывания?

Предположим, что / tmp / deploy_key является начальным (временным) местоположением вашего личного ключа развертывания.

# Initial clone of repo    
GIT_SSH_COMMAND="ssh -i /tmp/deploy_key" git clone git@github.com:folder/reponame.git

# cd to the folder to assure we only change config for the repo instead of user/global.
cd reponame
# Could probably just mv instead of cp/chmod/rm the key but lets be precise
cp /tmp/deploy_key ./.git/deploy_key
chmod 600 ./.git/deploy_key
rm /tmp/deploy_key

# This is the magic - note the backslash escaping the $ as PWD is always the repo's
# folder when pulling or pushing etc... and at git (run) command time $PWD is the
# repo's root folder.
git config core.sshCommand "ssh -i \$PWD/.git/deploy_key"

Также вы можете, конечно, хранить ключ где-нибудь еще и использовать абсолютный путь без $PWD для ключа развертывания:-

# Initial clone of repo    
GIT_SSH_COMMAND="ssh -i /path/to/a/deploy_key" git clone git@github.com:folder/reponame.git
# cd to repo to configure only for this repo
cd reponame
git config core.sshCommand "ssh -i /path/to/a/deploy_key"

Но я предпочитаю хранить его во внутренних папках репозитория.git, поэтому, если я удаляю папку репо, я знаю, что нет никаких учетных данных, и в конце концов вы можете иметь только один репозиторий на ключ развертывания.

Если вам удобно давать rob доступ ко всем частным репозиториям в вашей учетной записи GitHub, вы можете удалить ключ в качестве ключа развертывания из cheech а затем добавьте его в качестве ключа SSH к вашей учетной записи GitHub в целом. Это дало бы rob доступ к обоим cheech а также chong,

Это не будет работать, если у вас есть другие репозитории в вашей учетной записи, которые вы не хотите rob для доступа.

Если вам нужен более точный контроль, вам нужно будет сгенерировать дополнительные ключи на rob и назначьте их в качестве ключей развертывания для определенных репозиториев.

Управление моими крошечными ключами развертывания GitHub может быть легко осуществлено npm модуль github-add-key. Он использует подход, описанный в этом замечательном ответе, и все, что вам нужно, это

$ github-add-key rob/chong

в вашем местном клонировании rob/chong и следуйте простому автоматизированному процессу.

Хотя идея Пимкина была великолепна, я не хотел устанавливать node только для этого, поэтому я создал нечто подобное в bash:

https://gist.github.com/blvz/8eeebacae11011c25fc79eff12f49ae9

Установите и используйте:

curl https://gist.githubusercontent.com/blvz/8eeebacae11011c25fc79eff12f49ae9/raw/6f2f7f3709a0fe852d8a3a5bb125325e3ffbc7d8/gh-deploy-clone.sh > /usr/local/bin/gh-deploy-clone
chmod +x /usr/local/bin/gh-deploy-clone

gh-deploy-clone user/repo

# You can also give it a name, in case
# you have multiple deploy targets:

gh-deploy-clone user/repo staging

Вы также можете создать оболочку ssh и передать ее как GIT_SSH, Эта опция имеет то преимущество, что вам не нужно менять git remote. /questions/29729136/git-klon-s-polzovatelskim-ssh-ispolzuya-oshibku-gitssh/29729164#29729164

Другие вопросы по тегам