Plutôt que de taper votre mot de passe plusieurs fois, vous pouvez utiliser psshet son -Acommutateur 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...'
psshDétails de haut niveau
cat <pubkey> sort le fichier de clé publique vers pssh
psshutilise le -Icommutateur 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)
-Aindique psshde demander votre mot de passe, puis de le réutiliser pour tous les serveurs auxquels il se connecte
-iindique psshd'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 psshs'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 ~/.sshet ignorer nous avertir s'il est déjà là
- définir une variable,,
$afileavec 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 , psshvous 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 psshcommutateurs 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/configfichier. Bien sûr, vous pouvez également utiliser printfpour 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 seqpour 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 psshcomme je l'ai fait ci-dessus, d'autres options sont disponibles.