GNU/Linux >> Tutoriels Linux >  >> Linux

Ssh - Script pour automatiser Scp en réseau ?

J'ai un réseau plein de machines Linux. Dans ce réseau, j'ai un utilisateur en tant que user1 avec le mot de passe comme mot de passe dans toutes les machines.

J'ai le script suivant pour mettre des fichiers dans le répertoire personnel de user1 dans toutes les machines du réseau.

#!/usr/bin/expect -f

# connect via scp
spawn cat /home/user1/Desktop/IPlistfile.txt | while read line do
spawn scp /home/user1/Desktop/filetobesent.txt [email protected]${line}:/home/user1/Desktop
#######################
expect {
-re ".*es.*o.*" {
exp_send "yesr"
exp_continue
}
-re ".*sword.*" {
exp_send "passwordr"
}
}
interact
done

Le problème est que je reçois un message d'erreur comme "can't read line. No such variable “. Cependant, si j'utilise directement une adresse IP au lieu de la variable de ligne, je peux transférer le fichier.

Modifier :Le fichier IPlistfile.txt contient la liste des adresses IP de mon réseau. Chaque ligne contient une seule adresse IP.

Réponse acceptée :

Je peux penser à plusieurs façons de le faire, mais je recommande fortement de configurer ssh sans mot de passe accès, vous me remercierez plus tard.

1. Configurez un accès sans mot de passe à vos machines.

C'est de loin la meilleure méthode puisque vous aurez forcément envie de vous reconnecter aux machines et cela vous facilitera grandement la vie. C'est aussi beaucoup plus sûr que les autres options, même si vous choisissez d'utiliser une phrase de passe vide, car vous ne lancerez pas de mots de passe non chiffrés.

Tout d'abord, créez un ssh public clé sur votre machine :

ssh-keygen -t rsa

Il vous sera demandé une phrase de passe qu'il vous sera demandé d'entrer en premier fois que vous exécutez une commande ssh après chaque connexion. Cela signifie que pour plusieurs ssh ou scp commandes, vous n'aurez à l'entrer qu'une seule fois. Néanmoins, vous pouvez le laisser vide pour avoir un accès totalement sans mot de passe.

Une fois que vous avez généré votre clé publique, copiez-la (en tant que user1 ) à chaque ordinateur de votre réseau :

while read ip; do 
 ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip 
done < IPlistfile.txt

Vous devrez entrer manuellement le mot de passe pour chaque IP (sauf si vous utilisez également l'une des solutions ci-dessous pour cette étape) mais une fois que vous avez fait cela, vous pourrez copier des fichiers sur n'importe laquelle de ces machines avec un simple :

while read ip; do
  scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

Si vous avez sshpass installé, vous pouvez automatiser cela afin de ne pas avoir à saisir votre mot de passe pour chaque machine :

SSHPASS='password'
while read ip; do
  sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

2. Installez sshpass

C'est un chouette petit programme qui vous permet de passer un ssh mot de passe comme paramètre de ligne de commande. Ce n'est évidemment pas une solution très sécurisée et je vous recommande fortement de lire la section "Security Consideretions" de man sshpass .

Quoi qu'il en soit, il est probablement disponible dans les dépôts de votre distribution, sur les systèmes basés sur Debian, il peut être installé avec

sudo apt-get install sshpass

Je ne peux pas vérifier car je n'ai pas de machine basée sur RedHat mais pour autant que je sache en cherchant ici, il devrait être installable sur Fedora avec

sudo yum install sshpass

Une fois que vous l'avez installé, vous pouvez simplement exécuter

SSHPASS='password'
while read ip; do
  sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

Le -e l'option indique sshpass pour obtenir le mot de passe du SSHPASS variable. C'est un peu plus sûr que de le donner en paramètre avec le -p option.

En relation :Autorisations SSH et répertoire personnel ?

IMPORTANT :

Cela échouera silencieusement si le serveur auquel vous vous connectez est inconnu, si sa clé publique n'est pas stockée sur votre machine. Si cela ne semble pas fonctionner, connectez-vous une seule fois (ssh ou scp ) à la machine distante et acceptez sa clé publique.

3. Utilisez pscp à la place

pscp est une alternative à scp qui accepte le mot de passe comme paramètre de ligne de commande. Sur les systèmes basés sur Debian, cela peut être installé avec

sudo apt-get install putty-tools

Comme je l'ai déjà dit, je ne peux pas vérifier mais il devrait être installable sur Fedora avec

sudo yum install putty

Vous pouvez ensuite copier vos fichiers avec

while read ip; do
  pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt

Linux
  1. Ssh - Script Shell pour se connecter à un serveur Ssh ?

  2. Ssh – Restreindre un utilisateur Ssh/scp/sftp à un répertoire ?

  3. Problème dans le script avec des espaces dans le nom de fichier ?

  4. Erreur dans le script de comptage pour le nombre d'occurrences ?

  5. Comportement inattendu d'un script shell ?

Automatisez le traitement des images avec ce script Bash

Comment fonctionne SSH ?

Installer et utiliser WinSCP

Le script user-data (cloud-init) ne s'exécute pas sur EC2

scp un seul fichier vers plusieurs emplacements

Comment copier la sortie du terminal ?