Если вы работаете с множеством GitHub или Bitbucket аккаунтов, то вам может понадобится создать несколько SSH-ключей.
1) Просмотр имеющихся SSH-ключей
Неплохо бы проверить (просто чтобы знать) есть ли у вас в системе уже сгенерированные SSH-ключи, для этого нужно просмотреть содержимое папки ~/.ssh:$ ls -al ~/.ssh
# Lists the files in your .ssh directory, if they exist
2) Создание нового SSH-ключа
Для начала откроем Git Bash и создадим новый SSH-ключ:
$ ssh-keygen -t rsa -b 4096 -f ~/.ssh/personalid -C "personalid"
Вместо personalid может быть например, your_email@example.com.
Или вы можете указать имя в формате сервис-логин, например, github.com-activehacker или github.com-jexchan. Имя может быть любым, например, account-one или account-two. Главное требование это чтобы оно было friendly-name. Если у вас всего два аккаунта (личный и рабочий), то можно использовать personal и company соответственно, или personalid и workid, или personal.bitbucket.org и work.bitbucket.org.
Если не задавать имя файла, то SSH-ключ по умолчанию при использовании rsa сохранится по пути: /Users/you/.ssh/id_rsa. Могут быть и другие варианты, в зависимости от алгоритма: id_dsa.pub, id_ecdsa.pub, id_ed25519.pub.
Примеры имен файлов для опции -f:
- ~/.ssh/id_rsa_activehacker
- ~/.ssh/id_rsa_jexchan
- ~/.ssh/key-one
- ~/.ssh/key-two
- ~/.ssh/private_ssh_file
- ~/.ssh/id_rsa_personal
- ~/.ssh/id_rsa_company
Также для защиты SSH-ключа вам нужно будет ввести секретную фразу (passphrase). В дальнейшем вам не придется вводить её каждый раз т.к. её запомнит утилита ssh-agent.
В результате выполнения этой команды вы должны получить пару public/private key. Пример:
Your identification has been saved in /Users/manthony/.ssh/personalid.
Your public key has been saved in /Users/manthony/.ssh/personalid.pub.
3) Настройка SSH конфигурации
Далее после того как все необходимые ключи созданы нужно отредактировать config-файл по пути ~/.ssh/config.
Host workid
HostName bitbucket.org
IdentityFile ~/.ssh/workid
Host personalid
HostName bitbucket.org
IdentityFile ~/.ssh/personalid
После этого ссылка на репозиторий вида git@bitbucket.org:<accountname>/<reponame>.git преображается в ссылку вида git@alias:<accountname>/<reponame>.git.
Через опцию User можно прописать имя пользователя на удаленной машине в config-файл.
Host account-one
HostName server.example.com
User git
IdentityFile ~/.ssh/key-one
Host account-two
HostName server.example.com
User git
IdentityFile ~/.ssh/key-two
Тогда в ссылках не нужно будет в начале указывать git@.
$ git remote add one account-one:repository.git
$ git remote add two account-two:repository.git
См. также про проверку хоста при первом подключении:
How to rectify SSH error: Authenticity of host can't be established?
The authenticity of host 'bitbucket.org (131.103.20.168)' can't be established
Known host or Bitbucket's public key fingerprints
Host workid
HostName bitbucket.org
IdentityFile ~/.ssh/workid
Host personalid
HostName bitbucket.org
IdentityFile ~/.ssh/personalid
После этого ссылка на репозиторий вида git@bitbucket.org:<accountname>/<reponame>.git преображается в ссылку вида git@alias:<accountname>/<reponame>.git.
Через опцию User можно прописать имя пользователя на удаленной машине в config-файл.
Host account-one
HostName server.example.com
User git
IdentityFile ~/.ssh/key-one
Host account-two
HostName server.example.com
User git
IdentityFile ~/.ssh/key-two
$ git remote add one account-one:repository.git
$ git remote add two account-two:repository.git
4) Добавление SSH-ключа на хостинг проектов
Далее нужно добавить публичный ключ на хостинг.
Под Git Bash его можно скопировать сразу в буфер обмена:
$ clip < ~/.ssh/id_rsa.pub
# Copies the contents of the id_rsa.pub file to your clipboard
В Linux его можно вывести на консоль и скопировать командой cat:
$ cat ~/.ssh/id_rsa.pub
А в Mac OS X можно сразу скопировать в буфер обмена с помощью команды pbcopy:
$ pbcopy < ~/.ssh/id_rsa.pub
5) Настройка ssh-agent для безопасного хранения и использования SSH-ключей
Далее нужно добавить ключ в ssh-agent. Сначала нужно убедиться, что ssh-agent запущен, для этого под Git Bash нужно выполнить команду:
$ ps | grep ssh-agent
А под Mac OS X и Linux:
$ ps -e | grep [s]sh-agent
Чтобы запустить ssh-agent под Git Bash нужно выполнить команду:
# start the ssh-agent in the background
$ eval "$(ssh-agent -s)"
Agent pid 59566
Он будет оставаться запущенным до тех пор пока вы не выйдите из своей учетной записи, или выключите компьютер или убьете процесс.
Просмотреть добавленные в ssh-agent ключи можно командой:
$ ssh-add -l
Сам ключ добавляется командой:
$ ssh-add ~/.ssh/id_rsa
Ключи добавляются кратковременно и при перезапуске агента будут удалены.
Если нужно чтобы ssh-agent "забыл" ключ спустя какое-то время, то нужно использовать команду:
$ ssh-add -t <seconds>
Чтобы ssh-agent запускался автоматически надо в ~/.profile добавить:
env=~/.ssh/agent.env
agent_load_env () { test -f "$env" && . "$env" >| /dev/null ; }
agent_start () {
(umask 077; ssh-agent >| "$env")
. "$env" >| /dev/null ; }
agent_load_env
# agent_run_state: 0=agent running w/ key; 1=agent w/o key; 2= agent not running
agent_run_state=$(ssh-add -l >| /dev/null 2>&1; echo $?)
if [ ! "$SSH_AUTH_SOCK" ] || [ $agent_run_state = 2 ]; then
agent_start
ssh-add
elif [ "$SSH_AUTH_SOCK" ] && [ $agent_run_state = 1 ]; then
ssh-add
fi
unset env
В данном скрипте команда ssh-add добавляет ключ, который расположен по пути по умолчанию ~/.ssh/id_rsa. Чтобы добавить свой ключ нужно написать
ssh-add path/to/your/private/key
Тогда ssh-agent запросит пароль на добавление ключа.
ssh поддерживает добавление SSH-ключа к агенту при первом использовании. Для этого надо в файл ~/.ssh/config добавить строку:
AddKeysToAgent yes
6) Тестирование подключения
Для того чтобы протестировать подключение нужно дать команду:
ssh -T git@github.com
# Attempts to ssh to GitHub
См. также про проверку хоста при первом подключении:
How to rectify SSH error: Authenticity of host can't be established?
The authenticity of host 'bitbucket.org (131.103.20.168)' can't be established
Known host or Bitbucket's public key fingerprints