Jak uniknąć pytania o hasło za każdym razem, gdy wypycham Bitbucket

217

Skonfigurowałem moje rzeczy ssh za pomocą tego przewodnika i działało to dobrze (mogłem biegać hg pushbez pytania o hasło). Co mogło się zdarzyć od tego czasu do teraz, biorąc pod uwagę, że nadal korzystam z tego samego katalogu domowego.

$ cat .hg/hgrc 
[paths]
default = ssh://[email protected]/tshepang/bloog

$ hg push
Enter passphrase for key '/home/wena/.ssh/id_rsa': 
pushing to ssh://[email protected]/tshepang/bloog
searching for changes
...
tshepang
źródło

Odpowiedzi:

337

Musisz użyć agenta ssh. Krótka odpowiedź: spróbuj

$ ssh-add

przed pchaniem. Na żądanie podaj hasło.

Jeśli nie korzystasz jeszcze z agenta ssh, pojawi się następujący komunikat:

Could not open a connection to your authentication agent.

W takiej sytuacji możesz go uruchomić i odpowiednio skonfigurować środowisko

eval $(ssh-agent)

Następnie powtórz ssh-addpolecenie.

Warto przyjrzeć się stronie man agenta ssh .

jmtd
źródło
2
Jaki jest sens evalpisania po prostu ssh-agent?
James McMahon,
4
Wyświetla niektóre polecenia, które pozwalają ci z niego korzystać, i nie wykonuje ich za ciebie; evalrobi kalkulację.
tshepang
Nie ma związku z pierwotnym pytaniem, ale jeśli nadal masz te problemy w GitHub, Bitbucket itp., Upewnij się, że używasz adresu URL git / ssh, a nie http, który będzie wymagał podania nazwy użytkownika i hasła.
Czechnology
A jeśli nie masz domyślnego klucza lub chcesz dodać wielokrotności,ssh-add /path/to/key
hoosierEE
46

Sposób, aby rozwiązać ten problem jest z ssh-agenti ssh-add:

$ exec ssh-agent bash
$ ssh-add
Enter passphrase for ~/.ssh/id_rsa: 

Następnie hasło zostanie zapisane dla bieżącej sesji. i nie będę więcej pytany

Stefan
źródło
7
Większość ludzi w ogóle nie chce być obrzucana błędami.
connexo
26

Używam pęku kluczy do zarządzania kluczami ssh. Jest także dostępny w Debianie i prawdopodobnie w Ubuntu

apt-get install keychain

Oto strona pakietu pęku kluczy Debiana . Jak widać, projekt nie jest zbyt aktywny, ale działa dla mnie. Skomentowałem też trochę na ten temat w innej odpowiedzi tutaj

Faheem Mitha
źródło
2
//, To zadziałało dla mnie. Jest o wiele lepszy niż ssh-agent, ponieważ nie muszę wprowadzać hasła klucza ssh za każdym razem, gdy otwieram terminal .
Nathan Basanese,
@NathanBasane, czy mówisz, że używając pęku kluczy nie musisz wprowadzać hasła klucza SSH za każdym razem, gdy otwierasz terminal? Jak to skonfigurować? ponieważ pęku kluczy ciągle pyta o hasło za każdym razem, gdy otwieram terminal, tylko za pierwszym razem, gdy otwieram go po uruchomieniu, ale nadal. Nie chcę wprowadzać hasła za każdym razem.
m4l490n
@ m4l490n Nie, jeśli używasz pęku kluczy, nie musisz wprowadzać hasła klucza ssh za każdym razem, gdy otwierasz terminal. Ale musisz go wprowadzić raz po uruchomieniu. Hasło nie jest zapisywane na dysku - byłoby to niebezpieczne.
Faheem Mitha
Dla mnie pyta za każdym razem, gdy się loguję (mam repozytorium git + klucze ssh na zdalnym serwerze i za każdym razem, gdy wykonuję „git pull”, muszę wpisać hasło)
Martin Thoma,
@MartinThoma To wygląda źle. Sprawdź, czy poprawnie skonfigurowałeś .ssh. W szczególności, czy twoja powłoka jest poprawnie skonfigurowana? Jeśli nadal nie działa i nie możesz tego rozgryźć, możesz zadać pytanie.
Faheem Mitha
13

Utwórz (lub edytuj, jeśli istnieje) następujący plik ~ / .ssh / config:

Host *
    UseKeychain yes
    AddKeysToAgent yes
    IdentityFile ~/.ssh/id_rsa
ness-EE
źródło
Ale używam innej pary kluczy do każdej usługi ...
connexo
@connexo możesz zastąpić gwiazdkę wieloznaczną indywidualną nazwą hosta, a „id_rsa” odpowiednim kluczem prywatnym
ness-EE
1
Musiałem dodać IgnoreUnknown AddKeysToAgent,UseKeychaintuż powyżej UseKeychain yes.
consideRatio
1
Pojawia się błąd: „Zła opcja konfiguracji: usekeychain” w wierszu „UseKeychain tak”.
m4l490n
@ m4l490n: wygląda na to, że UseKeychainopcja została dodana w OpenSSH 7.1p2 (28.02.2016). Może masz poprzednią wersję. openssh.com/txt/release-7.2
chus
6

Dla wygody optymalną metodą jest połączenie odpowiedzi jmtd i Faheem .

Używanie ssh-agentsamego oznacza, że ssh-agentdla każdego otwieranego terminala należy utworzyć nową instancję . keychainpo zainicjowaniu poprosi o hasło dla kluczy prywatnych i zapisze je. W ten sposób Twój klucz prywatny jest chroniony hasłem, ale nie będziesz musiał wprowadzać hasła w kółko.

Arch wiki zaleca inicjowanie pęk kluczy z /etc/profile.d/lub swój profil powłoki, takie jak .bash_profilealbo .bashrc. Ma to tę wadę, że inicjalizuje pęku kluczy, jak tylko otworzysz terminal.

Bardziej elastycznym podejściem jest połączenie keychainz określoną tmuxsesją. Tak więc w .bash_profile:

tsess=$(tmux ls 2>&1)

if [[ "${tsess%%:*}" = "secured" ]] && 
   [[ -f $HOME/.keychain/$HOSTNAME-sh ]]; then
    # start keychain
    /usr/bin/keychain -Q -q --nogui ~/.ssh/id_rsa
    . $HOME/.keychain/$HOSTNAME-sh
fi

... a następnie jest to tylko przypadek rozpoczęcia zabezpieczonej tmuxsesji, gdy jest to wymagane (uruchamiane z naciśnięcia klawisza):

#!/bin/bash
PID=$(pgrep tmux)
new="tmux -f $HOME/.tmux/conf new -s secured"
old="tmux attach -t secured -d"

if [[ -z "$SSH_AUTH_SOCK" ]]; then
    eval `ssh-agent`
    trap "kill $SSH_AGENT_PID" 0
fi

if [[ -z "$PID" ]]; then
    urxvtc -title "SSH" -e sh -c "${new}"
else
    urxvtc -title "SSH" -e sh -c "${old}"
fi

ssh-add

Teraz Twój pęku kluczy zostanie zainicjowany tylko raz, gdy rozpoczniesz tę konkretną tmuxsesję. Tak długo, jak ta sesja będzie się powtarzać, będziesz mieć dostęp do tych sshkluczy i wypychaj swoje zdalne repozytoria.

jasonwryan
źródło
Jak sprawiłbym, żeby działało na zdalnym komputerze? Zmodyfikowałem drugi skrypt, aby sprawdzić, czy $ SSH_CLIENT i jeśli istnieje, nie wykonuj urxvtc, po prostu tmux. To działa, ale problemem jest część .bash_profile. Kiedy po raz pierwszy loguję się do skrzynki, pojawia się komunikat „serwer nie znaleziony: odmowa połączenia”, co jest wynikiem działania „tmux ls”. Następnie, kiedy wykonuję drugi skrypt, tmux albo rozpoczyna nową sesję, albo dołącza do istniejącej, ale nie pojawia się monit o pęku kluczy. Następnie, kiedy wychodzę z sesji, pojawia się monit pęku kluczy.
jonyamo
Zaktualizowałem odpowiedź, aby wyciszyć wyjście tmux, jeśli nie ma sesji.
jasonwryan
Dziękuję, ale to nadal nie rozwiązało problemu z pękiem kluczy. tmux tworzy nową sesję, ale przechodzi bezpośrednio do dowolnego pustego monitu. Dopiero kiedy wychodzę z sesji tmux, pojawia się monit pęku kluczy z prośbą o moje hasło.
jonyamo
Chyba powinienem przestać mówić pęku kluczy, ponieważ pęku kluczy jest wykonywany tylko w .bash_profile. Problem polega na wykonaniu ssh-add. Chociaż jeśli uruchomię ssh-add ręcznie po utworzeniu sesji tmux, to działa.
jonyamo
1
Pomiń drugi skrypt i po prostu rozpocznij bezpieczną sesję tmux od .profile- w ten sposób otrzymasz monit o klucze, jak tylko się zalogujesz.
jasonwryan
0

Możesz użyć sshpass:

$ sudo apt-get install sshpass
$ sshpass -p 'password' ssh username@server

Musisz tylko dodać sshpass -p yourpassphraseprzed dołączeniem zwykłego sshpolecenia.

belka
źródło
2
To brzmi jak naprawdę głupi pomysł. Czy to nie sprawi, że twoje hasło pojawi się jako zwykły tekst w historii twojej powłoki?
connexo
Dokładnie, ale czy nie powinieneś również chronić swojej sesji hasłem?
belka
1
Nawet jeśli tak, to jak często kolega siedzi obok ciebie i pomaga / uczy się od ciebie?
connexo