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:
$ 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...'
pssh
Szczegóły na wysokim poziomie
cat <pubkey>
wysyła plik klucza publicznego do pssh
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że pssh
poprosić o hasło, a następnie użyć go ponownie dla wszystkich serwerów, z którymi się łączy
-i
każe pssh
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 pssh
bę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 ~/.ssh
i zignoruj ostrzeżenie, jeśli już tam jest
- ustaw zmienną,
$afile
ze ś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 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.
' \
..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 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 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/config
pliku. Oczywiście możesz także użyć printf
do 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ć 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.