Ich habe ein Netzwerk voller Linux-Rechner. In diesem Netzwerk habe ich einen Benutzer als user1 mit dem Passwort als Passwort in allen Maschinen.
Ich habe das folgende Skript, um Dateien im Home-Verzeichnis von user1 abzulegen in allen Maschinen des Netzwerks.
#!/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
Das Problem ist, dass ich eine Fehlermeldung erhalte, „can't read line. No such variable
“. Wenn ich jedoch anstelle der Zeilenvariablen direkt eine IP-Adresse verwende, kann ich die Datei übertragen.
Bearbeiten :Die IPlistfile.txt enthält die Liste der IP-Adressen in meinem Netzwerk. Jede Zeile enthält eine einzelne IP-Adresse.
Akzeptierte Antwort:
Ich kann mir ein paar Möglichkeiten vorstellen, dies zu tun, aber ich empfehle dringend, passwortloses ssh
einzurichten Zugriff, du wirst mir später danken.
1. Richten Sie einen passwortlosen Zugriff auf Ihre Maschinen ein.
Dies ist bei weitem die beste Methode, da Sie sich bestimmt wieder mit den Maschinen verbinden möchten, und dies wird Ihnen das Leben erheblich erleichtern. Es ist auch viel sicherer als die anderen Optionen, selbst wenn Sie sich für eine leere Passphrase entscheiden, da Sie Passwörter nicht unverschlüsselt herumwerfen.
Erstellen Sie zuerst ein öffentliches ssh
Schlüssel auf Ihrem Gerät:
ssh-keygen -t rsa
Sie werden nach einer Passphrase gefragt, die Sie zuerst eingeben müssen Mal, wenn Sie nach jeder Anmeldung einen beliebigen ssh-Befehl ausführen. Das bedeutet, dass für mehrere ssh
oder scp
Befehle müssen Sie nur einmal eingeben. Sie können es jedoch leer lassen, um einen vollständig passwortlosen Zugriff zu erhalten.
Nachdem Sie Ihren öffentlichen Schlüssel generiert haben, kopieren Sie ihn (als user1
) an jeden Computer in Ihrem Netzwerk :
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub [email protected]$ip
done < IPlistfile.txt
Sie müssen das Passwort für jede IP manuell eingeben (es sei denn, Sie verwenden auch für diesen Schritt eine der folgenden Lösungen), aber sobald Sie dies getan haben, können Sie Dateien mit einem einfachen Befehl auf jeden dieser Computer kopieren:
while read ip; do
scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
Wenn Sie sshpass
haben installiert ist, können Sie dies automatisieren, sodass Sie Ihr Passwort nicht für jeden Computer eingeben müssen:
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
2. Installieren Sie sshpass
Dies ist ein raffiniertes kleines Programm, mit dem Sie einen ssh
übergeben können Passwort als Kommandozeilenparameter. Dies ist offensichtlich keine sehr sichere Lösung, und ich empfehle Ihnen dringend, den Abschnitt „Sicherheitsüberlegungen“ von man sshpass
zu lesen .
Wie auch immer, es ist wahrscheinlich in den Repositories Ihrer Distribution verfügbar, auf Debian-basierten Systemen kann es mit installiert werden
sudo apt-get install sshpass
Ich kann es nicht überprüfen, da ich keinen RedHat-basierten Computer habe, aber soweit ich es hier durchsuchen kann, sollte es auf Fedora mit
installierbar seinsudo yum install sshpass
Sobald Sie es installiert haben, können Sie es einfach ausführen
SSHPASS='password'
while read ip; do
sshpass -e scp /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt
Das -e
Option teilt sshpass
mit um das Passwort vom SSHPASS
zu erhalten Variable. Dies ist etwas sicherer, als es als Parameter mit dem -p
anzugeben Option.
WICHTIG:
Dies schlägt stillschweigend fehl, wenn der Server, mit dem Sie sich verbinden, unbekannt ist und sein öffentlicher Schlüssel nicht auf Ihrem Computer gespeichert ist. Wenn dies nicht zu funktionieren scheint, verbinden Sie sich einfach einmal (ssh
oder scp
) auf den Remote-Rechner und akzeptieren Sie dessen öffentlichen Schlüssel.
3. Verwenden Sie pscp
stattdessen
pscp
ist eine Alternative zu scp
die das Passwort als Kommandozeilenparameter akzeptiert. Auf Debian-basierten Systemen kann dies mit installiert werden
sudo apt-get install putty-tools
Wie ich bereits sagte, kann ich es nicht überprüfen, aber es sollte mit
auf Fedora installierbar seinsudo yum install putty
Anschließend können Sie Ihre Dateien mit
kopierenwhile read ip; do
pscp -pw password /home/user1/Desktop/filetobesent.txt [email protected]$ip:~/Desktop
done < IPlistfile.txt