Plutôt que de taper votre mot de passe plusieurs fois, vous pouvez utiliser pssh
et son -A
commutateur pour le demander une fois, puis envoyer le mot de passe à tous les serveurs d'une liste.
REMARQUE: l' utilisation de cette méthode ne vous permet pas d'utiliser ssh-copy-id
, cependant, vous devrez donc rouler votre propre méthode pour ajouter votre fichier de clé de publication SSH au fichier de votre compte distant ~/.ssh/authorized_keys
.
Exemple
Voici un exemple qui fait le travail:
$ 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
Le script ci-dessus est généralement structuré comme suit:
$ cat <pubkey> | pssh -h <ip file> -l <remote user> -A -I -i '...cmds to add pubkey...'
pssh
Détails de haut niveau
cat <pubkey>
sort le fichier de clé publique vers pssh
pssh
utilise le -I
commutateur pour ingérer des données via STDIN
-l <remote user>
est le compte du serveur distant (nous supposons que vous avez le même nom d'utilisateur sur les serveurs dans le fichier IP)
-A
indique pssh
de demander votre mot de passe, puis de le réutiliser pour tous les serveurs auxquels il se connecte
-i
indique pssh
d'envoyer n'importe quelle sortie à STDOUT plutôt que de la stocker dans des fichiers (son comportement par défaut)
'...cmds to add pubkey...'
- c'est la partie la plus délicate de ce qui se passe, donc je vais le décomposer par lui-même (voir ci-dessous)
Commandes exécutées sur des serveurs distants
Ce sont les commandes qui pssh
s'exécuteront sur chaque serveur:
' \
umask 077; \
mkdir -p ~/.ssh; \
afile=~/.ssh/authorized_keys; \
cat - >> $afile; \
sort -u $afile -o $afile \
'
En ordre:
définissez umask de l'utilisateur distant sur 077, afin que tous les répertoires ou fichiers que nous allons créer, leurs autorisations soient définies en conséquence, comme suit:
$ 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
créer le répertoire ~/.ssh
et ignorer nous avertir s'il est déjà là
- définir une variable,,
$afile
avec le chemin d'accès au fichier authorized_keys
cat - >> $afile
- prendre l'entrée de STDIN et l'ajouter au fichier authorized_keys
sort -u $afile -o $afile
- trie de façon unique le fichier authorized_keys et l'enregistre
Remarque: ce dernier bit est de gérer le cas où vous exécutez plusieurs fois ci-dessus sur les mêmes serveurs. Cela évitera que votre clé pub ne soit ajoutée plusieurs fois.
Remarquez les tiques simples!
Portez également une attention particulière au fait que toutes ces commandes sont imbriquées à l'intérieur de guillemets simples. C'est important, car nous ne voulons $afile
être évalués qu'après son exécution sur le serveur distant.
' \
..cmds... \
'
J'ai développé ce qui précède, il est donc plus facile à lire ici, mais je lance généralement le tout sur une seule ligne comme ceci:
$ 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'
Matériel bonus
En utilisant , pssh
vous pouvez renoncer à avoir à construire des fichiers et soit fournir un contenu dynamique à l' aide -h <(...some command...)
ou vous pouvez créer une liste d'adresses IP en utilisant un autre des pssh
commutateurs de », -H "ip1 ip2 ip3"
.
Par exemple:
$ cat .... | pssh -h <(grep -A1 dp15 ~/.ssh/config | grep -vE -- '#|--') ...
Ce qui précède pourrait être utilisé pour extraire une liste d'adresses IP de mon ~/.ssh/config
fichier. Bien sûr, vous pouvez également utiliser printf
pour générer du contenu dynamique:
$ cat .... | pssh -h <(printf "%s\n" srv0{0..9}) ....
Par exemple:
$ printf "%s\n" srv0{0..9}
srv00
srv01
srv02
srv03
srv04
srv05
srv06
srv07
srv08
srv09
Vous pouvez également utiliser seq
pour générer des séquences de nombres formatés aussi!
Références et outils similaires à pssh
Si vous ne souhaitez pas l'utiliser pssh
comme je l'ai fait ci-dessus, d'autres options sont disponibles.