Copiez la clé publique ssh sur plusieurs hôtes Linux

14

J'essaie de copier .ssh / id_rsa.pub de notre serveur central vers plusieurs serveurs. J'ai le script suivant que j'utilise habituellement pour pousser les modifications sur les différents serveurs.

#!/bin/bash


for ip in $(<IPs); do
    # Tell the remote server to start bash, but since its
    # standard input is not a TTY it will start bash in
    # noninteractive mode.
    ssh -q "$ip" bash <<-'EOF'



EOF

done

Mais dans ce cas, je dois cat la clé publique sur le serveur local, puis l'ajouter à plusieurs serveurs. Existe-t-il un moyen d'utiliser le script de document ci-dessus pour exécuter ce qui suit.

cat .ssh/id_rsa.pub |ssh tony@0.0.0.0 'cat > .ssh/authorized_keys'
user67186
la source
pourquoi vous devez chatter sur local car vous êtes copié d'un emplacement central vers des télécommandes?
klerk
J'ai besoin d'ajouter la clé publique du serveur central, donc le serveur local. Désolé pour la confusion.
user67186

Réponses:

20

Avec cette boucle simple, vous pouvez l'automatiser et la diffuser sur tous les serveurs distants.

#!/bin/bash
for ip in `cat /home/list_of_servers`; do
    ssh-copy-id -i ~/.ssh/id_rsa.pub $ip
done
klerk
la source
Salut, j'accepte votre réponse et cela a bien fonctionné. Merci
user67186
+1. Je suis un grand fan d'un style de script très simple qui fait le travail!
Laith Leo Alobaidy
4

Voici mon script simple pour copier ssh-keygen sur plusieurs serveurs sans demander de mot de passe à chaque fois.

for server in `cat server.txt`;  
do  
    sshpass -p "password" ssh-copy-id -i ~/.ssh/id_rsa.pub user@$server  
done
Rajesh Kumar
la source
3

La réponse acceptée ne fonctionnera pas si l'on doit mettre la clé publique de quelqu'un d'autre sur plusieurs machines. J'ai donc trouvé la solution suivante:

cat add-vassal-tc-agents.sh

#!/bin/bash
set -x # enable bash debug mode
if [ -s vassal-public-key.pub ]; then # if file exists and not empty
    for ip in `cat tc-agents-list.txt`; do # for each line from the file
        # add EOL to the end of the file and echo it into ssh, where it is added to the authorized_keys
        sed -e '$s/$/\n/' -s vassal-public-key.pub | ssh $ip 'cat >> ~/.ssh/authorized_keys'
    done
else
    echo "Put new vassal public key into ./vassal-public-key.pub to add it to tc-agents-list.txt hosts"
fi

Ce script ajoute la nouvelle clé aux utilisateurs de la liste des machines, à condition que l'environnement sur lequel il est exécuté ait accès.

Exemple de tc-agents-list.txt:

root@10.10.0.1
root@10.10.0.2
root@10.10.0.3
root@10.10.0.4
Ilya Sheershoff
la source
2

Pour copier votre clé publique, vous disposez d'un élément intégré à openssh lui-même. Donc au lieu de catet sshutilisez ceci: -

ssh-copy-id -i ~/.ssh/id_rsa.pub YOUR-REMOTE-HOST
débutant
la source
Je veux exécuter la commande copiant le public du serveur central sur des serveurs distants qui existent dans le fichier IP. Le script les parcourt. Donc, votre exemple peut ne pas être utile ici. Merci
user67186
Pas besoin d'utiliser l'option -i si vous utilisez l'emplacement par défaut de la clé publique.
Laith Leo Alobaidy
0

Vous pouvez le faire avec une simple liste de serveurs en boucle while et intégrée comme ceci:

while read SERVER
do
    ssh-copy-id user@"${SERVER}"
done <<\EOF
server1
server2
server3
EOF

Le fait d'avoir la liste à l'intérieur du script supprime les fichiers de données séparés qui peuvent être mal placés.

solaris
la source
ssh-copy-ida déjà été suggéré dans d'autres réponses.
RalfFriedl
0

En supposant que vous ayez un fichier avec la liste IP des serveurs, nommez SERVER et que seules les adresses IP des serveurs sont définies.

Cette pour boucle fonctionnera aussi bien.

for user in $(awk '{print $1}' SERVER | awk '{printf "user1@""%s"(NR==0?RS:"\n"), $1}' ) ;
do
        ssh-copy-id -f -i id_rsa_k2.pub $user
done
Klaus
la source