Konfigurowanie Git przez SSH, aby logował się raz

195

Sklonowałem moje repozytorium git na ssh. Dlatego za każdym razem, gdy komunikuję się z nadrzędnym urządzeniem nadrzędnym przez pchanie lub ciągnięcie, muszę ponownie wprowadzić hasło. Jak skonfigurować git, aby nie trzeba było wielokrotnie wpisywać hasła?

przeprogramowanie
źródło
7
Wydaje się, że to problem z bezpieczeństwem, nie musisz używać żadnych haseł, aby wykonywać normalne zatwierdzenia, ale push jest rodzajem rzeczy, z którą chciałbyś się ponownie uwierzytelnić, ale być może jestem staroświecki.
Alex Sexton,

Odpowiedzi:

104

Spróbuj ssh-add, musisz ssh-agenturuchomić i trzymać swój klucz prywatny

(Ok, odpowiadając na zaktualizowane pytanie, najpierw uruchamiasz, ssh-keygenaby wygenerować klucz publiczny i prywatny, jak wyjaśnił Jefromi . Umieszczasz klucz publiczny na serwerze. Powinieneś użyć hasła, jeśli nie masz odpowiednika zwykłego -tekstowe hasło w kluczu prywatnym. Ale kiedy to zrobisz, potrzebujesz ze względów praktycznych, jak wyjaśniono poniżej).ssh-agent

Chcesz się uruchamiać ssh-agentw tle podczas logowania. Po zalogowaniu chodzi o to, aby uruchomić ssh-addraz i tylko jeden raz, aby dać agentowi twoje hasło, aby zdekodować klucz. Agent następnie po prostu siedzi w pamięci z odblokowanym i załadowanym kluczem, gotowy do użycia za każdym razem, gdy gdzieś ssh.

Wszystkie polecenia ssh-family 1 skonsultują się z agentem i automatycznie będą mogły użyć twojego klucza prywatnego.

W systemach OSX (err, macOS ), GNOME i KDE ssh-agentzwykle uruchamiany jest automatycznie. Przejdę do szczegółów, na wypadek gdybyś, podobnie jak ja, miał Cygwin lub inne środowisko Windows, w którym z pewnością nie zostanie to zrobione.

Kliknij tutaj: man ssh-agent.

Istnieją różne sposoby automatycznego uruchamiania agenta. Jak wyjaśnia strona podręcznika, możesz go uruchomić, aby był rodzicem wszystkich innych procesów sesji logowania. W ten sposób zmienne środowiskowe, które udostępnia, będą automatycznie znajdować się we wszystkich twoich powłokach. Po (późniejszym) wywołaniu ssh-addlub sshoboje będą mieli dostęp do agenta, ponieważ wszystkie one mają zmienne środowiskowe z nazwami ścieżek magicznych lub cokolwiek innego.

Alternatywnie, możesz uruchomić agenta jako zwykłe dziecko, zapisać ustawienia środowiska w pliku i źródło tego pliku w każdej powłoce, gdy się uruchomi.

Moje systemy OSX i Ubuntu automatycznie wykonują konfigurację uruchamiania agenta, więc wszystko, co muszę zrobić, to uruchomić się ssh-addraz. Spróbuj uruchomić ssh-addi sprawdź, czy to działa, jeśli tak, to musisz to zrobić tylko raz przy ponownym uruchomieniu.

Mój system Cygwin potrzebował tego ręcznie, więc zrobiłem to w sobie .profilei mam .bashrcźródło .profile:

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

.agentPlik jest tworzony automatycznie przez skrypt; zawiera definicje i eksport zmiennych środowiskowych. Powyższe próbuje źródła pliku .agent, a następnie próbuje ps(1)agenta. Jeśli to nie działa, uruchamia agenta i tworzy nowy plik agenta. Możesz także uruchomić, ssh-adda jeśli się nie powiedzie, uruchom agenta.


1. A nawet lokalny i zdalny sudoz odpowiednim rozszerzeniem pam.

DigitalRoss
źródło
1
Zamiast pozyskiwać dane wyjściowe ssh-agent, prawdopodobnie lepiej jest użyć:eval `ssh-agent`
scottsome
288

Miałem podobny problem z GitHub, ponieważ korzystałem z protokołu HTTPS. Aby sprawdzić, jakiego protokołu używasz, po prostu uruchom

git config -l

i spójrz na linię zaczynającą się od remote.origin.url. Aby zmienić protokół

git config remote.origin.url [email protected]:your_username/your_project.git
Muein Muzamil
źródło
13
Myślę, że powinna to być oficjalna odpowiedź, ^ 5 @Muein!
Fer Martin
14
to nie działa, gdy repo jest prywatne i nie jesteś właścicielem. Właśnie napotkałem Permission deniedbłąd.
ogzd
7
Dotyczy tylko jednego repozytorium. Jak mogę zrobić to globalnie?
onmyway133,
2
@ogzd GitHub (lub jakakolwiek inna usługa, której używasz) potrzebuje publicznego klucza SSH, zanim to zadziała, ale nadal jest to właściwe rozwiązanie.
MattM
alternatywą jestgit remote set-url origin [email protected]:your_username/your_project.git
icosamuel
24

Chodzi o konfigurację ssh, a nie git. Jeśli jeszcze tego nie zrobiłeś, powinieneś użyć ssh-keygen(z pustym hasłem), aby utworzyć parę kluczy. Następnie skopiuj klucz publiczny do zdalnego miejsca docelowego za pomocą ssh-copy-id. O ile nie potrzebujesz wielu kluczy (np. Bezpieczniejszego z hasłem do innych celów) lub masz naprawdę dziwne rzeczy o wielu tożsamościach, jest to proste:

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

Edycja: Naprawdę powinieneś po prostu przeczytać odpowiedź DigitalRoss, ale: jeśli używasz kluczy z hasłami, musisz użyć, ssh-add <key-file>aby je dodać ssh-agent(i oczywiście uruchomić, ssh-agentjeśli twoja dystrybucja jeszcze dla ciebie nie działa).

Cascabel
źródło
2
Nie jestem pewien, czy to odpowiada na pytanie, musiał to już zrobić, inaczej nie będzie mógł wejść na stronę. Odpowiedź, której potrzebuje, to: ssh-agentponieważ chce ominąć problem „enter-the-passsphrase-za każdym razem”. Nie przegrywanie, ale myślę, że musisz poprawić tę odpowiedź, chyba że to ja źle zrozumiałem ...
DigitalRoss,
2
@DigitalRoss: Ach, nie byłem pewien od przeczytania pytania, czy OP rzeczywiście skonfigurował klucze. Prawdopodobnie masz rację, a ja celowo próbowałem zasugerować, aby nie używać hasła. Masz jednak oczywiście rację ssh-agent. +1 dla Ciebie!
Cascabel
Jestem zdezorientowany, czy muszę użyć ssh-keygen, czy ssh-add. W moim katalogu ~ / .ssh / mam tylko dwa pliki: config i znane_hosty. Wygląda na to, że ssh-add wymaga innego pliku ~ / .ssh / id_rsa. Czy powinienem najpierw utworzyć ten plik za pomocą ssh-keygen, jak wyjaśniono @Jefromi?
przeprogramowanie
Tak, musisz utworzyć klucz, zanim będziesz mógł skopiować go na zdalny serwer. Myślę, że być może myliło nas użycie słowa „hasło” - tak ssh-*nazywane jest hasło potrzebne do skorzystania z klucza - gdzie tak naprawdę miałeś na myśli swoje rzeczywiste hasło użytkownika na pilocie?
Cascabel,
Tak, powinienem był powiedzieć hasło zamiast hasła.
przeprogramowanie
23

Upewnij się, że po sklonowaniu repozytorium zrobiłeś to z adresem URL SSH, a nie HTTPS; w polu sklonowanego adresu URL repozytorium wybierz protokół SSH przed skopiowaniem adresu URL. Zobacz zdjęcie poniżej:

wprowadź opis zdjęcia tutaj

Zorayr
źródło
23

Jeśli sklonowałeś za pomocą HTTPS (zalecane), to: -

git config --global credential.helper cache

i wtedy

git config --global credential.helper 'cache --timeout=2592000'
  • limit czasu = 2592000 (30 dni w sekundach), aby włączyć buforowanie na 30 dni (lub cokolwiek Ci odpowiada).

  • Teraz uruchom proste polecenie git, które wymaga twojej nazwy użytkownika i hasła.

  • Wprowadź swoje dane logowania raz, a teraz buforowanie jest włączone przez 30 dni.

  • Spróbuj ponownie z dowolnym poleceniem git, a teraz nie potrzebujesz żadnych poświadczeń.

  • Aby uzyskać więcej informacji: - Buforowanie hasła GitHub w Git

Uwaga : Aby korzystać z pomocnika poświadczeń, potrzebujesz Git 1.7.10 lub nowszej wersji. Podczas ponownego uruchamiania systemu może być konieczne ponowne wprowadzenie hasła.

Nishant Thapliyal
źródło
1
Jesteś wybawcą, miałeś dość wpisywania hasła za każdym razem. Dzięki :)
Dave Ranjan
proszę określić, czy dotyczy to tylko Linuksa, tylko Windowsa lub obu.
joedotnot
@joedotnot dla wszystkich systemów operacyjnych. Możesz również przejrzeć wspomniany link, a pod nagłówkiem znajdziesz opcję systemu operacyjnego.
Nishant Thapliyal,
To! Działa w każdym przypadku.
Akaisteph7,
@Charles Cześć, właśnie przetestowałem to samo i działa zgodnie z oczekiwaniami.
Nishant Thapliyal
8

Rozszerzając przemyślenia Mueina dla tych, którzy wolą edytować pliki bezpośrednio niż uruchamianie poleceń w git-bash lub terminalu.

Przejdź do katalogu .git swojego projektu (katalog główny projektu na komputerze lokalnym) i otwórz plik „config”. Następnie wyszukaj [zdalne „pochodzenie”] i ustaw konfigurację adresu URL w następujący sposób:

[remote "origin"]
    #the address part will be different depending upon the service you're using github, bitbucket, unfuddle etc.
    url = [email protected]:<username>/<projectname>.git
uchamp
źródło
1
To naprawdę pomogło. Bezpieczny i czysty sposób na rozwiązanie problemu. Myślę, że ktoś powinien poprawić odpowiedź Mueina w tym przypadku.
Luis Ortega Araneda
1
„Idź do katalogu .git swojego projektu” próbując po raz pierwszy
osobliwy
Wystąpił błąd „krytyczny: nie obsługuję protokołu„ [email protected]: <nazwa użytkownika> / https ””
Shivam Bharadwaj
@ShivamBharadwaj szybkie wyszukiwanie ujawnił wątek stackoverflow.com/questions/30474447/... . Czy istnieje możliwość, że kopiujesz polecenie git clone z jakiejś witryny i napotykasz ten problem? Jeśli tak, spróbuj zamiast tego wpisać kompletne polecenie.
uchamp
6

Myślę, że są tutaj dwie różne rzeczy. Pierwszym z nich jest to, że normalne uwierzytelnianie SSH wymaga od użytkownika podania hasła do konta (gdzie hasło do konta zostanie uwierzytelnione różnymi metodami, w zależności od konfiguracji sshd).

Możesz uniknąć wprowadzania tego hasła za pomocą certyfikatów. W przypadku certyfikatów nadal musisz podać hasło, ale tym razem jest to hasło do twojego klucza prywatnego (który jest niezależny od hasła do konta).

Aby to zrobić, postępuj zgodnie z instrukcjami wskazanymi przez steveth45:

Z uwierzytelnianiem klucza publicznego .

Jeśli chcesz uniknąć wpisywania hasła certyfikatu za każdym razem, możesz użyć ssh-agent, jak wskazał DigitalRoss

Dokładny sposób, w jaki to robisz, zależy od systemu Unix vs. Windows, ale zasadniczo musisz uruchomić ssh-agent w tle podczas logowania, a następnie przy pierwszym logowaniu uruchomić ssh-add, aby dać agentowi twoje hasło. Wszystkie polecenia rodziny ssh skonsultują się z agentem i automatycznie podadzą twoje hasło.

Zacznij tutaj: man ssh-agent.

Jedynym problemem ssh-agenta jest to, że przynajmniej na * nix musisz umieścić hasło certyfikatu do każdej nowej powłoki. Następnie certyfikat jest „ładowany” i można go użyć do uwierzytelnienia na serwerze ssh bez podawania hasła. Ale to dotyczy tej konkretnej powłoki.

Z pęku kluczy możesz zrobić to samo, co ssh-agent, ale „na cały system”. Po włączeniu komputera otwierasz powłokę i podajesz hasło do certyfikatu. I wtedy każda inna powłoka użyje tego „załadowanego” certyfikatu, a twoje hasło nigdy nie będzie pytane, dopóki nie uruchomisz ponownie komputera.

Gnome ma podobną aplikację o nazwie Gnome Keyring, która pyta o hasło certyfikatu przy pierwszym użyciu, a następnie przechowuje je w bezpieczny sposób, abyś nie był więcej pytany.

Gaston
źródło
Sam używam pęku kluczy : bardzo przydatny.
Jakub Narębski
jest jeszcze jeden sposób, pisząc AddKeysToAgent yesw .ssh / config. Następnie jest ładowany do pamięci, dopóki nie
wyłączysz
4
ssh-keygen -t rsa

Gdy zostaniesz poproszony o hasło, zostaw je puste, tzn. Naciśnij enter. tak proste jak to!!

Srinivas Kattimani
źródło
4
Pamiętaj, że jeśli to zrobisz, każdy, kto ma dostęp do twojego klienta programistycznego, ma dostęp do serwera repozytorium bez potrzeby podawania hasła. Kombinacja ssh-agent / ssh-add zapewnia znacznie lepsze bezpieczeństwo.
Peter V. Mørch
3

Spróbuj tego z pudełka, z którego wypychasz

    ssh [email protected]

Powinieneś wtedy otrzymać mile widzianą odpowiedź od github i będzie dobrze, aby pchać.

toonsend
źródło
2
Działa dla mnie Hi gkucmierz! You've successfully authenticated, but GitHub does not provide shell access.Ale jakoś git wciąż pyta mnie o hasło, kiedy próbuję pchać
gkucmierz
2

Musiałem sklonować repozytorium git z serwera, który nie zezwalał na logowanie za pomocą klucza ssh, ale tylko za pomocą użytkownika / hasła. Nie znalazłem sposobu, aby skonfigurować wtyczkę Git tak, aby używała prostej kombinacji użytkownik / hasło, więc dodałem następujące polecenie powłoki jako krok przed kompilacją na komputerze z linuksem, który zależy od oczekiwanego narzędzia (apt-get install expect):

TO NIE JEST DOBRY SPOSÓB ROZWIĄZANIA TEGO PROBLEMU, JEŻELI HASŁO JEST WYŚWIETLANE JAKO JASNY TEKST W KONFIGURACJI I DZIENNIKACH JENKINS! UŻYWAJ JEDYNIE, JEŚLI NIE MA SPOSOBU KONFIGURACJI AUTORYZACJI KLUCZA RSA LUB INNYCH MOŻLIWOŚCI KONFIGURACJI!

rm -rf $WORKSPACE &&
expect -c 'set timeout -1; spawn git clone USER@MYHOST:/MYPATH/MYREPO.git $WORKSPACE; expect "password:" {send "MYPASSWORD\r"}; expect eof'
Jan
źródło
1

Dodaj pojedynczy wiersz AddKeysToAgent yesw górnej części pliku .ssh / config. Oczywiście ssh-agent musi być uruchomiony wcześniej. Jeśli nie działa (sprawdź przez prep ssh-agent), po prostu uruchom goeval $(ssh-agent)

Teraz klucz jest ładowany systemowo do pamięci i nie musisz ponownie wpisywać hasła.

Źródłem rozwiązania jest /ubuntu/362280/enter-ssh-passphrase-once/853578#853578

zaatakowany
źródło
0

Staram się cały czas unikać wpisywania hasła, ponieważ używam ssh w systemie Windows. To, co zrobiłem, to zmodyfikowałem mój plik .profile, aby wprowadzić hasło w jednej sesji. Oto fragment kodu:

    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

więc wpisuję moje hasło raz na sesję.

David Blay
źródło
-1

Wypróbowałem wszystkie te sugestie i jeszcze więcej, tylko po to, aby móc uzyskać klon z mojej instancji AWS. Nic nie działało. W końcu oszukałem z desperacji: skopiowałem zawartość pliku id_rsa.pub na mojej lokalnej maszynie i dołączyłem ją do ~ / .ssh / known_hosts w mojej instancji AWS.

alansendgi
źródło
1
Czy na pewno nie masz na myśli ~ / .ssh / uprawnionych_kluczy?
Kevin_Kinsey