Niedawno otrzymałem dostęp do nazwy użytkownika / hasła do listy serwerów i chcę propagować mój klucz publiczny SSH na tych serwerach, aby łatwiej się zalogować.
Aby było jasne:
- Na zdalnych serwerach nie ma żadnego wcześniejszego klucza publicznego, którego mógłbym użyć do zautomatyzowania tego
- To pierwszy raz, kiedy loguję się na te serwery i nie chcę ciągle wpisywać moich danych logowania, aby uzyskać do nich dostęp
- Nie chcę też wielokrotnie wpisywać hasła przy użyciu
ssh-copy-id
pętli for.
ssh-copy-id
, pompując moje hasło w kółko.Odpowiedzi:
Zamiast wpisywać hasła wielokrotnie można wykorzystać
pssh
i jego-A
przejście na zachęty dla niego raz, a następnie karmić hasło do wszystkich serwerów na liście.UWAGA: Korzystanie z tej metody nie pozwala jednak na jej użycie
ssh-copy-id
, dlatego konieczne będzie wdrożenie własnej metody dołączania pliku klucza pub SSH do pliku konta zdalnego~/.ssh/authorized_keys
.Przykład
Oto przykład, który wykonuje zadanie:
Powyższy skrypt ma ogólnie taką strukturę:
pssh
Szczegóły na wysokim poziomiecat <pubkey>
wysyła plik klucza publicznego dopssh
pssh
używa-I
przełącznika do pobierania danych przez STDIN-l <remote user>
to konto zdalnego serwera (zakładamy, że masz taką samą nazwę użytkownika na serwerach w pliku IP)-A
każepssh
poprosić o hasło, a następnie użyć go ponownie dla wszystkich serwerów, z którymi się łączy-i
każepssh
wysyłać dane wyjściowe do STDOUT zamiast przechowywać je w plikach (jest to zachowanie domyślne)'...cmds to add pubkey...'
- to jest najtrudniejsza część tego, co się dzieje, więc sam to podzielę (patrz poniżej)Polecenia uruchamiane na zdalnych serwerach
Oto polecenia, które
W porządku:pssh
będą uruchamiane na każdym serwerze:ustaw umask użytkownika zdalnego na 077, dzięki temu wszelkie katalogi lub pliki, które będziemy tworzyć, będą miały odpowiednio ustawione uprawnienia:
utwórz katalog
~/.ssh
i zignoruj ostrzeżenie, jeśli już tam jest$afile
ze ścieżką do pliku autoryzowanych_kluczycat - >> $afile
- weź dane wejściowe ze STDIN i dołącz do pliku uprawnione kluczesort -u $afile -o $afile
- jednoznacznie sortuje plik uprawniony_klucz i zapisuje goUWAGA: Ten ostatni bit dotyczy obsługi przypadku, w którym powyższe uruchamiane są wielokrotnie na tych samych serwerach. Pozwoli to wyeliminować wielokrotne dołączanie Twojego klucza publicznego.
Zwróć uwagę na pojedyncze tyknięcia!
Zwróć także szczególną uwagę na fakt, że wszystkie te polecenia są zagnieżdżone w pojedynczych cudzysłowach. To ważne, ponieważ nie chcemy
$afile
być poddawani ocenie, dopóki nie zostanie wykonana na zdalnym serwerze.Rozszerzyłem powyższe, aby łatwiej było je tutaj przeczytać, ale generalnie uruchamiam to wszystko w jednym wierszu:
Materiał bonusowy
Dzięki zastosowaniu
pssh
można zrezygnować z konieczności konstruowania pliki i albo zapewnienie dynamicznej zawartości przy użyciu-h <(...some command...)
lub można utworzyć listę adresów IP, z wykorzystaniem innegopssh
„s przełączników-H "ip1 ip2 ip3"
.Na przykład:
Powyższe można wykorzystać do wyodrębnienia listy adresów IP z mojego
~/.ssh/config
pliku. Oczywiście możesz także użyćprintf
do generowania dynamicznej treści:Na przykład:
Możesz także użyć
seq
do generowania sformatowanych sekwencji liczb!Referencje i podobne narzędzia do
pssh
Jeśli nie chcesz używać
pssh
tak jak ja to zrobiłem powyżej, dostępne są inne opcje.źródło
pssh
to skrypt w języku Python, który można zainstalować za pomocąpip install pssh
. (2) Można również wygenerowaćssh
klucze na wszystkich serwerach jednocześnie uruchamiającssh-keygen
poprzezpssh
. (3) Po wygenerowaniu kluczy możesz rozdzielić klucze „wszystko do wszystkich”, kopiując wszystkie klucze publiczne w pętli na maszynę lokalną, składając je we wspólnejauthorized_keys
i kopiując je na każdą maszynę.ssh_agent
/ssh_add
może pomóc z hasłami.cat
nagrody (starych): aby uruchomić potok z zawartością pliku, wystarczy przekierować dane wejściowe z tego pliku.pssh
.cat ~/.ssh/*.pub | ...
. W tej sytuacji może jednak nie być tym, czego chcesz.Alternatywą korzystania
xargs
,sshpass
orazssh-copy-id
:Zakładając, że dane logowania znajdują się w pliku credentials.txt w formacie
user:password@server
:Mógłbyś:
Uwaga: pamiętaj, aby usunąć credentials.txt po użyciu!
źródło
ClusterSSH daje okno na każdym komputerze i ze wspólnym oknem do sterowania wszystkimi oknami.
Jeśli mówimy o 10 maszynach, to zadziała. Jeśli mówimy o 100 maszynach, będzie wiele okien.
Zaletą ClusterSSH jest to, że jeśli jedna maszyna nie jest w 100% podobna do reszty, możesz po prostu kliknąć okno i wysłać klawisze tylko na tę maszynę, zanim wrócisz do wysyłania klawiszy na wszystkie maszyny.
źródło
Korzystanie z Ansible jest dość proste. Po prostu zamień
<USER>
na prawdziwą nazwę logowaniaźródło
Kilka rzeczy, które mogą potencjalnie pasować do rachunku:
Jak wspomniano w innych odpowiedziach,
sshpass
jest to prawdopodobnie najłatwiejsze rozwiązanie.źródło
Masz tutaj dwie opcje:
Możesz utworzyć plik ze wszystkimi adresami IP serwerów, a następnie wykonaj poniższe czynności
Zakładając, że
servers.txt
jest to plik z adresami IP / nazwami hostów.Możesz umieścić wszystkie swoje adresy IP / nazwy hostów w pętli i uruchomić
ssh-copy-id
jak poniżej:źródło
ssh-copy-id
pętli for”.