Приведение в форму
Чтобы управлять git-репо под отдельной учетной записью github / bitbucket / любой другой, вам просто нужно сгенерировать новый ключ SSH.
Нопрежде чем мы сможем начать выдвигать / извлекать репозитории с вашим вторым удостоверением личности, мы должны привести вас в форму - давайте предположим, что ваша система настроена с типичной парой ключей id_rsa
и id_rsa.pub
.Прямо сейчас ваш tree ~/.ssh
выглядит следующим образом
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── id_rsa
└── id_rsa.pub
Во-первых, назовите эту пару ключей - добавление описательного имени поможет вам вспомнить, какой ключ используется для какого пользователя / удаленного
# change to your ~/.ssh directory
$ cd ~/.ssh
# rename the private key
$ mv id_rsa github-mainuser
# rename the public key
$ mv id_rsa.pub github-mainuser.pub
Далее, давайте сгенерируем новую пару ключей - здесь я назову новый ключ github-otheruser
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/github-otheruser
Теперь, когда мы посмотрим на tree ~/.ssh
мы видим
$ tree ~/.ssh
/Users/you/.ssh
├── known_hosts
├── github-mainuser
├── github-mainuser.pub
├── github-otheruser
└── github-otheruser.pub
Далее нам нужно настроить файл ~/.ssh/config
, который будет определять наши ключевые конфигурации.Мы создадим его с надлежащими правами владельца на чтение / запись
$ (umask 077; touch ~/.ssh/config)
Откройте его в своем любимом редакторе и добавьте следующее содержимое
Host github.com
User git
IdentityFile <b>~/.ssh/github-mainuser</b>
Host github.com-otheruser
HostName github.com
User git
IdentityFile <b>~/.ssh/github-otheruser</b>
Предположительно, у вас будет несколько существующих репозиториев, связанных с вашим основным идентификатором github.По этой причине «по умолчанию» github.com Host
настроен на использование вашей клавиши mainuser
.Если вы не хотите отдавать предпочтение одной учетной записи другой, я покажу вам, как обновить существующих репозиториев в вашей системе, чтобы использовать обновленную конфигурацию ssh.
Добавьте новый ключ SSH в github
Перейдите на github.com / settings / keys , чтобы добавить свой новый общедоступный ключ
Вы можете получить содержимое открытого ключа, используя: скопируйте / вставьте его в github
$ cat ~/.ssh/github-otheruser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACAQDBVvWNQ2nO5...
Теперь все настройки вашего нового пользователя настроены - ниже мы покажем вам, как его использовать.
Подготовка к работе: клонирование репо
Так как же это работает вместе с git и github?Ну, потому что без курицы и яйца нельзя, мы посмотрим на клонирование существующего репо.Эта ситуация может относиться к вам, если у вас есть новая учетная запись github для вашего рабочего места, и вы были добавлены в проект компании.
Допустим, github.com/someorg/somerepo
уже существует, и вы были добавлены в него - клонирование так же просто, как
$ git clone <b>github.com-otheruser</b>:someorg/somerepo.git
То, что выделено жирным шрифтом часть должно соответствовать имени Host
, которое мы установили в вашем файле ~/.ssh/config
.Это корректно соединяет git с соответствующим IdentityFile
и правильно аутентифицирует вас с помощью github
Готово: создание нового репо
Хорошо, потому что вы можете 'Если у вас нет курицы и яйца, мы рассмотрим публикацию нового репо на вашем дополнительном аккаунте.Эта ситуация применима к пользователям, которые создают новый контент, используя свою вторичную учетную запись github.
Предположим, вы уже локально проделали небольшую работу и теперь вы готовы перейти на github.Вы можете подписаться вместе со мной, если хотите
$ cd ~
$ mkdir somerepo
$ cd somerepo
$ git init
Теперь настройте этот репо для использования удостоверения личности
$ git config user.name "Mister Manager"
$ git config user.email "someuser@some.org"
Теперь сделайте свой первый коммит
$ echo "hello world" > readme
$ git add .
$ git commit -m "first commit"
Проверьте коммит, чтобы увидеть, что ваша новая личность была использована, используя git log
$ git log --pretty="%H %an <%ae>"
f397a7cfbf55d44ffdf87aa24974f0a5001e1921 Mister Manager <someuser@some.org>
Хорошо, пора нажимать на github!Поскольку github еще не знает о нашем новом репо, сначала перейдите на github.com / new и создайте новое репо - назовите его somerepo
Теперь, чтобынастройте ваш репозиторий, чтобы «общаться» с github, используя правильные идентификационные данные / учетные данные, мы добавили удаленный.Предполагая, что ваше имя пользователя github для вашей новой учетной записи: someuser
...
$ git remote add origin <b>github.com-otheruser</b>:someuser/somerepo.git
То, что выделено жирным шрифтом является абсолютно критическим, и оно должно соответствовать Host
что мы определили в вашем ~/.ssh/config
файле
Наконец, нажмите репо
$ git push origin master
Обновите существующее репо, чтобы использовать новую конфигурацию SSH
Скажи, йоУ вас уже есть клонированный репозиторий, но теперь вы хотите использовать новую конфигурацию SSH. В приведенном выше примере мы сохранили ваши существующие репозитории в такте, назначив предыдущую пару ключей id_rsa
/ id_rsa.pub
на Host github.com
в вашем файле конфигурации SSH. В этом нет ничего плохого, но у меня сейчас есть как минимум 5 конфигураций github, и я не люблю думать об одной из них как о конфигурации по умолчанию - я бы предпочел прояснить каждую из них.
Прежде чем у нас было это
Host github.com
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Итак, теперь мы обновим это до (изменения в полужирный )
Host <b>github.com-mainuser</b>
<b>HostName github.com</b>
User git
IdentityFile ~/.ssh/github-mainuser
Host github.com-otheruser
HostName github.com
User git
IdentityFile ~/.ssh/github-otheruser
Но это означает, что теперь любой существующий репозиторий с пультом github.com
больше не будет работать с этим файлом идентификации. Но не волнуйтесь, это простое исправление.
Чтобы обновить любое существующее хранилище для использования вашей новой конфигурации SSH, просто откройте файл git config хранилища и обновите URL!
$ cd existingrepo
$ nano .git/config
Обновление поля удаленного источника (изменения полужирный )
[remote "origin"]
url = <b>github.com-mainuser:someuser/existingrepo.git</b>
fetch = +refs/heads/*:refs/remotes/origin/*
Вот и все. Теперь вы можете push
/ pull
до глубины души
Права доступа к файлу ключа SSH
Если у вас проблемы с открытыми ключами, которые работают некорректно, SSH достаточно строг в отношении разрешений для файла , разрешенных для вашего каталога ~/.ssh
и соответствующих файлов ключей
Как правило, любые каталоги должны быть 700
, а любые файлы должны быть 600
- это означает, что они доступны только для чтения / записи - никакая другая группа / пользователь не может читать / записывать их
$ chmod 700 ~/.ssh
$ chmod 600 ~/.ssh/config
$ chmod 600 ~/.ssh/github-mainuser
$ chmod 600 ~/.ssh/github-mainuser.pub
$ chmod 600 ~/.ssh/github-otheruser
$ chmod 600 ~/.ssh/github-otheruser.pub
Как мне управлять своими SSH-ключами
Я управляю отдельными ключами SSH для каждого хоста, к которому я подключаюсь, так что, если какой-либо один ключ будет скомпрометирован, мне не придется обновлять ключи в любом другом месте, где я использовал этот ключ. Это похоже на то, что когда вы получаете уведомление от Adobe о том, что 150 миллионов информации их пользователей были украдены - теперь вам нужно отменить эту кредитную карту и обновить все службы, которые от нее зависят - что неприятно.
Вот как выглядит мой каталог ~/.ssh
: у меня есть один ключ .pem
для каждого пользователя, в папке для каждого домена, к которому я подключаюсь. Я использую .pem
ключи, поэтому мне нужен только один файл на ключ.
$ tree ~/.ssh
/Users/naomik/.ssh
├── config
├── github.com
│ ├── naomik.pem
│ ├── someusername.pem
├── known_hosts
├── naomi.makes.software
│ ├── naomi.pem
├── somedomain.com
│ ├── someuser.pem
└── someotherdomain.org
└── someuser.pem
А вот мой соответствующий файл /.ssh/config
- очевидно, что материал github важен для ответа на этот вопрос о github, но этот ответ направлен на то, чтобы дать вам знания для управления вашими идентификационными данными ssh на любом количестве служб / машин. *
Host github.com-naomik
HostName github.com
User git
IdentityFile ~/.ssh/github.com/naomik.pem
Host github.com-someuser
HostName github.com
User git
IdentityFile ~/.ssh/github.com/someusername.pem
Host naomi.makes.software
User naomi
IdentityFile ~/.ssh/naomi.makes.software/naomi.pem
Host somedomain.com
HostName 162.10.20.30
User someuser
IdentityFile ~/.ssh/somedomain.com/someuser.pem
Host someotherdomain.org
User someuser
IdentityFile ~/.ssh/someotherdomain.org/someuser.pem
Получение вашего открытого ключа SSH из PEM-ключа
Вы заметили, что у меня есть только один файл для каждой клавиши. Когда мне нужно предоставить открытый ключ, я просто генерирую его при необходимости.
Поэтому, когда github запрашивает ваш открытый ключ ssh, запустите эту команду, чтобы вывести открытый ключ в стандартный вывод - копируйте / вставляйте, где это необходимо
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAA...
Обратите внимание, это тот же процесс, который я использую для добавления своего ключа на любой удаленный компьютер. Значение ssh-rsa AAAA...
копируется в файл ~/.ssh/authorized_keys
пульта дистанционного управления
Преобразование ваших id_rsa
/ id_rsa.pub
пар ключей в формат PEM
Значит, вы хотите приручить ключевые файлы и сократить расходы на файловую систему? Конвертировать вашу пару ключей в одинарный PEM очень просто
$ cd ~/.ssh
$ openssl rsa -in id_rsa -outform pem > id_rsa.pem
Или, следуя приведенным выше примерам, мы переименовали id_rsa -> github-mainuser
и id_rsa.pub -> github-mainuser.pub
- так
$ cd ~/.ssh
$ openssl rsa -in github-mainuser -outform pem > github-mainuser.pem
Теперь, чтобы убедиться, что мы преобразовали это правильно, вам нужно убедиться, что сгенерированный открытый ключ соответствует вашему старому открытому ключу
# display the public key
$ cat github-mainuser.pub
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
# generate public key from your new PEM
$ ssh-keygen -y -f someuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAA ... R++Nu+wDj7tCQ==
Теперь, когда у вас есть файл github-mainuser.pem
, вы можете безопасно удалить свои старые файлы github-mainuser
и github-mainuser.pub
- необходим только файл PEM; просто сгенерируйте открытый ключ всякий раз, когда он вам нужен ^ _ ^
Создание ключей PEM с нуля
Вам не нужно создавать пару секретный / открытый ключ и , затем конвертировать в один ключ PEM. Вы можете создать ключ PEM напрямую.
Давайте создадим newuser.pem
$ openssl genrsa -out ~/.ssh/newuser.pem 4096
Получение того же открытого ключа SSH
$ ssh-keygen -y -f ~/.ssh/newuser.pem
ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAACA ... FUNZvoKPRQ==