Настройка Git через SSH для единовременного входа

197

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

Reprogrammer
источник
7
Похоже на проблему безопасности, вам не нужно использовать какие-либо пароли для выполнения обычных коммитов, но push-это тип вещи, с которой вы хотели бы пройти повторную аутентификацию, но, возможно, я старомоден.
Алекс Секстон

Ответы:

104

Попробуйте ssh-add, вам нужно ssh-agentзапустить и держать свой закрытый ключ

(Хорошо, отвечая на обновленный вопрос, вы сначала запускаете ssh-keygenгенерацию открытого и закрытого ключа, как объяснил Джефроми . Вы помещаете открытый ключ на сервер. Вы должны использовать фразу-пароль, если у вас нет эквивалента простого -текстовый пароль в вашем личном ключе. Но когда вы это сделаете, вам понадобится на практике, как описано ниже.)ssh-agent

Вы хотите работать ssh-agentв фоновом режиме при входе в систему. Как только вы входите в систему, идея состоит в том, чтобы запускаться ssh-addодин раз и только один раз, чтобы дать агенту вашу фразу-пароль для декодирования вашего ключа. Затем агент просто сидит в памяти с разблокированным и загруженным ключом, готовым к использованию каждый раз, когда вы где-то работаете в ssh.

Все команды ssh-family 1 будут обращаться к агенту и автоматически смогут использовать ваш закрытый ключ.

В системах OSX (err, macOS ), GNOME и KDE ssh-agentобычно запускается автоматически. Я расскажу подробности на тот случай, если, как и я, у вас также есть Cygwin или другая среда Windows, где это наверняка не сделано для вас.

Начало здесь: man ssh-agent.

Существуют различные способы автоматического запуска агента. Как объясняется на странице руководства, вы можете запустить ее так, чтобы она была родительской для всех других процессов сеанса входа в систему. Таким образом, переменные окружения, которые он предоставляет, будут автоматически присутствовать во всех ваших оболочках. Когда вы (позже) вызовете ssh-addили sshоба будете иметь доступ к агенту, потому что у них всех есть переменные окружения с волшебными именами сокетов или чем-то еще.

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

Мои системы OSX и Ubuntu автоматически выполняют настройку запуска агента, поэтому все, что мне нужно сделать, это запустить ssh-addодин раз. Попробуйте запустить ssh-addи посмотреть, если это работает, если это так, то вам просто нужно сделать это один раз за перезагрузку.

Моя система Cygwin необходимо сделать это вручную, так что я сделал это в моей .profileи у меня есть .bashrcисточник .profile:

. .agent > /dev/null
ps -p $SSH_AGENT_PID | grep ssh-agent > /dev/null || {
        ssh-agent > .agent
        . .agent > /dev/null
}

.agentФайл создается автоматически с помощью сценария; он содержит определения и экспорт переменных среды. Вышеприведенное пытается получить исходный файл .agent, а затем пытается выполнить ps(1)агент. Если это не работает, он запускает агент и создает новый файл агента. Вы также можете просто запустить ssh-addи, если это не удается запустить агент.


1. И даже локальный и удаленный sudoс правильным расширением pam.

DigitalRoss
источник
1
Вместо того, чтобы получать выходные данные из ssh-agentего, вероятно, eval `ssh-agent`
лучше
289

У меня была похожая проблема с GitHub, потому что я использовал протокол HTTPS. Чтобы проверить, какой протокол вы используете, просто запустите

git config -l

и посмотрите на строку, начинающуюся с remote.origin.url. Для переключения вашего протокола

git config remote.origin.url git@github.com:your_username/your_project.git
Муэйн Музамил
источник
13
Я думаю, что это должен быть официальный ответ, ^ 5 @Muein!
Фер Мартин
14
это не работает, когда репозиторий закрыт, а вы не владелец. Я только что столкнулся с Permission deniedошибкой.
ogzd
7
Это только для одного репо, как я могу сделать это глобально?
onmyway133
2
@ogzd GitHub (или любой другой службе, которую вы используете) требуется ваш открытый SSH-ключ, прежде чем это сработает, но это по-прежнему правильное решение.
MattM
альтернативаgit remote set-url origin git@github.com:your_username/your_project.git
icosamuel
25

Это касается настройки ssh, а не git. Если вы этого еще не сделали, вам следует использовать ssh-keygen(с пустой парольной фразой) для создания пары ключей. Затем вы копируете открытый ключ в удаленный пункт назначения с помощью ssh-copy-id. Если вам не нужны несколько ключей (например, более безопасный с парольной фразой для других целей) или если у вас есть несколько странных вещей с множеством идентификаторов, это просто:

ssh-keygen   # enter a few times to accept defaults
ssh-copy-id -i ~/.ssh/id_rsa user@host

Редактировать: Вы действительно должны просто прочитать ответ DigitalRoss, но: если вы используете ключи с парольными фразами, вам нужно будет использовать их, ssh-add <key-file>чтобы добавить их ssh-agent(и, очевидно, запустить, ssh-agentесли в вашем дистрибутиве его еще нет).

Cascabel
источник
2
Я не уверен, что это отвечает на вопрос, он, должно быть, уже сделал это, иначе он не сможет попасть на сайт. Ответ, в котором он нуждается, таков: ssh-agentпоскольку он хочет обойти проблему ввода-пароля-каждый раз. Не понижение голоса, но я думаю, что вам нужно улучшить этот ответ, если только я не тот, кто неправильно понял ...
DigitalRoss
2
@DigitalRoss: Ах, я не был уверен, прочитав вопрос, действительно ли у ОП были настроены ключи. Хотя вы, вероятно, правы, и я сознательно пытался предложить не использовать фразу-пароль. Тем не менее, вы, конечно, правы ssh-agent. +1 тебе!
Каскабель
Я запутался, нужно ли мне использовать ssh-keygen или ssh-add. В моей директории ~ / .ssh / у меня есть только два файла: config и known_hosts. Похоже, что ssh-add требует другой файл ~ / .ssh / id_rsa. Должен ли я сначала создать этот файл, используя ssh-keygen, как объяснил @Jefromi?
репрограммист
Да, вам нужно создать ключ, прежде чем вы сможете скопировать его на удаленный сервер. Я думаю, что, возможно, мы были смущены тем, что вы использовали слово «кодовая фраза» - это то, что ssh-*вызывает кодовую фразу, необходимую для использования ключа - где вы действительно имели в виду свой действительный пароль пользователя на пульте?
Каскабель
Да, я должен был сказать пароль вместо ключевой фразы.
репрограммист
23

Убедитесь, что когда вы клонировали репозиторий, вы сделали это с помощью URL-адреса SSH, а не HTTPS; в поле URL-адрес клона репозитория выберите протокол SSH перед копированием URL-адреса. Смотрите изображение ниже:

введите описание изображения здесь

Zorayr
источник
23

Если вы клонировали с использованием HTTPS (рекомендуется), то:

git config --global credential.helper cache

а потом

git config --global credential.helper 'cache --timeout=2592000'
  • timeout = 2592000 (30 дней в секундах), чтобы включить кэширование на 30 дней (или все, что вам подходит).

  • Теперь запустите простую команду git, которая требует вашего имени пользователя и пароля.

  • Введите свои учетные данные один раз, и теперь кэширование включено на 30 дней.

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

  • Для получения дополнительной информации: - Кэширование вашего пароля GitHub в Git

Примечание : вам нужен Git 1.7.10 или новее, чтобы использовать помощник по учетным данным. При перезагрузке системы нам, возможно, придется ввести пароль еще раз.

Нишант Таплиял
источник
1
Вы спаситель, надоело каждый раз вводить логин и пароль. Спасибо :)
Дэйв Ранджан
пожалуйста, укажите, если это только для Linux или только для Windows или оба.
joedotnot
@joedotnot для всех ОС. Вы также можете просмотреть упомянутую ссылку, и там вы найдете опцию ОС чуть ниже заголовка.
Нишант Таплиял
Это! Работает в каждом случае.
Akaisteph7
@Charles Привет, я только что проверил то же самое, и он работает, как ожидалось.
Нишант Таплиял
8

Расширение мыслей Мейна для тех, кто предпочитает редактировать файлы напрямую, используя команды в git-bash или терминале.

Перейдите в каталог .git вашего проекта (корневой каталог проекта на вашем локальном компьютере) и откройте файл 'config'. Затем найдите [remote "origin"] и установите конфигурацию URL следующим образом:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = git@github.com:<username>/<projectname>.git
uchamp
источник
1
Это действительно помогло. Безопасный и чистый способ решения проблемы. Я думаю, что кто-то должен улучшить ответ Мейна с этим.
Луис Ортега Аранеда
1
Попытка
Получение этой ошибки "фатально: я не обрабатываю протокол" git@github.com: <имя пользователя> / https '"
Шивам Бхарадвад
@ShivamBharadwaj быстрый поиск показал эту ветку stackoverflow.com/questions/30474447/… . Есть ли вероятность, что вы копируете команду git clone с какого-то сайта и сталкиваетесь с этой проблемой? Если да, то попробуйте ввести полную команду вместо этого.
Учамп
6

Я думаю, что здесь есть две разные вещи. Во-первых, обычная проверка подлинности SSH требует от пользователя ввода пароля учетной записи (где пароль учетной записи будет проверяться разными способами, в зависимости от конфигурации sshd).

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

Для этого вы можете следовать инструкциям, указанным steveth45:

С аутентификацией с открытым ключом .

Если вы не хотите каждый раз вводить пароль сертификата, вы можете использовать ssh-agent, как указывает DigitalRoss

Точный способ сделать это зависит от Unix против Windows, но, по сути, вам нужно запускать ssh-agent в фоновом режиме при входе в систему, а затем при первом входе в систему запустить ssh-add, чтобы дать агенту ваш пароль. Все команды семейства ssh будут обращаться к агенту и автоматически подберут вашу фразу-пароль.

Начните здесь: man ssh-agent.

Единственная проблема ssh-agent заключается в том, что, по крайней мере, в * nix вы должны ставить пароль сертификатов в каждую новую оболочку. Затем сертификат «загружается», и вы можете использовать его для аутентификации на сервере ssh без ввода какого-либо пароля. Но это именно на этой оболочке.

С брелок вы можете сделать то же самое, что и ssh-agent, но "для всей системы". Как только вы включаете компьютер, вы открываете оболочку и вводите пароль сертификата. И затем, каждая другая оболочка будет использовать этот «загруженный» сертификат, и ваш пароль больше никогда не будет запрашиваться, пока вы не перезагрузите компьютер.

В Gnome есть похожее приложение под названием Gnome Keyring, которое запрашивает пароль вашего сертификата при первом использовании, а затем надежно сохраняет его, чтобы вас больше не спрашивали.

Гастон
источник
Я использую брелок самостоятельно: очень полезно.
Якуб Наребски
есть еще один способ, написав AddKeysToAgent yesв .ssh / config. Затем его загружают в память, пока вы не выключите компьютер
17
4
ssh-keygen -t rsa

Когда вас спросят о ключевой фразе, оставьте это поле пустым, т.е. просто нажмите Enter. так просто, как, что!!

Сринивас Каттимани
источник
4
Имейте в виду, что если вы сделаете это, то любой, кто имеет доступ к вашему клиенту разработки, имеет доступ к серверу хранилища без пароля. Комбинация ssh-agent / ssh-add обеспечивает намного лучшую безопасность.
Питер В. Мёрк
3

Попробуйте это из коробки, из которой вы толкаете

    ssh git@github.com

Затем вы должны получить приветственный ответ от GitHub, и тогда будет хорошо, чтобы потом нажать.

toonsend
источник
2
Это работает для меня, Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.но каким-то образом git все еще спрашивает у меня пароль, когда я пытаюсь нажать
gkucmierz
2

Мне пришлось клонировать git-репозиторий с сервера, который не разрешал вход в систему через ключ ssh, а только с именем пользователя / паролем. Я не нашел способа настроить плагин Git для использования простой комбинации пользователя и пароля, поэтому я добавил следующую команду оболочки в качестве шага предварительной сборки на машине сборки linux, которая зависит от ожидаемого инструмента (apt-get install Ожидается):

ЭТО НЕ ХОРОШИЙ СПОСОБ РЕШЕНИЯ ЭТОЙ ПРОБЛЕМЫ, ТАК КАК ВАШ ПАРОЛЬ ПОКАЗЫВАЕТСЯ ЧЕТКОЙ ТЕКСТ В КОНФИГУРАЦИИ И ЖУРНАЛАХ JENKINS JOB! ТОЛЬКО ИСПОЛЬЗУЙТЕ ЕГО, ЕСЛИ НЕТ СПОСОБА НАСТРОИТЬ АУТЕНТИФИКАЦИЮ RSA-KEY ИЛИ ДРУГОЙ КОНФИГУРАЦИИ!

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'
январь
источник
1

Добавьте одну строку AddKeysToAgent yesв верхней части файла .ssh / config. Конечно, ssh-agent должен быть запущен заранее. Если он не работает (проверьте prep ssh-agent), просто запустите егоeval $(ssh-agent)

Теперь ключ загружается в память по всей системе, и вам не нужно снова вводить парольную фразу.

Источник решения: /ubuntu/362280/enter-ssh-passphrase-once/853578#853578.

infoclogged
источник
0

Я пытаюсь избежать ввода ключевой фразы все время, потому что я использую ssh на окнах. Что я сделал, так это изменил свой файл .profile, чтобы я вводил один пароль в конкретном сеансе. Так что это кусок кода:

    SSH_ENV="$HOME/.ssh/environment"

    # start the ssh-agent
    function start_agent {
        echo "Initializing new SSH agent..."
        # spawn ssh-agent
        ssh-agent | sed 's/^echo/#echo/' > "$SSH_ENV"
        echo succeeded
        chmod 600 "$SSH_ENV"
        . "$SSH_ENV" > /dev/null
        ssh-add
    }

    # test for identities
    function test_identities {
        # test whether standard identities have been added to the agent already
        ssh-add -l | grep "The agent has no identities" > /dev/null
        if [ $? -eq 0 ]; then
            ssh-add
            # $SSH_AUTH_SOCK broken so we start a new proper agent
            if [ $? -eq 2 ];then
                start_agent
            fi
        fi
    }

    # check for running ssh-agent with proper $SSH_AGENT_PID
    if [ -n "$SSH_AGENT_PID" ]; then
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
      test_identities
        fi
    # if $SSH_AGENT_PID is not properly set, we might be able to load one from
    # $SSH_ENV
    else
        if [ -f "$SSH_ENV" ]; then
      . "$SSH_ENV" > /dev/null
        fi
        ps -fU$USER | grep "$SSH_AGENT_PID" | grep ssh-agent > /dev/null
        if [ $? -eq 0 ]; then
            test_identities
        else
            start_agent
        fi
    fi

так что с этим я набираю свой пароль один раз в сеансе ..

Дэвид Блей
источник
-1

Я перепробовал все эти предложения и многое другое, просто для того, чтобы я мог получить клон из моего экземпляра AWS. Ничего не получалось. Я наконец-то обманул отчаяние: я скопировал содержимое id_rsa.pub на свой локальный компьютер и добавил его в ~ / .ssh / known_hosts на моем экземпляре AWS.

alansendgi
источник
1
Вы уверены, что не имеете в виду ~ / .ssh / authorized_keys?
Kevin_Kinsey