Ich verwende Mac OS X 10.9.4. Das folgende Skript kopiert Dateien vom lokalen Computer auf einen anderen Host
#!/bin/bash
#!/usr/bin/expect
echo "I will fail if you give junk values!!"
echo " "
echo "Enter file name: "
read filePath
echo " "
echo "Where you want to copy?"
echo "Enter"
echo "1. if Host1"
echo "2. if Host2"
echo "3. if Host3"
read choice
echo " "
if [ $choice -eq "1" ]
then
spawn scp filePath uname@host1:/usr/tmp
expect "password"
send "MyPassword\r"
interact
elif [ $choice -eq "2" ]
then
spawn scp filePath uname@host2:/usr/tmp
expect "password"
send "MyPassword\r"
interact
elif [ $choice -eq "3" ]
then
spawn scp filePath uname@host3:/usr/tmp
expect "password"
send "MyPassword\r"
interact
else
echo "Wrong input"
fi
Beim Ausführen dieses Skripts bekomme ich folgende
./rcopy.sh: line 21: spawn: command not found
couldn't read file "password": no such file or directory
./rcopy.sh: line 23: send: command not found
./rcopy.sh: line 24: interact: command not found
bash
shell-script
expect
dev2d
quelle
quelle
Antworten:
Ihr Skript versucht, zwei Interpreter zu kombinieren. Sie haben beide
#!/bin/bash
und#!/usr/bin/expect
. Das geht nicht Sie können nur einen der beiden verwenden. Seit dembash
ersten Mal wird Ihr Skript als Bash-Skript ausgeführt.In Ihrem Skript haben Sie jedoch
expect
Befehle wiespawn
undsend
. Da das Skript vonbash
und nicht von gelesen wirdexpect
, schlägt dies fehl. Sie können diesexpect
umgehen, indem Sie verschiedene Skripte schreiben und sie aus Ihrembash
Skript aufrufen oder indem Sie das Ganze in übersetzenexpect
.Der beste Weg, und einer, der die schreckliche Praxis vermeidet, Ihre Passwörter im Klartext in einer einfachen Textdatei zu haben, ist, stattdessen passwortloses ssh einzurichten. Auf diese Weise
scp
wird kein Passwort benötigt und Sie müssen nichtexpect
:Erstellen Sie zunächst einen öffentlichen SSH-Schlüssel auf Ihrem Computer:
Sie werden nach einer Passphrase gefragt, die Sie bei der ersten Ausführung eines ssh-Befehls nach jeder Anmeldung eingeben müssen. Dies bedeutet, dass Sie mehrere ssh- oder scp-Befehle nur einmal eingeben müssen. Lassen Sie die Passphrase leer, um einen vollständig passwortlosen Zugriff zu erhalten.
Nachdem Sie Ihren öffentlichen Schlüssel generiert haben, kopieren Sie ihn auf jeden Computer in Ihrem Netzwerk:
Das
IPlistfile.txt
sollte eine Datei sein, die den Namen oder die IP eines Servers in jeder Zeile enthält. Beispielsweise:Da dies das erste Mal ist, müssen Sie das Passwort für jede IP manuell eingeben. Sobald Sie dies getan haben, können Sie die Dateien mit einem einfachen Befehl auf jeden dieser Computer kopieren:
Entfernen Sie die Erwartung aus Ihrem Skript. Jetzt, da Sie kennwortlosen Zugriff haben, können Sie Ihr Skript wie folgt verwenden:
quelle
Ihr Code kann viel prägnanter sein:
Wenn Sie ssh-Schlüssel wie vorgeschlagen einrichten, ist es noch besser:
quelle
spawn
ist einexpect
Befehl . Es wird nicht funktionieren, wenn Ihr Dolmetscher ist/bin/bash
.quelle