(Przeczytałem wiele pytań na tej stronie, które wyglądają na powiązane i uważam, że jest to naprawdę nowe pytanie).
Mam wiele kluczy na wielu serwerach i wszystkie są chronione hasłami.
Lubię wprowadzać hasła tak samo jak lubię wprowadzać hasła - to prawdziwy drenaż produktywności.
Komendy ssh-agent + ssh-add mogą być używane w powłoce logowania, co oznacza, że musisz wpisać hasło tylko raz podczas logowania
pęku kluczy można użyć do utrzymania ssh-agenta przy życiu poza wylogowaniem, więc na przykład możesz go mieć, więc musisz wprowadzić hasło tylko raz przy starcie, lub możesz utrzymywać go przy życiu przez około godzinę.
Problem, jaki mam, polega na tym, że oba te rozwiązania zwykle inicjowane są przy logowaniu do powłoki (np. .zshrc
) Polegają na tym, że wprowadzam moje hasło po zalogowaniu, nawet jeśli nie będę go potrzebował odblokowany. (Nie jestem zadowolony z pęku kluczy utrzymującego agenta przy życiu przez czas nieokreślony).
Chciałbym być proszony o podanie hasła (dla agenta) tylko w razie potrzeby .
Więc mogę zalogować się na serwerze A, zrobić kilka rzeczy, a następnie ssh na serwerze B i w tym momencie poprosić o hasło. Zrób coś na serwerze B, wyloguj się. Wracając do A, zrób jeszcze kilka rzeczy, ssh ponownie do B i nie potrzebuję mojego hasła (jest w posiadaniu agenta).
Zauważam, że jest to możliwe na komputerach graficznych, takich jak Gnome - pojawia się wyskakujące okienko z prośbą o hasło, aby odblokować klucz prywatny, gdy tylko spróbujesz ssh. Właśnie o to mi chodzi, ale z konsoli.
Odpowiedzi:
Nie dodawaj niczego do żadnego ze swoich skryptów startowych powłoki, jest to niepotrzebne włamanie.
Zamiast tego dodaj
do twojego .ssh / config
W ten sposób ssh-add jest uruchamiany automatycznie przy pierwszym uruchomieniu ssh w innym polu. Musisz tylko ponownie wprowadzić swój klucz, gdy wygaśnie z ssh-agent lub po ponownym uruchomieniu.
źródło
Zsh ma
preexec
hak, który wykonuje funkcję przed wykonaniem polecenia wprowadzonego w wierszu poleceń. Oto zaczep, który szukassh
w linii poleceń, a jeśli zostanie znaleziony, sprawdza obecność agenta ssh. Jeśli nie zostanie znaleziony, uruchamia pęku kluczy.W ten sposób pęku kluczy uruchamia się tylko przed poleceniami ssh, a następnie tylko w razie potrzeby.
Umieść to w
~/.zshrc
:To, co się tutaj dzieje, następuje po każdym wpisaniu polecenia, które
check_ssh
jest wywoływane przed jego wykonaniem.Pierwszy wiersz funkcji sprawdza rozwiniętą komendę pod kątem
ssh
użycia wyrażenia regularnego Zsh.ssh
muszą mieć granice słów po\b
obu stronach. Jeśli to nie zostanie znalezione, funkcja powróci.Następny wiersz sprawdza, czy w zmiennej środowiskowej istnieje proces agenta SSH i czy proces ten nadal istnieje w tabeli procesów, a następnie czy do agenta dodano co najmniej jeden klucz. Jeśli wszystko jest w porządku, agent ssh jest skonfigurowany i nie musimy nic robić, więc zwraca.
Wreszcie zaczynamy pęku kluczy, z agentem, który pozostanie przy życiu przez godzinę.
To wciąż pozostawia wątpliwości na temat wbudowanego ssh rzeczy, jak
git
alborsync
czyscp
jako że nie wywoła funkcję (można dodać je do regex).źródło
zsh
tego można stworzyć krótki skrypt z tym samym efektem i umieścić goPATH
przed rzeczywistymssh
klientem. Może nawet działać zrsync
et al, jeśli czytająPATH
zamiast uruchamiać/usr/bin/ssh
bezpośrednio.Dla Zsh napisałem zestaw narzędzi i opakowań, aby zrobić mniej więcej to, co chcesz: https://www.vinc17.net/unix/index.en.html#zsh-ssh-utils
Właściwie to robi się jeszcze bardziej, ponieważ
ssh-agent
będą udostępniane przez wszystkie sesje logowania (pulpicie lub poprzez SSH i GNU ekranu jest obsługiwana zbyt jeśli zaczniesz powłok zgłoszeniowych od niego, npshell -zsh
w~/.screenrc
pliku) i będzie zamknąć dopiero po ostatnia sesja kończy się.Uwaga: Używam tylko jednego hasła dla wszystkich moich kluczy. Nie jestem pewien zachowania dla różnych haseł; mogą wymagać pewnych zmian.
źródło