Nie można otworzyć połączenia z agentem uwierzytelniającym

1604

Występuje błąd:

$ git push heroku master
Warning: Permanently added the RSA host key for IP address '50.19.85.132' to the list of known hosts.
!  Your key with fingerprint b7:fd:15:25:02:8e:5f:06:4f:1c:af:f3:f0:c3:c2:65 is not authorized to access bitstarter.

Próbowałem dodać klucze i poniżej pojawia się ten błąd:

$ ssh-add ~/.ssh/id_rsa.pub
Could not open a connection to your authentication agent.
Danny Dai Smith
źródło
26
Pytanie: po przejściu KAŻDEJ odpowiedzi na tej stronie i żadna z nich nie działa. Co możesz zrobić dalej?
Brandon Bertelsen
8
@BrandonBertelsen Wypróbuj ten: $ ssh-agent /bin/sh and $ ssh-add $yourkey
shyam
@BrandonBertelsen Następnie powinieneś użyć, git config --listaby sprawdzić, czy ustawiłeś credential.helper- jeśli tak, powinieneś usunąć to ustawienie, ponieważ pomocnik jest nieprzydatny.
yoyo

Odpowiedzi:

2382

Zacząłeś ssh-agent?

Może być konieczne uruchomienie ssh-agentprzed uruchomieniem ssh-addpolecenia:

eval `ssh-agent -s`
ssh-add

Pamiętaj, że spowoduje to uruchomienie agenta dla msysgit Bash w systemie Windows . Jeśli używasz innej powłoki lub systemu operacyjnego, może być konieczne użycie wariantu polecenia, takiego jak te wymienione w innych odpowiedziach .

Zobacz następujące odpowiedzi:

  1. ssh-add narzeka: Nie można otworzyć połączenia z agentem uwierzytelniającym
  2. Git push wymaga nazwy użytkownika i hasła (zawiera szczegółowe instrukcje dotyczące korzystania z ssh-agent)
  3. Jak uruchomić agenta uwierzytelniania (git / ssh)? .
  4. Nie można otworzyć połączenia z agentem uwierzytelniającym

Aby automatycznie uruchomić ssh-agent i pozwolić jednemu wystąpieniu działać w wielu oknach konsoli, zobacz Uruchamianie ssh-agent przy logowaniu .

Dlaczego musimy używać evalzamiast po prostu ssh-agent?

Aby dowiedzieć się, dlaczego, zobacz odpowiedź Robin Green .

Klucze publiczne a prywatne

Ponadto za każdym razem, gdy używam ssh-add, zawsze dodam do niego klucze prywatne. Plik ~/.ssh/id_rsa.pubwygląda jak klucz publiczny, nie jestem pewien, czy to zadziała. Czy masz ~/.ssh/id_rsaplik Jeśli otworzysz go w edytorze tekstów, czy powiesz, że jest to klucz prywatny?

Społeczność
źródło
17
@xtian Nie jestem pewien, czy rozumiem problem. Nie znam dokładnych szczegółów, ale zgaduję, że klucz prywatny nigdy nie jest wysyłany przez sieć. Myślę, że ssh-addpo prostu odszyfrowuje zaszyfrowany klucz prywatny na maszynie hosta, dzięki czemu można go używać lokalnie ... nigdy nie jest wysyłany do nikogo . Zgaduję, że tylko klucze publiczne są wysyłane przez sieć. Czy moje zrozumienie jest nieprawidłowe?
5
Jesteś zbyt miły Cupcake. Masz całkowitą rację. Mój błąd. ex tutaj ; ssh-add dodaje klucz prywatny użytkownika ssh-agent (działający proces) może działać w imieniu klienta / hosta z serwerem akceptującym klucze rsa-jakiekolwiek. Rany. Nie wiem, co mnie tak podnieciło.
xtian
21
Jestem ciekawy, dlaczego eval ssh-agent -sdziała, ale ssh-agentsam nie działa.
DanielM
12
@DanielM: SSH potrzebuje dwóch rzeczy, aby użyć ssh-agent: instancji ssh-agent działającej w tle i zestawu zmiennych środowiskowych, który mówi SSH, którego gniazda powinien użyć do połączenia z agentem ( SSH_AUTH_SOCKIIRC). Jeśli po prostu uruchomisz, ssh-agentagent się uruchomi, ale SSH nie będzie wiedział, gdzie go znaleźć.
Vanessa Phipps
4
Dzięki za odpowiedź. Właśnie zauważyłem, że użyłeś cudzysłowu w poleceniu. Jestem tak zdezorientowany, dlaczego backquote (`) działa dla polecenia eval, ale nie pojedynczy / podwójny cudzysłów (',') na mojej powłoce bash?
Weishi Zeng
539

Wypróbowałem inne rozwiązania bezskutecznie. Przeprowadziłem więcej badań i odkryłem, że następujące polecenie działa. Używam Windows 7 i Git Bash .

eval $(ssh-agent)

Więcej informacji na: https://coderwall.com/p/rdi_wq

Victor Alves
źródło
14
Pracował również w systemie Windows 8.
Andreas Rudolph
Używam również Windows 7 i Git Bash, a moja odpowiedź działa dobrze. Fajnie, że możesz to również zrobić w ten sposób.
2
Wspaniały !! Pracował również z Windows 10.
NitinM,
1
Pracowałem nad Manjaro
code_flow
1
$ eval "$ (ssh-agent -s)" pracował dla mnie na Windows 10
Andrew Anderson
261

Następujące polecenie działało dla mnie. Używam CentOS.

exec ssh-agent bash
mianjee
źródło
3
Dzięki, to zadziałało dla mnie, uruchomiłem 'exec ssh-agent zsh' dla mojej powłoki.
jasonmcclurg
2
Zgodnie z usuniętą „odpowiedzią” działa również na Amazon Linux AMI. Wydaje mi się, że jest to rozwiązanie Unix / Linux / * nix.
4
Wsadziłem do kontenera dokującego i ssh-add my.id_rsazawiodłem. Ale exec ssh-agent zshdał środowisko, w którym mogłem ssh-addbez problemu. I jestem w kontenerze dokerów :)
markuz-gj
Czy ktoś może krótko wyjaśnić, na czym mógł polegać problem? Dzięki :) Działa to również na moim Ubuntu 14.04.
harkirat1892
pracowałem też nad raspbianem
mega_creamery
215

MsysGit lub Cygwin

Jeśli używasz Msysgit lub Cygwin, możesz znaleźć dobry tutorial w SSH-Agent w msysgit i cygwin i bash :

  1. Dodaj plik wywoływany .bashrcdo folderu domowego.

  2. Otwórz plik i wklej:

    #!/bin/bash
    eval `ssh-agent -s`
    ssh-add
    
  3. Zakłada się, że klucz znajduje się w konwencjonalnej ~/.ssh/id_rsalokalizacji. Jeśli nie, podaj pełną ścieżkę po ssh-addpoleceniu.

  4. Dodaj lub utwórz plik ~/.ssh/configz zawartością

    ForwardAgent yes
    

    W oryginalnym samouczku ForwardAgentparam jest Yes, ale to literówka. Użyj wszystkich małych liter, aby uzyskać błędy.

  5. Uruchom ponownie Msysgit. Poprosi cię o podanie hasła raz i to wszystko (aż do zakończenia sesji lub zabicia twojego agenta ssh).

Mac OS X

Jeśli nie chcesz uruchamiać nowego agenta ssh za każdym razem, gdy otwierasz terminal, sprawdź Keychain . Jestem teraz na komputerze Mac, więc użyłem samouczka ssh-agent z zsh & keychain w Mac OS X, aby go skonfigurować, ale jestem pewien, że wyszukiwarka Google będzie zawierała wiele informacji dla systemu Windows.

Aktualizacja : lepszym rozwiązaniem na Macu jest dodanie klucza do pęku kluczy Mac OS:

ssh-add -K ~/.ssh/id_rsa

Proste.

RobW
źródło
1
FYI: scalono ze stackoverflow.com/questions/4083079/...
Shog9
1
Kiedy to robię, eval `ssh-agent -s`proces nie zatrzymuje się, kiedy wychodzę z cygwina.
Kiril
Czy istnieje sposób na skonfigurowanie konfiguracji dla Windows / gitbash, abyś nie musiał tego robić za każdym razem?
mix3d
4
Powinno tak być ps -u $(whoami) | grep ssh-agent &> /dev/null || eval $(ssh-agent)- w przeciwnym razie za każdym razem uruchamiany jest nowy agent ssh. Zabijałem moją maszynę co jakiś czas, gdy użytkownik miał cronjobs.
niszczenie
3
ForwardAgent yesnie jest konieczne i nie jest teoretycznym zagrożeniem bezpieczeństwa, jeśli jest ustawione dla dowolnego niezaufanego serwera. Lokalny dostęp do Twojego kluczowego agenta powinien działać niezależnie od tego ustawienia.
SeldomNeedy
208

Nie można otworzyć połączenia z agentem uwierzytelniającym

Aby rozwiązać ten błąd:

grzmotnąć:

$ eval `ssh-agent -s`

tcsh:

$ eval `ssh-agent -c`

Następnie używaj ssh-addjak zwykle.


Gorąca wskazówka:

Zawsze zapomniałem, co wpisać dla powyższych poleceń ssh-agent, więc utworzyłem w moim .bashrcpliku alias w następujący sposób:

alias ssh-agent-cyg='eval `ssh-agent -s`'

Teraz zamiast używać ssh-agent, mogę używaćssh-agent-cyg

Na przykład

$ ssh-agent-cyg
SSH_AUTH_SOCK=/tmp/ssh-n16KsxjuTMiM/agent.32394; export SSH_AUTH_SOCK;
SSH_AGENT_PID=32395; export SSH_AGENT_PID;
echo Agent pid 32395;
$ ssh-add ~/.ssh/my_pk

Oryginalne źródło poprawki:

http://cygwin.com/ml/cygwin/2011-10/msg00313.html

Chris Snow
źródło
3
będziesz musiał uruchomić evalpolecenie za każdym razem, gdy wcześniej byłeś uruchamiany ssh-agent. Teraz używam aliasu, zobacz zaktualizowaną odpowiedź na pytanie, jak to zrobić.
Chris Snow
1
FYI: scalono ze stackoverflow.com/questions/4083079/...
Shog9
Musiałem także użyć specyfikacji ssh zamiast https (patrz help.github.com/articles/changing-a-remote-s-url )
RunHolt
1
Proszę pana, jesteś niesamowity. Dzięki. ** I w obliczu tego samego problemu podczas klonowania repo bitbucket, bym już ustawienie klucza ssh, ale ciągle się błąd: fatal: Could not read from remote repository..
Nishant Ghodke
Pracował dla mnie na
systemie
116

Napotkałem ten sam problem dla Linuksa i oto co zrobiłem:

Zasadniczo polecenie ssh-agent uruchamia agenta, ale tak naprawdę nie ustawia zmiennych środowiskowych do uruchomienia. Po prostu wysyła te zmienne do powłoki.

Musisz:

eval `ssh-agent`

a następnie wykonaj ssh-add. Zobacz Nie można otworzyć połączenia z agentem uwierzytelniającym .

n3o
źródło
1
FYI: scalono ze stackoverflow.com/questions/4083079/...
Shog9
Pracowałem również dla mnie, gdy miałem problem z używaniem boot2docker w systemie Windows.
Veve,
Właśnie to mi zajęło.
Tom
115

ssh-add i ssh (zakładając, że korzystasz z implementacji openssh) wymagają zmiennej środowiskowej, aby wiedzieć, jak rozmawiać z agentem ssh. Jeśli agent został uruchomiony w innym oknie wiersza polecenia niż ten, którego używasz teraz, lub jeśli został uruchomiony niepoprawnie, ani ssh-add, ani ssh nie zobaczą ustawionej zmiennej środowiskowej (ponieważ zmienna środowiskowa jest ustawiona lokalnie na polecenie monit jest ustawiony).

Nie mówisz, której wersji ssh używasz, ale jeśli używasz cygwina, możesz użyć tego przepisu od SSH Agent na Cygwin :

# Add to your Bash config file
SSHAGENT=/usr/bin/ssh-agent
SSHAGENTARGS="-s"
if [ -z "$SSH_AUTH_SOCK" -a -x "$SSHAGENT" ]; then
    eval `$SSHAGENT $SSHAGENTARGS`
    trap "kill $SSH_AGENT_PID" 0
fi

Spowoduje to automatyczne uruchomienie agenta dla każdego nowego okna wiersza polecenia, które otworzysz (co jest nieoptymalne, jeśli otworzysz wiele wierszy polecenia w jednej sesji, ale przynajmniej powinno działać).

Robin Green
źródło
1
FYI: scalono ze stackoverflow.com/questions/4083079/...
Shog9
9
Byłem tutaj powiązany z innym pytaniem SO. Czy mogę zapytać, dlaczego konieczne jest dodanie tego do pliku konfiguracyjnego Bash? Na moim komputerze wszystko, co muszę zrobić, to uruchomić eval $(ssh-agent)i mogę używać ssh bez hasła dla każdego nowego okna terminala.
Andy J,
To nie powinno być możliwe, chyba że uruchamiasz nowe terminale z tego terminala.
Robin Green,
113

Biegać

ssh-agent bash
ssh-add

Aby uzyskać więcej informacji, możesz wyszukać

ssh-agent

lub biegnij

man ssh-agent
bp zhang
źródło
7
Polecam, jeśli pracujesz z git bash na Windowsie, spróbuj tego.
Neeraj Sewani
@ neer17 to pozwoliło mi korzystać ssh-copy-idz Ubuntu. Nie jestem pewien, dlaczego nie mogłem dodać klucza bez ssh-agenturuchomienia bash.
SomeGuyOnAComputer
2
To jest dla systemu Windows! (testowany na kompilacji W10pro 1809 i git 2.21.0)
Alfabravo
Używam ZSH i to działa dla mnie:ssh-agent zsh; ssh-add
sirboderafael
97

Spróbuj wykonać następujące kroki:

1) Otwórz Git Bash i uruchom: cd ~/.ssh

2) Spróbuj uruchomić agenta: eval $(ssh-agent)

3) W tej chwili możesz uruchomić następujące polecenie: ssh-add -l

ChechoroArtem
źródło
9
Jest to jedyne rozwiązanie, które tutaj działało dla mnie (w Windows 7). Pierwszy użyłem ps aux | grep sshi killpolecenia w odpowiedzi Ricka zabić agentów. Potem ssh-adddziałało bez przełącznika -l (użycie -l dało błąd). eval 'ssh-agent'ponieważ w odpowiedzi Ricka nie zadziałało, musiałem użyć tutaj eval $(ssh-agent)jak w odpowiedzi Chechoro.
Frug
6
+1 Miałem dokładnie taki sam problem jak OP (Windows 7) i jest to jedyne rozwiązanie, które działało dla mnie.
Weblurk
1
FYI: scalono ze stackoverflow.com/questions/4083079/...
Shog9
2
@Frug To backtyki, a nie apostrofy; w skrypcie powłoki, co oznacza wykonanie tego, co jest w środku. $(ssh-agent)jest równoważne, `ssh-agent`ale bardziej czytelne.
MM
96

Zamiast używać $ ssh-agent -s, $ eval `ssh-agent -s`rozwiązałem ten problem.

Oto, co zrobiłem krok po kroku (krok 2 w GitBash):

  1. Wyczyściłem mój folder .ssh w C:\user\<username>\.ssh\
  2. Wygenerowano nowy klucz SSH
    $ ssh-keygen -t rsa -b 4096 -C "[email protected]"
  3. Sprawdź, czy którykolwiek identyfikator procesu (agent ssh) jest już uruchomiony.
    $ ps aux | grep ssh
  4. (Opcjonalnie) Jeśli znajdziesz jakieś w kroku 3, zabij je
    $ kill <pids>
  5. Uruchomiono agenta ssh
    $ eval `ssh-agent -s`
  6. Dodano klucz ssh wygenerowany w kroku 2 do agenta ssh
    $ ssh-add ~/.ssh/id_rsa
vinsinraw
źródło
3
„eval” nie jest rozpoznawany jako wewnętrzna lub zewnętrzna komenda, program operacyjny lub plik wsadowy.
Chutipong Roobklom,
Możesz po prostu zrestartować agenta poprzez eval ssh-agent -si dodać starszy klucz za pomocą ssh-add ~ / .ssh / id_rsa. Jeśli wygenerujesz nowy klucz SSH, musisz zaktualizować ten klucz we wszystkich swoich usługach, takich jak github, bitbucket itp.
Mohit Satish Pawar
Czy istnieje sposób, aby to przetrwało Ponowne uruchamianie systemu Windows? Po ponownym uruchomieniu nie działa, dopóki nie uruchomię ponownie „eval ssh-agent -s” i „ssh-add ~ / .ssh / id_rsa”.
Michal Vician,
1
po długim szukaniu jest to rozwiązanie, które zadziałało
Sujit.Warrier
Świetne wyjaśnienie!
avivamg
56

W Windows 10 próbowałem wszystkich wymienionych tutaj odpowiedzi, ale żadna z nich nie działała. W rzeczywistości dają wskazówki. Aby rozwiązać problem, potrzebujesz 3 poleceń. Idea tego problemu polega na tym, że ssh-add potrzebuje zmiennych środowiskowych SSH_AUTH_SOCK i SSH_AGENT_PID do ustawienia z bieżącą ścieżką pliku skarpety ssh-agent i numerem pid.

ssh-agent -s > temp.txt

Spowoduje to zapisanie danych wyjściowych ssh-agent w pliku. Zawartość pliku tekstowego będzie wyglądać mniej więcej tak:

SSH_AUTH_SOCK=/tmp/ssh-kjmxRb2764/agent.2764; export SSH_AUTH_SOCK;
SSH_AGENT_PID=3044; export SSH_AGENT_PID;
echo Agent pid 3044;

Skopiuj coś takiego jak „/tmp/ssh-kjmxRb2764/agent.2764” z pliku tekstowego i uruchom następującą komendę bezpośrednio w konsoli:

set SSH_AUTH_SOCK=/tmp/ssh-kjmxRb2764/agent.2764

Skopiuj coś takiego jak „3044” z pliku tekstowego i uruchom następujące polecenie bezpośrednio w konsoli:

set SSH_AGENT_PID=3044

Teraz, gdy zmienne środowiskowe (SSH_AUTH_SOCK i SSH_AGENT_PID) są ustawione dla bieżącej sesji konsoli, uruchom komendę ssh-add, aby połączyć się ponownie z agentem ssh.

NIEBEZPIECZEŃSTWO
źródło
2
Dziękuję Ci! Właśnie tego potrzebowałem.
Isochronous,
6
Nie, wciąż to samo.
Jaskey,
3
Kroki te są takie same jak robienie „eval $ (ssh-agent)”
K.Nicholas
2
Naprawiono na moim Windows 10! Dziękuję Ci!
ntl
1
To rzeczywiście pomógł mi uratować kwestię na Linux ... tylko potrzebne do zastąpienia setprzezexport
Greg hor
30

Jedną z rzeczy, na które natrafiłem, było to, evalże nie działało dla mnie przy użyciu Cygwin, to, co zadziałało, było dla mnie ssh-agent ssh-add id_rsa.

Potem natknąłem się na problem, że mój klucz prywatny był zbyt otwarty, rozwiązanie, które udało mi się znaleźć ( stąd ):

chgrp Users id_rsa

jak również

chmod 600 id_rsa

w końcu mogłem użyć:

ssh-agent ssh-add id_rsa
Vnge
źródło
Czy używasz eval `ssh-agent`, z backticks `wokół ssh-agent, jak pokazano na moją odpowiedź ? W Cygwin dobrze mi to działało. Wydaje się, że masz rację, która ssh-agent ssh-addrównież działa, przynajmniej w msysgit Bash. Należy jednak pamiętać, że id_rsajest to domyślny klucz, który jest używany, więc nie trzeba go określać za pomocą ssh-agent ssh-add id_rsa.
Wydaje
1
OMG, ROZWIĄZALIŚCIE MOJE KILKA GODZIN FRUSTATION. Dzięki!
Chee Loong Wkrótce
Ta odpowiedź zadziałała dla mnie w bash.
Lsakurifaisu
27

Aby wzmocnić odpowiedź n3o dla systemu Windows 7 ...

Moim problemem było to, że niektóre wymagane zmienne środowiskowe nie zostały ustawione, a n3o jest poprawne, ponieważ ssh-agent mówi ci jak ustawić te zmienne środowiskowe, ale tak naprawdę ich nie ustawia.

Ponieważ system Windows nie pozwala wykonać „ewaluacji”, oto, co należy zrobić:

Przekieruj wyjście ssh-agent do pliku wsadowego za pomocą

ssh-agent > temp.bat

Teraz użyj edytora tekstu, takiego jak Notatnik, aby edytować temp.bat. Dla każdego z pierwszych dwóch wierszy: - Wstaw słowo „set” i spację na początku wiersza. - Usuń pierwszy średnik i wszystko, co następuje.

Teraz usuń trzeci wiersz. Twój temp.bat powinien wyglądać mniej więcej tak:

set SSH_AUTH_SOCK=/tmp/ssh-EorQv10636/agent.10636
set SSH_AGENT_PID=8608

Uruchom temp. Bat. Spowoduje to ustawienie zmiennych środowiskowych niezbędnych do działania ssh-add.

Steve Saporta
źródło
Nadal otrzymuję, Could not open a connection to your authentication agent.gdy uruchamiam ssh-add w Win10 PowerShell.
Kebman
19

Właśnie to działa. Otwórz swój ~/.ssh/configplik.

Dołącz następujące-

Host github.com
 IdentityFile ~/.ssh/github_rsa

Strona, która dała mi podpowiedź Skonfiguruj SSH dla Gita, powiedziała, że ​​wcięcie pojedynczej przestrzeni jest ważne ... chociaż miałem tutaj konfigurację z Heroku, która nie miała tej przestrzeni i działała poprawnie.

Paul Becotte
źródło
1
Nie pomaga to w wprowadzeniu hasła dla klucza SSH.
alesch
1
Jeśli nie chcesz wprowadzać hasła, utwórz klucz bez niego. Hasła nie ma sensu, jeśli i tak zamierzasz je zapisać w skrypcie.
Paul Becotte,
Taki jest sens używania ssh-agent. Hasło do twoich kluczy jest przechowywane w bezpiecznym pęku kluczy, obsługiwanym przez ssh-agent.
alesch
To jest dla mnie najlepsza odpowiedź. Miałem wiele problemów z uruchamianiem ssh-agent tysiące razy w systemie Windows 7 i pułapka zabicia nie załatwiła problemu. Nie mam nic przeciwko temu, że nie mam hasła na moim komputerze w domu.
Fleshgrinder,
18

Jeśli zastosujesz się do tych instrukcji, problem zostanie rozwiązany.

Jeśli korzystasz z komputera Mac lub Linux, wpisz:

eval "$(ssh-agent -s)"

Jeśli korzystasz z komputera z systemem Windows, wpisz:

ssh-agent -s
Fahim Boron
źródło
13

Pozwól, że zaoferuję inne rozwiązanie. Jeśli właśnie zainstalowałeś Git 1.8.2.2 lub inne i chcesz włączyć SSH, postępuj zgodnie z dobrze napisanymi instrukcjami .

Wszystko do kroku 5.6, gdzie możesz natknąć się na niewielką przeszkodę. Jeśli agent SSH już działa, podczas ponownego uruchamiania bash może pojawić się następujący komunikat o błędzie

Could not open a connection to your authentication agent

Jeśli tak, użyj następującego polecenia, aby sprawdzić, czy działa więcej niż jeden proces agenta ssh

ps aux | grep ssh

Jeśli zobaczysz więcej niż jedną usługę agenta ssh, musisz zabić wszystkie te procesy. Użyj polecenia kill w następujący sposób (PID będzie unikalny na twoim komputerze)

kill <PID>

Przykład:

kill 1074

Po usunięciu wszystkich procesów ssh-agent, uruchom px aux | ponownie polecenie grep ssh, aby upewnić się, że ich nie ma, a następnie uruchom ponownie Bash.

Voila, powinieneś teraz dostać coś takiego:

Initializing new SSH agent...
succeeded
Enter passphrase for /c/Users/username/.ssh/id_rsa:

Teraz możesz kontynuować od kroku 5.7 i dalej.

Stóg
źródło
dała mi przejść blokadę drogi, tyvm
Jason Fingar
Chciałem tylko dodać, że w moim przypadku jednym z wymienionych elementów jest proces grep, z którym przeprowadzamy wyszukiwanie, ale jest on już zabity po jego wykonaniu. Gra słów nie przeznaczona.
Ryan Mortensen
12

Uwaga: jest to odpowiedź na to pytanie , które zostało połączone z tym pytaniem . To pytanie dotyczyło systemu Windows 7, co oznacza, że ​​moja odpowiedź dotyczyła Cygwin / MSYS / MSYS2. Ten wydaje się dla niektórych systemów uniksowych, w których nie spodziewałbym się, że agent SSH będzie wymagał takiego zarządzania .

Spowoduje to uruchomienie agenta SSH i uwierzytelnienie tylko za pierwszym razem, gdy go potrzebujesz , nie za każdym razem, gdy otwierasz terminal Bash. Można go używać do dowolnego programu używającego ogólnie SSH, w tym samego ssh i scp. Po prostu dodaj to do /etc/profile.d/ssh-helper.sh:

ssh-auth() {
    # Start the SSH agent only if not running
    [[ -z $(ps | grep ssh-agent) ]] && echo $(ssh-agent) > /tmp/ssh-agent-data.sh

    # Identify the running SSH agent
    [[ -z $SSH_AGENT_PID ]] && source /tmp/ssh-agent-data.sh > /dev/null

    # Authenticate (change key path or make a symlink if needed)
    [[ -z $(ssh-add -l | grep "/home/$(whoami)/.ssh/id_rsa") ]] && ssh-add
}

# You can repeat this for other commands using SSH
git() { ssh-auth; command git "$@"; }
Renato Silva
źródło
1
FYI: scalono ze stackoverflow.com/questions/4083079/...
Shog9
2
Wydaje się, że proces ssh-agent nie jest powiązany z tym samym terminalem, który został użyty do jego uruchomienia. Chyba ps -A | grep ssh-agentlub ps h -C ssh-agentpowinien być stosowany zamiastps | grep ssh-agent
Alexis
1
Użycie łącznika w nazwie funkcji może nie być zalecane. Nie wiem dlaczego, ale przeczytaj to . Na przykład znalazłem, że echo ssh-auth | bashto się nie powiedzie.
Alexis
1
Możesz to po prostu trochę poprawić. Wystarczy sprawdzić, czy działa i przypisać zmienne env. A następnie dodaj AddKeysToAgent yes(lub użyj prompt) do wpisu konfiguracji ssh (użyj Host *dla wszystkich hostów). W ten sposób zostaniesz poproszony o podanie hasła SSH tylko wtedy, gdy faktycznie spróbujesz się połączyć, w przeciwnym razie możesz zostać poproszony o podanie hasła prostego git difflub git status.
ST-DDT,
2
$HOME/.sshmoże być bardziej solidny niż/home/$(whoami)/.ssh
Ari Sweedler
12

Miałem ten sam problem, Ubuntua inne rozwiązania mi nie pomogły. W końcu zrozumiałem, na czym polega mój problem. Utworzyłem moje sshklucze w /root/.sshfolderze, więc nawet kiedy działałem ssh-addjako root, nie mógł wykonać swojej pracy i powtarzać

Could not open a connection to your authentication agent.

Utworzyłem moje klucze publiczne i prywatne ssh w /home/myUsername/folderze i użyłem

ssh-agent /bin/sh

potem pobiegłem

ssh-add /home/myUsername/.ssh/id_rsa

i problem został rozwiązany w ten sposób.

Uwaga: Aby uzyskać dostęp do repozytorium, gitdodaj hasło git podczas tworzenia sshkluczy za pomocą ssh-keygen -t rsa -C "your git email here".

Akram
źródło
11

Dla użytkowników okien zauważyłem, że cmd eval `ssh-agent -s`nie działa, ale korzystanie z git bash działało eval `ssh-agent -s`; ssh-add KEY_LOCATION, i upewniając się, że usługa Windows „Zarządzanie kluczem OpenSSH” nie jest wyłączona

aqm
źródło
9

Użyj parametru -A podczas łączenia się z serwerem, przykład:

ssh -A root@myhost

ze strony man:

-A Enables forwarding of the authentication agent connection.  
   This can also be specified on a per-host basis in a configuration file.

   Agent forwarding should be enabled with caution.  Users with the ability to bypass file permissions on the remote host (for the agent's
   UNIX-domain socket) can access the local agent through the forwarded 
   connection.  An attacker cannot obtain key material from the agent,
   however they can perform operations on the keys that enable them to
   authenticate using the identities loaded into the agent.
Lebnik
źródło
Co to robi i dlaczego?
erikbwork
zgodnie ze stroną podręcznika ... man ssh ... -A Umożliwia przekazywanie połączenia agenta uwierzytelniania. Można to również określić dla każdego hosta w pliku konfiguracyjnym.
Scott Stensland,
8

Odpowiedzi na podstawowe rozwiązanie można znaleźć ssh-agentw wielu odpowiedziach. Jednak ssh-agentwielokrotne ssh-agenturuchomienie (dla każdego otwartego terminala lub zdalnego logowania) spowoduje utworzenie wielu kopii uruchomionych w pamięci. Skrypty sugerowane w celu uniknięcia tego problemu są długie i wymagają zapisania i / lub skopiowania oddzielnego pliku lub zapisania zbyt wielu ciągów znaków w ~/.profilelub ~/.schrc. Pozwól, że zasugeruję proste rozwiązanie dwuciągowe:

Dla sh , bash itp:

# ~/.profile
if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -s > ~/.ssh-agent.sh; fi
. ~/.ssh-agent.sh

Dla csh , tcsh itp:

# ~/.schrc
sh -c 'if ! pgrep -q -U `whoami` -x 'ssh-agent'; then ssh-agent -c > ~/.ssh-agent.tcsh; fi'
eval `cat ~/.ssh-agent.tcsh`

Co tu jest:

  • wyszukaj proces ssh-agentwedług nazwy i bieżącego użytkownika
  • utwórz odpowiedni plik skryptu powłoki, wywołując ssh-agenti uruchom ssh-agentsię, jeśli nie ssh-agentznaleziono procesu bieżącego użytkownika
  • oceń stworzony skrypt powłoki, który konfiguruje odpowiednie środowisko

Nie ma potrzeby ochrony utworzonego skryptu powłoki ~/.ssh-agent.tcshlub ~/.ssh-agent.shdostępu innych użytkowników, ponieważ: na początku komunikacja z ssh-agentprzetwarzana jest przez chronione gniazdo, które nie jest dostępne dla innych użytkowników, a na drugim etapie inni użytkownicy mogą znaleźć ssh-agentgniazdo proste dzięki wyliczeniu plików w /tmp/katalogu. Jeśli chodzi o dostęp do ssh-agentprocesu, są to te same rzeczy.

oklas
źródło
6

Spróbuj wykonać następujące czynności:

ssh-agent sh -c 'ssh-add && git push heroku master'
kenorb
źródło
1
Wygląda na czysty sposób na zrobienie tego.
Leon Grapenthin,
6

Przeczytaj wyjaśnienia @ cupcake . Tutaj tylko próbuję zautomatyzować poprawkę.

Jeśli używasz terminalu Cygwin z BASH, dodaj następujące polecenie do pliku $ HOME / .bashrc. To uruchamia ssh-agent tylko raz w pierwszym terminalu Bash i dodaje klucze do ssh-agent. (Nie jestem pewien, czy jest to wymagane w systemie Linux)

###########################
# start ssh-agent for
# ssh authentication with github.com
###########################
SSH_AUTH_SOCK_FILE=/tmp/SSH_AUTH_SOCK.sh
if [ ! -e $SSH_AUTH_SOCK_FILE ]; then
    # need to find SSH_AUTH_SOCK again.
    # restarting is an easy option
    pkill ssh-agent
fi
# check if already running
SSH_AGENT_PID=`pgrep ssh-agent`
if [ "x$SSH_AGENT_PID" == "x" ]; then
#   echo "not running. starting"
    eval $(ssh-agent -s) > /dev/null
    rm -f $SSH_AUTH_SOCK_FILE
    echo "export SSH_AUTH_SOCK=$SSH_AUTH_SOCK" > $SSH_AUTH_SOCK_FILE
    ssh-add $HOME/.ssh/github.com_id_rsa 2>&1 > /dev/null
#else
#   echo "already running"
fi
source $SSH_AUTH_SOCK_FILE

NIE ZAPOMNIJ, aby dodać poprawne klucze w poleceniu „ssh-add”.

Kiran Mohan
źródło
5

Miałem ten problem, kiedy zaczynałem ssh-agent, kiedy już działał. Zmiesza się. Aby sprawdzić, czy tak jest, użyj

eval $(ssh-agent)

aby sprawdzić, czy to jest to samo, co według ciebie powinno być. W moim przypadku był inny niż ten, który właśnie zacząłem.

Aby dalej sprawdzić, czy masz więcej niż jednego agenta ssh, możesz przejrzeć:

ps -ef | grep ssh
Jahmic
źródło
2
Myślę, że bieganie eval $(ssh-agent)powinno za każdym razem tworzyć nowego agenta z innym PID, chociaż mogę się mylić.
4

Miałem podobny problem, gdy próbowałem to uruchomić w systemie Windows, aby połączyć się z ukrytym za pośrednictwem ssh

Oto rozwiązanie, które zadziałało dla mnie.

  1. Okazuje się, że uruchomiłem agenta sant Pageant na moim Windowsie - sprawdziłbym, co masz uruchomione. Podejrzewam, że jest to Pageant, ponieważ jest domyślnie dostępny w Putty i winScp

  2. Program ssh-add nie działa z wiersza komend dla tego typu agenta

  3. Musisz dodać klucz prywatny za pomocą okna interfejsu użytkownika, które można uzyskać, klikając dwukrotnie ikonę Pageant na pasku zadań (po uruchomieniu).

  4. Zanim dodasz klucz do Pageant, musisz przekonwertować go na format PPK. Pełne instrukcje są dostępne tutaj Jak przekonwertować klucz SSH na format ppk

  5. To jest to. Po przesłaniu klucza do schowka mogłem użyć SourceTree do utworzenia lokalnego repozytorium i sklonowania pilota.

Mam nadzieję że to pomoże...

Moonwalker
źródło
3

Rozwiązałem błąd, wymuszając zatrzymanie (zabicie) procesów git (agent ssh), następnie odinstalowanie Git, a następnie ponowne zainstalowanie Git.

Devendra Singh
źródło
2
Podejrzewam, że wszystko, co musisz zrobić, to po prostu zabić istniejące procesy agenta, a następnie ponownie uruchomić jeden, zamiast konieczności ponownej instalacji Gita.
3

Używając Git Bash na Win8.1E, moja rozdzielczość była następująca:

eval $(ssh-agent) > /dev/null
ssh-add ~/.ssh/id_rsa
SrBlanco
źródło
Dlaczego konieczne jest wyjście /dev/null? Twoja odpowiedź w zasadzie robi dokładnie to samo, co ta .
Chciałbym również zauważyć, że ~/.ssh/id_rsajest to klucz domyślny, więc nie powinieneś musieć określać ssh-add ~/.ssh/id_rsa, po prostu ssh-addpowinien działać.
Próbowałem Twojego rozwiązania w tym samym środowisku @Cupcake, to nie działa. Nie rozumiem też, dlaczego to jest odpowiedź, ale dopóki nie zrobię tego w ten sposób, nigdy nie zadziała.
nighliber
3

Jeśli używasz Putty, być może musisz ustawić opcję „Połączenie / SSH / Auth / Allow agent forwarding” na „true”.

wprowadź opis zdjęcia tutaj

Vladius
źródło
3

To zadziałało dla mnie.

W oknie CMD wpisz następujące polecenie:

cd path-to-Git/bin # (for example,cd C:\Program Files\Git\bin)
bash
exec ssh-agent bash
ssh-add path/to/.ssh/id_rsa
kecco
źródło
3

W przypadku basha wbudowanego w Windows 10 dodałem to do .bash_profile:

if [ -z $SSH_AUTH_SOCK ]; then
    if [ -r ~/.ssh/env ]; then
            source ~/.ssh/env
            if [ `ps -p $SSH_AGENT_PID | wc -l` = 1 ]; then
                    rm ~/.ssh/env
                    unset SSH_AUTH_SOCK
            fi
    fi
fi

if [ -z $SSH_AUTH_SOCK ]; then
    ssh-agent -s | sed 's/^echo/#echo/'> ~/.ssh/env
    chmod 600 ~/.ssh/env
    source ~/.ssh/env > /dev/null 2>&1
fi
Wyrko
źródło
1
Nie wiem, dlaczego wklejasz tak dużo tekstu, skoro mogłeś po prostu zadzwonić, $(ssh-agent -s)aby ustawić środowisko agenta.
erikbwork
1
To zadziałało, kiedy użyłem go po raz pierwszy. Ale po ponownym uruchomieniu systemu problem faktycznie się pogorszył. Z ssh nie działa w ogóle więcej. Niepolecane.
yspreen