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.
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