J'ai récemment obtenu un nom d'utilisateur / mot de passe pour accéder à une liste de serveurs et je souhaite propager ma clé publique SSH vers ces serveurs, afin de pouvoir me connecter plus facilement.
Pour que ce soit clair:
- Il n'y a pas de clé publique préexistante sur les serveurs distants que je puisse utiliser pour automatiser cela
- C'est la toute première fois que je me connecte à ces serveurs, et je ne voudrais pas avoir à taper constamment mes informations d'identification pour y accéder
- Je ne veux pas non plus taper mon mot de passe encore et encore en utilisant
ssh-copy-id
une boucle for.
ssh-copy-id
, pompant mon mot de passe encore et encore.Réponses:
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:
Le script ci-dessus est généralement structuré comme suit:
pssh
Détails de haut niveaucat <pubkey>
sort le fichier de clé publique verspssh
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
indiquepssh
de demander votre mot de passe, puis de le réutiliser pour tous les serveurs auxquels il se connecte-i
indiquepssh
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
En ordre:pssh
s'exécuteront sur chaque serveur: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:
créer le répertoire
~/.ssh
et ignorer nous avertir s'il est déjà là$afile
avec le chemin d'accès au fichier authorized_keyscat - >> $afile
- prendre l'entrée de STDIN et l'ajouter au fichier authorized_keyssort -u $afile -o $afile
- trie de manière unique le fichier authorized_keys et l'enregistreRemarque: 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.J'ai développé ce qui précède, il est donc plus facile à lire ici, mais je le lance généralement sur une seule ligne comme ceci:
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 despssh
commutateurs de »,-H "ip1 ip2 ip3"
.Par exemple:
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 utiliserprintf
pour générer du contenu dynamique:Par exemple:
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.la source
pssh
est un script Python, et peut être installé avecpip install pssh
. (2) Vous pouvez également générer desssh
clés sur tous les serveurs simultanément en exécutant àssh-keygen
traverspssh
. (3) Après avoir généré les clés, vous pouvez distribuer les clés "tout-à-tout" en copiant toutes les clés publiques en boucle sur la machine locale, en les assemblant dans un communauthorized_keys
et en les copiant sur chaque machine.ssh_agent
/ssh_add
peut aider avec les mots de passe.cat
award (of old): pour démarrer un pipeline avec le contenu d'un fichier, vous pouvez simplement rediriger l'entrée de ce fichier.pssh
.cat ~/.ssh/*.pub | ...
. Cela peut ou non être ce que vous voulez dans cette situation.En utilisant les autres
xargs
,sshpass
etssh-copy-id
:En supposant que vos informations d'identification vivent dans credentials.txt au format
user:password@server
:Vous pourriez faire:
Remarque: N'oubliez pas de supprimer credentials.txt après utilisation!
la source
ClusterSSH vous donne une fenêtre sur chaque machine et avec une fenêtre commune pour contrôler toutes les fenêtres.
Si nous parlons de 10 machines, cela fonctionnera. Si nous parlons de 100 machines, il y aura de nombreuses fenêtres.
La beauté de ClusterSSH est que si une machine n'est pas à 100% comme les autres, vous pouvez simplement cliquer sur la fenêtre et envoyer des frappes uniquement à cette machine avant de retourner à l'envoi de frappes à toutes les machines.
la source
L'utilisation d' Ansible est assez simple. Remplacez simplement
<USER>
par le vrai nom de connexionla source
Quelques choses qui pourraient potentiellement correspondre au projet de loi:
Comme mentionné dans d'autres réponses,
sshpass
est probablement la solution la plus simple.la source
Vous avez deux options ici:
Vous pouvez créer un fichier avec toutes les adresses IP des serveurs, puis procédez comme suit
En supposant que
servers.txt
le fichier contient des adresses IP / noms d'hôte.Vous pouvez mettre toutes vos adresses IP / noms d'hôte dans une boucle et exécuter
ssh-copy-id
comme ci-dessous:la source
ssh-copy-id
une boucle for."