Много статей (в том числе и на Хабре) посвящено подключению к Git по SSH-ключам. Почти во всех из них используется один из двух способов: либо с помощью puttygen.exe, либо командами ssh-keygen или ssh-add.

Вчера на одном из компьютеров у меня не получилось сделать это для msysgit ни одним из описанных в интернете способов, и я потратил несколько часов на попытки настроить SSH-доступ, так ни чего и не добившись.

Как я решил эту проблему — под катом.

BitBucket всё время ругался на то, что ему требуется подключение с помощью ключа:
Permission denied (publickey).
fatal: Could not read from remote repository.
Please make sure you have the correct access rights and the repository exists.


Мои попытки сгенерировать ключи, указать пути в переменных среды, привязать ключи к гиту были бесполезны. Либо гит ругался крякозябрами (в случае ssh-agent cmd.exe), либо просто игнорировал всё предложенное.

Решение оказалось куда удобнее и проще. Достаточно запустить в локальном репозитории GIT GUI Here, и в меню перейти в
Help -> Show SSH Key:

Скрины
image

image


Если вы столкнулись с такой проблемой, то скорее всего у вас там ни чего не будет:

Окно генерации SSH Key
image

Ну а дальше читать будут, скорее всего, только самые педантичные… Жмём Generate key, видим окно запроса пароля (два раза) для приватного ключа:

Запрос пароля
image

И видим сгенерировавшийся публичный ключ:

Публичный ключ
image

Копируем его, и добавляем вэб-морду ГИТа (в моём случае это BitBucket; ключи там можно добавить в двух местах — в настройках аккаунта и в настройках проекта, нам первый вариант, ибо второй — для деплоя проекта) [Аккаунт]Управление аккаунтомSSH-ключиДобавить ключ:

Добавление ключа в BitBucket
image

Ну, а дальше — просто делаем что нужно — или пуш, или клон (предполагается, что git remote add вы уже сделали сами). Git спросит, можно ли добавить хост к доверенным, и запросит passphrase (пароль приватного ключа). Всё, можно работать.

Удачных разработок!

PS: Большое спасибо за наводку на решение моему коллеге Ивану!

Комментарии (38)


  1. saboteur_kiev
    11.09.2015 13:14
    +5

    Это конечно хорошо, но можно уточнить что вы сделали с системой, что в ней не работает ни ssh-keygen ни putty-gen?


    1. Duster
      11.09.2015 13:22
      -1

      Система живет уже года два. Боюсь, что я не смогу перечислить всего. Там были и несколько реализаций SVN, и пробы Mercurial, и (могу врать) что-то для Git (по крайней мере, когда я пользовался Eclipse, то гит я пробовал)…


    1. wrewolf
      11.09.2015 13:46

      при том что встроенный ssh-keygen работает, т.е. msysgit запускает его


  1. wrewolf
    11.09.2015 13:21
    +7

    хабра уже не та


    1. Duster
      11.09.2015 13:23
      -4

      А что конкретно вас не устраивает? У меня возникла проблема, я её немного неоднозначно решил и написал об этом. Я сделал что-то плохое? Намекните хотя бы, я могу чего-то не понимать. PS: Да и звезды появляются, значит я всё-таки что-то хоть немного полезное написал.


      1. wrewolf
        11.09.2015 13:44
        +4

        это не решение проблемы, это уход от нее. Проблема что не работают стандартные ломовые утилиты, если ssh-keygen еще банально можен не работать из за того что PATH десять раз переписан. То не работа puttygen говорит о серьезных нарушениях в ОС,


        1. Duster
          11.09.2015 13:45

          Вы предлагаете мне переустановку захламлённой системы? Или тратить часы на чистку?
          PuttyGen работает отлично, сам git не подцепляет сторонние ключи.
          Почему он не подцепляет ключ, сгенерированный ssh-keygen я не знаю.


          1. wrewolf
            11.09.2015 13:51
            +1

            это вы его не так готовите, PuttyGen нужно сделать экспорт закрытого(приватного) ключа, и его скопировать и вставить в окошко в вашем клиенте, а на сервер загрузить открытый ключ, который на самой форме PuttyGen виден


          1. m00t
            11.09.2015 14:57
            +6

            Почему он не подцепляет ключ, сгенерированный ssh-keygen я не знаю.

            Не самая лучшая фраза, которую может сказать software developer. Лучше бы разобраться с проблемой, а не плодить костыли.


  1. ilnuribat
    11.09.2015 13:30

    Насколько я знаю, ssh-keygen.exe поставляется вместе с клиентом git. По умолчанию ключ сохраняется в файле C:\users\user\.ssh\id_rsa.pub, почти как в линуксах (/home/user/.ssh/id_rsa.pub)

    Можно было вообще не париться и просто использовать https
    git clone bitbucket.org/username/projectName.git
    -->enter login: username
    -->enter password: ****


    1. Duster
      11.09.2015 13:37
      -3

      Я уже всё это знаю. Но мой опыт работы с git весьма мал, и подробности настройки я начинаю узнавать только сейчас. По крайней мере, теперь есть статья с еще одним, более простым, способом создания ключей.


      1. wrewolf
        11.09.2015 13:45

        как бонус к https получите сохранение пароля, если агент хранения его не умер у вас


        1. Duster
          11.09.2015 13:48
          -1

          У меня Intellij IDEA, она и для SSH пароль сохранила. В целом всё работает, но, судя по всему, предыдущие эксперименты оставили следы. Быть может, он ключ ищет где-то не там. В любом случае, эта же проблемма может произойти и у других новичков, а явного её решения не было. Плюсом служит и то, что такое создание ключа банально быстрее…


          1. wrewolf
            11.09.2015 13:54

            А теперь ситуация, надо использовать 2 разных ключа.
            Или использовать ранее созданный.


            1. Duster
              11.09.2015 13:58
              -1

              Зачем два разных? Откуда второй? Вы, мне кажется, что-то не так поняли из моих слов, отсюда столько недопониманий…


              1. wrewolf
                11.09.2015 14:08

                Я понял вашу ситуацию, я про то как решать, если понадобиться использовать 2 ключа разных?


                1. Borz
                  11.09.2015 14:31

                  разнесите их по разным хостам в ~/.ssh/config и цепляйтесь из IDEA не к github.com, а к этим хостам через ssh вместо https.


                  1. wrewolf
                    11.09.2015 14:39

                    я гружу в ssh-agent


                    1. Borz
                      11.09.2015 14:48

                      ssh-agent отвечает только за «ввод пароля» для ключа, но не за выбор самого ключа при подключении


                      1. wrewolf
                        11.09.2015 14:59

                        хм, не сталкивался с такой проблемой, автоматом авторизуюсь одним из 3х ключей, без доп конфигурации в ~/.ssh/config


                        1. Borz
                          11.09.2015 15:02

                          а как вы делите git-пользователей для ssh-адреса git@github.com?

                          Допустим есть пользователь git1 с ключем key1 и есть пользователь git2 с ключем key2…


                          1. wrewolf
                            11.09.2015 15:05
                            -1

                            никак не делю


                  1. easyman
                    11.09.2015 18:47

                    Читайте про темплейты в git
                    Начинать с git init (неожиданно, да?)


                    1. Borz
                      11.09.2015 19:45

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


                      1. easyman
                        11.09.2015 20:27
                        +1

                        Подвела меня память, вы правы.

                        Там можно другое имя пользователя и e-mail указать, с этим и перепутал.

                        А альтернативные ключи делаются немного иначе


              1. Borz
                11.09.2015 14:20

                второй ключ, это когда у вас два аккаунта


                1. wrewolf
                  11.09.2015 14:39

                  рабочий и личный


                  1. Borz
                    11.09.2015 14:43
                    -1

                    да хоть два личных и пять рабочих. я комментировал «Зачем два разных?» — какая разница какие они — личные или рабочие? Главное, что вам надо через ключи разделить аккаунты для одного домена и одного «пользователя» git


  1. Borz
    11.09.2015 14:05
    +4

    вы бы скрины ошибок дали бы, а то фигня получилась какая-то: «у меня по какой-то причине стандартные утилиты не пашут, за пару часов не разобрался в причинах и поэтому решил использовать костыль, о чём я вам сейчас и поведаю».

    а так:
    0) вы давали стандартные имена ключам?
    1) если нестандартные, то прописывали ли вы их в ~/.ssh/config?
    2) пытались ли вы просто зайти по SSH с этими ключами на GitHub? (команда «ssh git@github.com» из Git Bash)


  1. Borz
    11.09.2015 14:57
    +2

    кстати, ваш пост можно сократить до:

    0) запустить Git Bash
    1) выполнить в косноли команду «ssh-keygen»
    2) выполнить в консоли команду «cat ~/.ssh/id_rsa.pub»

    Ибо «Окно генерации SSH Key» по сути своей является просто графическим интерфейсом для консольного ssh-keygen

    и ключи надо искать в "~/.ssh", где "~" это виндовый путь %UserProfile%.


  1. HeadOnFire
    11.09.2015 15:48
    +2

    1. В С:/Users/Username создать текстовый файл .bashrc (хинт — в винде для создания dot-файлов нужно написать .bashrc. — с точкой в конце, и нажать enter)
    2. В сам файл вписать 2 строчки:
    eval $(ssh-agent -s)
    ssh-add /C/Users/Username/.ssh/id_rsa
    3. Профит.

    Естественно, сам id_rsa должен быть сгенерирован и публичный ключ добавлен на GitHub / BitBucket / Whatever


    1. iweron
      11.09.2015 16:05

      Собственно это всё, что нужно.


    1. Borz
      11.09.2015 16:23

      а память при этом не будет «утекать»? ведь .bashrc будет выполняться по сути при каждом запуске ssh-команд. Или по завершении процесс ssh-agent прибивается тоже?

      Я к тому, если я запущу 3 процесса Git Bash, то сколько в итоге я получу в памяти ssh-agent-ов? А после того, как один Git Bash закрою, сколько в памяти останется ssh-agent-ов?


      1. HeadOnFire
        11.09.2015 16:34

        Протестил. 2 окна Git Bash, 2 агента. Из личной практики — по 3 терминала открытых бывает регулярно (sass --watch, browsersync, git), но по 3 гитбаша — нет. Зачем? С другой стороны, процессы по 1Мб — не то, из-за чего стоит переживать.

        image


        1. Borz
          11.09.2015 16:43

          Не все весь день держат открытым терминал. А более двух запускается, когда у тебя более двух git-проектов — проще запустить для каждого свой терминал, чем cd-прыгать между ними

          последовательность:
          0) запустил терминал
          1) закрыл терминал
          2) запустил терминал
          3) закрыл терминал
          создаст два «брошенных» процесса ssh-agent в памяти.

          PS: создавать лучше не .bashrc, а .profile под линухами и cmd-файл в автозагрузке под виндами


          1. HeadOnFire
            11.09.2015 16:49

            создаст два «брошенных» процесса ssh-agent в памяти.


            Хм… Проверил, действительно. В принципе, у меня эта последовательность открыл-закрыл за рабочий день выполняется от десятка раз (не люблю когда терминал все время открыт), но никаких последствий в виде тормозов не замечал. Справедливости ради, у меня десктоп с 16Гб памяти, Core i7 и SSD, на ноутбуках попроще это может действительно быть проблемой.

            Спасибо за наводку, поколупаю сегодня .profile


  1. Revertis
    11.09.2015 15:50
    -1

    Небольшая подсказочка: слово «ничего» пишется слитно :)


  1. grieverrr
    11.09.2015 20:24
    +2

    статья легко заменятся одной картинкой с подписью «git gui умеет генерировать ssh ключи». вы большой молодец.