Zamiast wpisywać hasła wielokrotnie można wykorzystać psshi jego -Aprzejś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:
$ cat ~/.ssh/my_id_rsa.pub \
| pssh -h ips.txt -l remoteuser -A -I -i \
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
Warning: do not enter your password if anyone else has superuser
privileges or access to your account.
Password:
[1] 23:03:58 [SUCCESS] 10.252.1.1
[2] 23:03:58 [SUCCESS] 10.252.1.2
[3] 23:03:58 [SUCCESS] 10.252.1.3
[4] 23:03:58 [SUCCESS] 10.252.1.10
[5] 23:03:58 [SUCCESS] 10.252.1.5
[6] 23:03:58 [SUCCESS] 10.252.1.6
[7] 23:03:58 [SUCCESS] 10.252.1.9
[8] 23:03:59 [SUCCESS] 10.252.1.8
[9] 23:03:59 [SUCCESS] 10.252.1.7
Powyższy skrypt ma ogólnie taką strukturę:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
psshSzczegóły na wysokim poziomie
cat <pubkey> wysyła plik klucza publicznego do pssh
psshużywa -Iprzełą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)
-Akaże psshpoprosić o podanie hasła, a następnie użyć go ponownie dla wszystkich serwerów, z którymi się łączy
-ikaże psshwysył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 psshbędą uruchamiane na każdym serwerze:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
W porządku:
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:
$ ls -ld ~/.ssh ~/.ssh/authorized_keys
drwx------ 2 remoteuser remoteuser 4096 May 21 22:58 /home/remoteuser/.ssh
-rw------- 1 remoteuser remoteuser 771 May 21 23:03 /home/remoteuser/.ssh/authorized_keys
utwórz katalog ~/.sshi zignoruj ostrzeżenie, jeśli już tam jest
- ustaw zmienną,
$afileze ścieżką do pliku autoryzowanych_kluczy
cat - >> $afile - weź dane wejściowe ze STDIN i dołącz do pliku uprawnione klucze
sort -u $afile -o $afile - jednoznacznie sortuje plik uprawniony_klucz i zapisuje go
UWAGA: 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 $afilebyć poddawani ocenie, dopóki nie zostanie wykonana na zdalnym serwerze.
' \
..cmds... \
'
Rozszerzyłem powyższe, aby łatwiej było je tutaj przeczytać, ale generalnie uruchamiam to wszystko w jednym wierszu:
$ cat ~/.ssh/my_id_rsa.pub | pssh -h ips.txt -l remoteuser -A -I -i 'umask 077; mkdir -p ~/.ssh; afile=~/.ssh/authorized_keys; cat - >> $afile; sort -u $afile -o $afile'
Materiał bonusowy
Dzięki zastosowaniu psshmoż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 innego pssh„s przełączników -H "ip1 ip2 ip3".
Na przykład:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
Powyższe można wykorzystać do wyodrębnienia listy adresów IP z mojego ~/.ssh/configpliku. Oczywiście możesz także użyć printfdo generowania dynamicznej treści:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Na przykład:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
Możesz także użyć seqdo generowania sformatowanych sekwencji liczb!
Referencje i podobne narzędzia do pssh
Jeśli nie chcesz używać psshtak jak ja to zrobiłem powyżej, dostępne są inne opcje.