Czy istnieje wygodny sposób, aby upewnić się, że wszystkie dane logowania od danego użytkownika (tj. Mnie) używają tego samego agenta ssh? Wyhakowałem scenariusz, aby większość czasu działała, ale przez cały czas podejrzewałam, że jest jakiś sposób, żeby to przegapić. Ponadto od tego czasu nastąpił niesamowity postęp w technologii komputerowej, na przykład ta strona internetowa.
Więc celem jest to
- za każdym razem, gdy loguję się do skrzynki, niezależnie od tego, czy odbywa się to przez SSH, czy w sesji graficznej rozpoczętej z gdm / kdm / etc lub na konsoli:
- jeśli moja nazwa użytkownika nie ma obecnie
ssh-agent
uruchomionej, jedna jest uruchamiana, zmienne środowiskowe są eksportowane issh-add
wywoływane. - w przeciwnym razie współrzędne istniejącego agenta są eksportowane do zmiennych środowiskowych sesji logowania.
- jeśli moja nazwa użytkownika nie ma obecnie
Ta funkcja jest szczególnie cenna, gdy dane pudełko jest używane jako punkt przekaźnikowy podczas ssh
wchodzenia do trzeciego pudełka. W takim przypadku unika się konieczności wpisywania hasła klucza prywatnego za każdym razem, gdy ssh jest wpisywane, a następnie chcemy na przykład zrobić git push
coś lub coś.
Skrypt podany poniżej robi to głównie niezawodnie, chociaż ostatnio spartaczył się, gdy X się zawiesił, a następnie rozpocząłem kolejną sesję graficzną. W tym przypadku mogło się zdarzyć coś innego.
Oto mój zły scenariusz. Pozyskuję to z mojego .bashrc
.
# ssh-agent-procure.bash
# v0.6.4
# ensures that all shells sourcing this file in profile/rc scripts use the same ssh-agent.
# copyright me, now; licensed under the DWTFYWT license.
mkdir -p "$HOME/etc/ssh";
function ssh-procure-launch-agent {
eval `ssh-agent -s -a ~/etc/ssh/ssh-agent-socket`;
ssh-add;
}
if [ ! $SSH_AGENT_PID ]; then
if [ -e ~/etc/ssh/ssh-agent-socket ] ; then
SSH_AGENT_PID=`ps -fC ssh-agent |grep 'etc/ssh/ssh-agent-socket' |sed -r 's/^\S+\s+(\S+).*$/\1/'`;
if [[ $SSH_AGENT_PID =~ [0-9]+ ]]; then
# in this case the agent has already been launched and we are just attaching to it.
##++ It should check that this pid is actually active & belongs to an ssh instance
export SSH_AGENT_PID;
SSH_AUTH_SOCK=~/etc/ssh/ssh-agent-socket; export SSH_AUTH_SOCK;
else
# in this case there is no agent running, so the socket file is left over from a graceless agent termination.
rm ~/etc/ssh/ssh-agent-socket;
ssh-procure-launch-agent;
fi;
else
ssh-procure-launch-agent;
fi;
fi;
Powiedz mi, że jest lepszy sposób, aby to zrobić. Proszę również nie dręczyć niespójności / gaf (np. Wkładanie var
rzeczy etc
); Napisałem to jakiś czas temu i od tego czasu nauczyłem się wielu rzeczy.
Odpowiedzi:
Równie dobrze mogę wrzucić własną odmianę do miksu:
A potem za każdym razem, gdy się loguję, jeśli chcę dołączyć agenta (czego nie zawsze), po prostu piszę
sagent
.źródło
if [ ! -x "$(which ssh-add)" ];
należy zastąpić przezif ! which ssh-add;
lubif ! command -v ssh-add
. (Pamiętaj,[
to tylko polecenie)if ! which ssh-add > /dev/null
to uniemożliwić wydrukowanie ścieżki, w którym to momencie nie jestem do końca pewien, czy to jest bardziej zrozumiałe, chociaż przypuszczam, że oszczędza to jedno dodatkowe wywołanie polecenia.ssh -A [user@]remotehost
Myślę, że to może być to, czego szukasz. Użyj przełącznika -A podczas uruchamiania ssh do przodu ssh-agent. Oto przypadek użycia:
Mam zdalny serwer, który ma na nim kilka repozytoriów git ze zdalnym wskazywaniem na github. Bez agenta ssh działającego w sesji ekranowej muszę wprowadzić hasło dla mojego klucza, aby wykonać „master git pull origin”. Booo! Ponadto muszę mieć zainstalowany klucz prywatny na zdalnym serwerze - więcej Boooo!
Zamiast tego po prostu używam
ssh -A [user@]remotehost
przekazuje mój lokalnie uruchomiony ssh-agent. Teraz nie potrzebuję już mojego klucza prywatnego, aby istniał nawet na zdalnym hoście. Nie sądzę, żebyś w ogóle musiał wykonywać skrypty z ssh-agent.źródło
man 5 ssh_config
naForwardAgent
ustawienie config. Domyślnie włącza przekazywanie agentów, eliminując potrzebę-A
argumentu. Przed użyciem przekazywania agenta należy pamiętać, że istnieje ryzyko bezpieczeństwa, w którym inni uprzywilejowani użytkownicy na zdalnym komputerze mogą uzyskać dostęp do gniazda przekazanego agenta. Jest to również wspomniane na stronie man. Wyjaśnia to dobrze tutaj .Oto całkiem fajny, który działa również w Cygwin:
Dodaj go do swojego .bash_profile lub .bashrc
Źródło: http://www.cygwin.com/ml/cygwin/2001-06/msg00537.html
źródło
${SSH_ENV}
musi być,"${SSH_ENV}"
jeśli wSpróbuj użyć pęku kluczy, który jest do tego stworzony. http://www.gentoo.org/doc/en/keychain-guide.xml
źródło
Ostatnio zacząłem używać:
https://github.com/ccontavalli/ssh-ident
Wszystko, co muszę zrobić, to dodać:
W moim pliku .bashrc. Skrypt zajmuje się:
źródło
Wolę, aby wszystko było tak proste, jak to możliwe: (fragment kodu
~/.profile
)Nie myślałem o użyciu
-a
wcześniej, ale może być łatwiej:źródło
W moim przypadku mam wytworną konfigurację w PowerShell i chciałem, aby cygwin używał tego samego agenta ssh. Musiałem trochę zmodyfikować ścieżkę, ponieważ używają różnych folderów tmp, a utworzony plik .env to UTF16 z BOM i CR \ LF, więc dobrze się z tym radziło. Powinno działać dodanie następującego pliku .bashrc używanego przez cygwin:
źródło
Ponownie przykład, aby od razu umieścić plik .bash_profile i poprosić o dodanie domyślnego klucza podczas logowania. Przekazywanie nie było w moim przypadku opcją.
źródło
To jest moje rozwiązanie, zaadaptowane z https://superuser.com/a/141233/5255 (w tym wątku):
źródło
utwórz plik ~ / ssh-agent.sh
dołącz plik do .bashrc
źródło
Dodałem coś, co działa dla mnie. Najpierw sprawdza, czy masz uruchomionego agenta, jeśli tak, to ustawi dla niego odpowiednie środowiska, jeśli nie, to go utworzy. Eliminuje również tworzenie dodatkowych agentów:
Po prostu włóż to do swojego
.bashrc
źródło
Mam również odmianę tego problemu, zaczerpniętą bezpośrednio z mojego .bashrc:
To rozwiązanie przechowuje kopię informacji agenta SSH w katalogu domowym. W przypadku posiadania katalogu domowego z automatycznym podłączeniem do systemu plików NFS, który może być współużytkowany przez wiele hostów, nazwa hosta jest używana jako część nazwy pliku w celu ich rozróżnienia, więc logowanie z jednego komputera nie spowoduje zablokowania pliku agenta używanego na innym.
Zachowanie:
1) Pierwsze sesje użytkownika są monitowane o podanie hasła kluczowego.
2) Sesje druga, trzecia i czwarta (et cetera) dziedziczą agenta SSH i klucz (klucze) dodane w pierwszej.
3) Jeśli agent zostanie zabity lub ulegnie awarii, pierwsza kolejna sesja utworzy nowego agenta, zastąpi plik agenta nowym - i ponownie poprosi o podanie hasła klucza. Kolejne utworzone sesje będą zachowywać się jak scenariusz 2), dopóki nowy agent SSH pozostanie uruchomiony.
źródło
(odnosi się to do posta 2 wyższego, nie mogłem dodać komentarza)
@raghavan: Twój przykład jest przydatny, ale sugeruje zmianę dwóch linii, które mają
pgrep ssh-agent
do
pgrep -u $ USER ssh-agent> / dev / null
dzięki czemu zostaną znalezione tylko agenty działające pod bieżącym użytkownikiem, a identyfikator pid nie zostanie wyświetlony na ekranie (czystszy).
Sugerowałbym również zmianę $ HOME / ssh-agent.out na $ HOME / .ssh-agent.out
pozdrowienia
źródło
Przeczytałem twoje oryginalne rozwiązanie i kilka sugerowanych, ale postanowiłem uprościć proces na własny użytek. Oto co dodałem we własnym .bashrc:
Podjąłem tutaj kilka założeń:
Podsumowując, wydaje mi się, że to proste rozwiązanie.
źródło
Odkryłem, że często miałem
ssh-agent
uruchomionych wiele procesów i że PID w nazwie pliku gniazda nigdy nie był zgodny z PID działającegossh-agent
, więc zhackowałem coś, aby spróbować odzyskać te warunki, na podstawie wielu powyższych przykładów.Jest to pojedyncza funkcja, wykorzystuje zmienną Zsh jako identyfikator użytkownika, jeśli istnieje, i próbuje poświęcić mniej czasu na analizowanie możliwie dużych
/tmp
katalogów, ograniczającfind(1)
nieco więcej.Prawdopodobnie wciąż jest podatny na błędy i skomplikowany, ale niektóre pobieżne testy wskazują, że działa głównie w moich przypadkach użycia, więc oto:
źródło
Oto moja uwaga na ten temat. „ Źródło ” poniższego skryptu z mojego pliku .bash_profile :
źródło
Oto prosty skrypt, który zawsze ponownie użyje tego samego agenta ssh lub uruchomi ssh-agent, jeśli nie jest uruchomiony. Kluczem jest skorzystanie z
-a
opcji użycia tej samej nazwy gniazda. W przeciwnym razie domyślnie wybierze losową nazwę gniazda za każdym razem. Możesz łatwo połączyć te 3 linie w alias 1-liniowy.źródło
źródło