Jak na stałe dodać klucz prywatny za pomocą ssh-add na Ubuntu? [Zamknięte]

474

Mam klucz prywatny chroniony hasłem, aby uzyskać dostęp do serwera za pośrednictwem SSH.

Mam 2 maszyny linux (ubuntu 10.04), a zachowanie komendy ssh-add w obu jest różne.

Na jednym komputerze, kiedy użyję „ssh-add .ssh / tożsamość” i wprowadzę hasło, klucz został dodany na stałe, tj. Za każdym razem, gdy zamykam komputer i loguję się, klucz jest już dodawany.

W drugim muszę dodawać klucz przy każdym logowaniu.

O ile pamiętam, zrobiłem to samo na obu. Jedyną różnicą jest to, że klucz został utworzony na tym, który został dodany na stałe.

Czy ktoś wie, jak dodać go również na stałe na innym komputerze?

dudukleina
źródło
1
agent powinien być tymczasowy; ale możliwe jest, że masz komendę ssh-add gdzieś w ~ / .bashrc lub tak na jednej z obu maszyn
mirek

Odpowiedzi:

632

Rozwiązaniem byłoby wymuszenie trwałego przechowywania plików kluczy poprzez dodanie ich do ~/.ssh/configpliku:

IdentityFile ~/.ssh/gitHubKey
IdentityFile ~/.ssh/id_rsa_buhlServer

Jeśli nie masz pliku „config” w katalogu ~ / .ssh, powinieneś go utworzyć. Nie potrzebuje praw root, więc po prostu:

nano ~/.ssh/config

... i wprowadź powyższe wiersze zgodnie ze swoimi wymaganiami.

Aby to zadziałało, plik musi mieć chmod 600. Możesz użyć polecenia chmod 600 ~/.ssh/config.

Jeśli chcesz, aby wszyscy użytkownicy na komputerze korzystali z klucza, umieść te wiersze /etc/ssh/ssh_configi klucz w folderze dostępnym dla wszystkich.

Dodatkowo, jeśli chcesz ustawić klucz specyficzny dla jednego hosta, możesz wykonać następujące czynności w ~ / .ssh / config:

Host github.com
    User git
    IdentityFile ~/.ssh/githubKey

Ma to tę zaletę, gdy masz wiele tożsamości, że serwer cię nie odrzuca, ponieważ najpierw próbowałeś podać nieprawidłowe tożsamości. Wypróbowana zostanie tylko określona tożsamość.

daminetreg
źródło
82
Uprawnienia do pliku konfiguracyjnego powinny wynosić 600.chmod 600 config
generalopinion
6
Muszę podać hasło dla każdego wypychania, pobierania lub klonowania, jak mogę tego uniknąć?
Asaf,
9
Użyj zamiast tego ssh-add ~/.ssh/gitHubKey, zapamięta twoje kluczowe hasło. Rozwiązaniem, które zaproponowałem, było ustawienie go na stałe podczas ponownego uruchamiania.
daminetreg,
28
Ta odpowiedź jest tak dobra, że ​​ssh-add nie powinien istnieć. Kto chce mieć polecenie „tymczasowo” rozwiązujące problem i nieoczekiwanie psujące się, gdy można po prostu edytować plik konfiguracyjny na stałe.
RussellStewart
2
Problem jest związany z tego rodzaju konfiguracją, jeśli nie zrobisz tego w .ssh / config dla konkretnego hosta, za każdym razem będziesz wypróbowywany cały klucz na wszystkich serwerach.
daminetreg,
118

To nie rozwiązało tego samego problemu w systemie Mac OS X Lion. W końcu dodałem:

ssh-add ~/.ssh/id_rsa &>/dev/null

Do mojego .zshrc (ale .profile też byłoby w porządku), co wydaje się naprawiać.

(Jak sugerowano tutaj: http://geek.michaelgrace.org/2011/09/permanently-add-ssh-key-ssh-add/ )

Aaron
źródło
6
Jest to moim zdaniem lepsze niż rozwiązanie, które zaproponowałem, ponieważ ssh-add używa agenta uwierzytelniania, który może zapamiętać hasło chronionego klucza prywatnego, dzięki czemu nie trzeba go wpisywać za każdym razem, gdy próbujesz się uwierzytelnić. Kolejną zaletą proponowanego rozwiązania jest to, że jeśli masz dużo klucza, klient ssh nie zaproponuje kluczy nieistotnych dla serwera, z którym próbujesz się połączyć, w rzeczywistości dostarczy tylko klucze, które są dla tego serwera i wygrał ' t prowadzi do odrzucenia połączenia przez serwer z powodu osiągnięcia MaxAuthTries, podczas próby wypróbowania wszystkich kluczy wymienionych w ssh / config.
daminetreg
1
Dzięki @daminetreg. Mój szczególny problem polegał na konieczności uzyskania dostępu do gitosis na maszynie programistycznej bez przenoszenia do niego mojego klucza prywatnego. To rozwiązanie (wraz z dodaniem ForwardAgent yesdo mojego .ssh/config) fantastycznie rozwiązało ten problem. Jak się okazuje, ssh-add &>/dev/nulldomyślnym zachowaniem ssh-addmoże być dodawanie kluczy znalezionych w .sshfolderze.
Aaron
1
Rozumiem, że w systemie Mac OS jest przełącznik -K: stackoverflow.com/questions/1909651/…
Nicu Tofan
3
@TNick -Kdodaje klucze do pęku kluczy OS X, których GUI używają do uwierzytelniania na obcych serwerach. Plakat w tym Q łączy się przez tunel SSH, ale nadal łączy się tylko ze zdalnym serwerem. A - [Tunel SSH] -> B W tym przypadku jestem na zdalnym serwerze, ale chcę, aby uwierzytelnianie odbywało się na podstawie poświadczeń w moim systemie domowym. A <- [Auth] - B - [Connect] -> C Więc -Ktak naprawdę nie pomaga, ale jest świetnym rozwiązaniem dla drugiego pytania.
Aaron
112

Rozwiązałem ten problem w Mac OSX (10.10), używając opcji -K dla ssh-add:

ssh-add -K ~/.ssh/your_private_key

W systemie MacOS 10.12 i nowszych musisz dodatkowo edytować konfigurację ssh zgodnie z opisem tutaj: https://github.com/jirsbek/SSH-keys-in-macOS-Sierra-keychain

totas
źródło
3
jest to lepsza odpowiedź dla osób, które chcą ustawić to na stałe
punkrockpolly
12
Stąd ten bit: „na Mac OSX (10.10)” ...
Andrew K.
1
Jest to dobre i działa na Mac OSX, ale nie działa na Ubuntu (14.04 w moich testach).
haxpor
5
To nie działało dla mnie (w OSX 10.12.4)
guptron
2
Zgodnie z systemem man ssh-addmacOS High Sierra ssh-add -Kzapisze hasło w pęku kluczy, a po ponownym uruchomieniu wystarczy użyć ssh-add -A, który nie wymaga wprowadzania hasła.
DawnSong
36

Wystarczy dodać pęku kluczy, o którym mowa w szybkich poradach Ubuntu https://help.ubuntu.com/community/QuickTips

Co

Zamiast ciągłego uruchamiania ssh-agent i ssh-add, można używać pęku kluczy do zarządzania kluczami ssh. Aby zainstalować pęku kluczy, możesz po prostu kliknąć tutaj lub użyć Synaptic do wykonania zadania lub apt-get z wiersza poleceń.

Wiersz poleceń

Innym sposobem zainstalowania pliku jest otwarcie terminala (Aplikacja-> Akcesoria-> Terminal) i wpisanie:

sudo apt-get install keychain

Edytuj plik

Następnie należy dodać następujące wiersze do $ {HOME} /. Bashrc lub /etc/bash.bashrc:

keychain id_rsa id_dsa
. ~/.keychain/`uname -n`-sh
Christian Saiki
źródło
Co dokładnie robi drugie polecenie z ciekawości? to po prostu otwiera uprawnienia dla bieżącego użytkownika?
Vincent Buscarello
1
To .jest pseudonim dlasource
Brad Solomon
18

Wypróbowałem rozwiązanie @ Aaron i to nie do końca działało, ponieważ dodawało moje klucze za każdym razem, gdy otwierałem nową kartę w moim terminalu. Więc trochę go zmodyfikowałem (zauważ, że większość moich kluczy jest również chronionych hasłem, więc nie mogę po prostu wysłać danych wyjściowych do / dev / null):

added_keys=`ssh-add -l`

if [ ! $(echo $added_keys | grep -o -e my_key) ]; then
    ssh-add "$HOME/.ssh/my_key"
fi

W ten sposób sprawdza dane wyjściowe ssh-add -l(które zawierają wszystkie klucze, które zostały dodane) dla określonego klucza, a jeśli go nie znajdzie, dodaje go za pomocą ssh-add.

Teraz, kiedy otwieram terminal po raz pierwszy, pojawia się pytanie o hasło do moich kluczy prywatnych i nie pojawia się ono ponownie, dopóki nie zrestartuję komputera (lub wyloguję się - nie sprawdziłem).

Ponieważ mam kilka kluczy, przechowuję dane wyjściowe ssh-add -lw zmiennej, aby poprawić wydajność (przynajmniej tak sądzę, poprawia to wydajność :))

PS: Jestem na Linuksie i ten kod poszedł do mojego ~/.bashrcpliku - jeśli używasz Mac OS X, zakładam, że powinieneś dodać go do .zshrclub.profile

EDYCJA: Jak wskazał @Aaron w komentarzach, .zshrcplik jest używany z zshpowłoki - więc jeśli go nie używasz (jeśli nie jesteś pewien, najprawdopodobniej używasz bashzamiast tego), ten kod powinien przejdź do swojego .bashrcpliku.

Nikola Iwanow Nikołow
źródło
3
.zshrcjest dla zshpowłoki, której używam zamiast bash. Jeśli używasz bashw systemie Mac OS X (domyślnie), to też .bashrctam będzie.
Aaron
1
Po ssh-add -lkodem powrotu echo $?mogą być wykorzystane do podjęcia decyzji, czy dodać klucz czy nie. Jestem moją maszyną z linuksem z bash, ssh-add -lnie wypisze nazwy pliku klucza. Kod powrotu zawsze działa.
Bharat G
12

W moim przypadku rozwiązaniem było:

Uprawnienia do pliku konfiguracyjnego powinny wynosić 600. chmod 600 config

Jak wspomniano w komentarzach powyżej przez generalopinion

Nie trzeba dotykać zawartości pliku konfiguracji.

erezmta
źródło
Nie wystarczyło mi na Linux Mint 17.1.
Benares,
Nie sądzę, żeby 600 miało sens. man ssh mówi nam, że ~/.ssh/configplik do odczytu / zapisu dla użytkownika, a nie do zapisu przez innych.
DawnSong
600 jest odczytywany i zapisywany tylko dla użytkownika
Enthusiasmus
6

Miałem ten sam problem z Ubuntu 16.04: niektóre klucze zostały dodane na stałe, dla innych musiałem wykonać ssh-addkażdą sesję. Dowiedziałem się, że klucze, które zostały dodane na stałe, miały zarówno klucz prywatny, jak i publiczny, ~/.ssha klucze zapomniane podczas każdej sesji miały tylko klucze prywatne w ~/.sshreż. Rozwiązanie jest proste: przed wykonaniem należy skopiować zarówno klucz prywatny, jak i publiczny .~/.sshssh-add

PS: O ile rozumiem z wiki Gnome, moja metoda działa dzięki narzędziu gnome-keyring, które jest częścią Gnome Desktop Environment. Dlatego moja metoda prawdopodobnie powinna działać tylko wtedy, gdy używasz Gnome lub DE opartej na Gnome.

N Shiny
źródło
1
Niedoceniana odpowiedź. To rozwiązało mój problem bez potrzeby instalowania dodatkowych skryptów lub pakietów po dwóch godzinach wyszukiwania.
etagenklo
Flarkin wspaniałe! Świetna praca detektywistyczna. Nie sądzę, żebym to wymyślił.
nicorellius
4

Dodanie następujących wierszy w „~ / .bashrc” rozwiązało problem. Używam pulpitu Ubuntu 14.04.

eval `gnome-keyring-daemon --start`
USERNAME="reynold"
export SSH_AUTH_SOCK="$(ls /run/user/$(id -u $USERNAME)/keyring*/ssh|head -1)"
export SSH_AGENT_PID="$(pgrep gnome-keyring)"
reynoldpj
źródło
3

W Ubuntu 14.04 (może wcześniej, a może nadal) nie potrzebujesz nawet konsoli:

  • rozpocznij seahorselub uruchom szukaną rzecz „klucz”
  • utwórz tam klucz SSH (lub zaimportuj)
    • nie trzeba pozostawiać hasła pustego
    • oferowane jest nawet przekazanie klucza publicznego na serwer (lub więcej)
  • skończysz z uruchomionym agentem ssh i tym kluczem załadowanym, ale zablokowanym
  • użycie sshspowoduje pobranie tożsamości (tj. klucza) za pośrednictwem agenta
  • przy pierwszym użyciu podczas sesji hasło zostanie sprawdzone
    • i masz opcję automatycznego odblokowania klucza podczas logowania
    • oznacza to, że do zawarcia hasła klucza zostanie użyte uwierzytelnianie przy logowaniu
  • Uwaga: jeśli chcesz przekazać swoją tożsamość (tj. przekazywanie agentów), przywołaj ssh-Alub ustaw jako domyślną
    • w przeciwnym razie nie możesz uwierzytelnić się za pomocą tego klucza na komputerze, na którym logujesz się później na trzecim komputerze
Robert Siemer
źródło
3

Uruchamiam Ubuntu za pomocą dwóch kluczy id_rsa. (jeden osobisty do pracy). ssh-add zapamięta jeden klucz (osobisty) i za każdym razem zapomni o firmie.

Sprawdzając różnicę między tymi dwoma, zobaczyłem, że mój klucz osobisty miał 400 praw, podczas gdy firmowy miał 600 praw. (miał u + w). Usunięcie zapisu użytkownika bezpośrednio z klucza firmowego (uw lub ustawionego na 400) naprawiło mój problem. ssh-add pamięta teraz oba klucze.

Fholst
źródło
2

To zadziałało dla mnie.

ssh-agent /bin/sh
ssh-add /path/to/your/key
Jaseem Abbas
źródło
1

bardzo proste ^ _ ^ dwa kroki

1. zainstaluj brelok

2. dodaj kod poniżej do .bash_profile

/usr/bin/keychain $HOME/.ssh/id_dsa
source $HOME/.keychain/$HOSTNAME-sh
LawrenceLi
źródło
12
Ubuntu nie ma mniam głupka;)
Adam F
1

Dla tych, którzy używają powłoki Fish, możesz użyć następującej funkcji, a następnie wywołać ją w ~/.config/fish/config.fishlub w osobnym pliku konfiguracyjnym w ~/.config/fish/conf.d/loadsshkeys.fish. Załaduje wszystkie klucze zaczynające się od id_rsa do ssh-agent.

# Load all ssh keys that start with "id_rsa"
function loadsshkeys
  set added_keys (ssh-add -l)
   for key in (find ~/.ssh/ -not -name "*.pub" -a -iname "id_rsa*")
    if test ! (echo $added_keys | grep -o -e $key)
      ssh-add "$key"
    end
  end
end

# Call the function to run it.
loadsshkeys

Jeśli chcesz, aby ssh-agentauto było uruchamiane po otwarciu terminala, możesz to zrobić za pomocą tuvistavie / fish-ssh-agent .

Frederickjh
źródło