Mam dowolną liczbę serwerów z tą samą kombinacją użytkownik / przepustka. Chcę napisać skrypt (który wywołuję raz), aby
ssh-copy-id user@myserver
jest wywoływany dla każdego serwera. Ponieważ wszyscy mają tego samego użytkownika / hasło, powinno to być łatwe, ale ssh-copy-id
chcę, aby wpisywać hasło osobno za każdym razem, co jest sprzeczne z celem mojego skryptu. Nie ma opcji wprowadzenia hasła, tj ssh-copy-id -p mypassword user@myserver
.
Jak napisać skrypt, który automatycznie wypełnia pole hasła, gdy ssh-copy-id
o to poprosi?
Odpowiedzi:
Spójrz na sshpass . Umieść swoje hasło w pliku tekstowym i zrób coś takiego:
źródło
Możesz użyć funkcji oczekuj, aby nasłuchiwać monitu o hasło i wysłać hasło:
Zapisz skrypt, uczyń go wykonywalnym i wywołaj go w następujący sposób:
./login.expect user@myserver
źródło
spawn
? Z powodów, których nie mogę kontrolować, utknąłem w bash v3.2.spawn: command not found
spawn
jest słowem kluczowym expect (patrz instrukcja expect (1)). Wygląda na to, że skrypt jest interpretowany jako powłoka, a nie oczekiwany. Czy spodziewałeś się zainstalowanego? Co się stanie, jeśli biegniesz, oczekuj bezpośrednio:expect -f login.expect user@myserver
spawn ssh-copy-id -o StrictHostKeyChecking=no $argv
Odpowiedź quanty jest całkiem dobra, ale wymaga wpisania hasła w pliku tekstowym.
Ze strony podręcznika „sshpass”:
Więc, co możesz zrobić, to przechwycić hasło raz podczas skryptu, zapisać je w zmiennej, powtórzyć hasło i potokować, aby sshpass jako dane wejściowe.
Robię to cały czas i działa dobrze. Przykład:
echo "Please insert the password used for ssh login on remote machine:" read -r USERPASS for TARGETIP in $@; do echo "$USERPASS" | sshpass ssh-copy-id -f -i $KEYLOCATION "$USER"@"$TARGETIP" done
źródło
Jest to problem z ssh-copy-id; dodaje również klucz przy każdym uruchomieniu. Jeśli automatyzujesz ten proces, twój plik autoryzowanych kluczy szybko zapełnia się powielonymi kluczami. Oto program w języku Python, który pozwala uniknąć obu problemów. Działa z serwera kontrolnego i umieszcza klucze z jednego zdalnego serwera na innym zdalnym serwerze.
źródło
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 podanie hasła, 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 (zachowanie domyślne)'...cmds to add pubkey...'
- to jest najtrudniejsza część tego, co się dzieje, więc sama to rozwiążę (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 pub.
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
Ansible's authorized_key_module
wydaje się nie działać na nowej maszynie. Najpierw muszę ssh-copy-id xxx, więc szukam sposobu, aby użyć klucza Answer Add Ssh dla nowej maszyny, jakiś pomysł?Jedno z równoległych narzędzi SSH (clusterssh, mssh, pssh) może być dla Ciebie odpowiednie.
Na przykład użyj cssh, aby zalogować się na wszystkich komputerach i samodzielnie dodać klucz.
źródło
Kilka rzeczy, które mogą pasować do rachunku:
Jak wspomniano w innych odpowiedziach, sshpass jest prawdopodobnie najłatwiejszym rozwiązaniem.
źródło
Chcę podkreślić, jak kiepskim pomysłem jest:
Oto implementacja, która jest nieco bezpieczniejsza ...
źródło