Налаштування Git через SSH для входу один раз


196

Я клонував своє git сховище над ssh. Отже, кожного разу, коли я спілкуюся з майстром походження натисканням або перетягуванням, я повинен повторно ввести свій пароль. Як я можу налаштувати git так, що мені не потрібно вводити свій пароль кілька разів?


7
Схоже, проблема безпеки, вам не потрібно використовувати паролі, щоб виконувати звичайні зобов’язання, але натиск - це тип речі, з яким ви хочете повторно пройти автентифікацію, але, можливо, я по-старому.
Алекс Секстон

Відповіді:


104

Спробуйте ssh-add, вам потрібно ssh-agentпрацювати і тримати ваш приватний ключ

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

Ви хочете працювати ssh-agentу фоновому режимі під час входу. Після входу в систему ідея полягає в тому, щоб запустити ssh-addодин раз і лише один раз, щоб надати агенту свою парольну фразу, щоб розшифрувати ваш ключ. Потім агент просто сидить у пам’яті з розблокованим і завантаженим ключем, готовий до використання кожного разу, коли ви кудись схилитесь.

Усі команди ssh-сім'ї 1 звернуться до агента і автоматично зможуть користуватися вашим приватним ключем.

У системах OSX (помилка, 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з правильним розширенням пам.


1
Замість того, щоб отримати вихід з ssh-agentцього, мабуть, більш акуратного для використання:eval `ssh-agent`
скоттшот

288

Мав подібну проблему з 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
ікозамуель

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якщо ваш дистрибутив ще не працює для вас).


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-адреси. Дивіться зображення нижче:

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


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

Розширення думок Muein для тих, хто вважає за краще редагувати файли безпосередньо через запущені команди в git-bash або терміналі.

Перейдіть у каталог .git свого проекту (корінь проекту на локальній машині) та відкрийте файл "config". Потім знайдіть [віддалене "походження"] і встановіть конфігурацію 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

1
Це справді допомогло. Безпечний і чистий спосіб усунення проблеми. Я думаю, що хтось повинен вдосконалити відповідь Муейна за допомогою цього.
Луїс Ортега Аранеда

1
"Перейдіть у каталог .git свого проекту", намагаючись вперше
амуліарно

Отримання цієї помилки "фатально: я не обробляю протокол 'git@github.com: <ім'я користувача> / https'"
Шивам Бхарадвай

@ShivamBharadwaj швидкий пошук виявив цю тему stackoverflow.com/questions/30474447/… . Чи є можливість скопіювати команду git clone з якогось веб-сайту і зіткнутися з цією проблемою? Якщо так, то спробуйте ввести повну команду замість цього.
uchamp

6

Я думаю, що тут є дві різні речі. Перший полягає в тому, що звичайна автентифікація SSH вимагає, щоб користувач вводив пароль облікового запису (де пароль облікового запису буде автентифіковано проти різних методів, залежно від конфігурації sshd).

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

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

З аутентифікацією відкритого ключа .

Якщо ви хочете уникати введення пароля сертифікату кожного разу, тоді ви можете використовувати ssh-агент, на що вказує DigitalRoss

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

Почніть тут: man ssh-agent.

Єдина проблема ssh-агента полягає в тому, що, принаймні, на * nix, ви повинні ставити пароль сертифікатів на кожній новій оболонці. Потім сертифікат "завантажується", і ви можете використовувати його для автентифікації на ssh-сервері, не ставлячи пароля. Але це на тій конкретній оболонці.

З брелоком ви можете зробити те ж саме, що і ssh-agent, але "на всій системі". Після включення комп'ютера ви відкриваєте оболонку і вводите пароль сертифіката. І тоді кожна інша оболонка буде використовувати цей "завантажений" сертифікат, і ваш пароль більше ніколи не буде запитуватися, поки ви не перезавантажите комп'ютер.

Gnome має аналогічну програму під назвою Gnome Keyring, яка запитує пароль вашого сертифікату при першому використанні, а потім зберігає його надійно, тому вас більше не запитають.


Я використовую брелок самостійно: дуже корисно.
Якуб Нарбський

є ще один спосіб, записавши AddKeysToAgent yesв .ssh / config. Потім його завантажують у пам'ять, поки ви не вимкнете комп’ютер
infoclogged


4
ssh-keygen -t rsa

Коли вас попросять ввести парольну фразу, залиште її порожньою, просто натисніть клавішу Enter. так просто, як це !!


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

3

Спробуйте це з вікна, з якого ви натискаєте

    ssh git@github.com

Потім ви отримаєте привітання від github і буде добре, а потім натиснути.


2
Це працює для мене, Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.але якимось чином git все-таки просить мене пароль, коли я намагаюся натиснути
gkucmierz

2

Мені довелося клонувати git repo з сервера, який не дозволяв увійти в ключ vsh ssh, а лише за допомогою користувача / пароля. Я не знайшов способу налаштувати плагін Git для використання простої комбінації користувача / пароля, тому я додав наступну команду оболонки як крок попереднього збирання на машині збирання Linux, яка залежить від очікування інструменту (apt-get install очікується):

ЦЕ НЕ ДОБРИЙ ШЛЯХ РОЗВИТКУ ЦЬОЇ ПРОБЛЕМИ, ЯКІ ВАШ ПАРОЛЬ ПОСЛІДУЄТЬСЯ ЯК ЧИСТИЙ ТЕКСТ У КОНФІГУРАЦІЇ ТА ЛОГІСТАХ ДЖЕНКІНСЬКОЇ РОБОТИ! ТОЛЬКО ВИКОРИСТОВУЄТЬСЯ, ЯКЩО НЕ МОЖЕ ДОДАТИ КОНФІГУРАТУВАННЯ РСА-КЛЮЧОВОЇ АВТОМОБІЛІ АБО ІНШІ МОЖЛИВІСТЬ КОНФІГУРАЦІЇ!

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-агент потрібно запустити заздалегідь. Якщо його не працює (перевіритиprep ssh-agent ), просто запустіть йогоeval $(ssh-agent)

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

Джерело рішення - /ubuntu/362280/enter-ssh-passphrase-once/853578#853578


0

Я намагаюся уникати введення парольної фрази весь час також тому, що я використовую ssh на Windows. Що я зробив, - це змінити мій файл .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.


1
Ви впевнені, що не маєте на увазі ~ / .ssh / санкціоновані_кеї?
Kevin_Kinsey
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.