it-swarm.com.de

spawn - Befehl nicht gefunden!

Ich verwende Mac OS X 10.9.4. Im Folgenden finden Sie mein Skript zum Kopieren von 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 [email protected]:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
Elif [ $choice -eq "2" ]
then
  spawn scp filePath [email protected]:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
Elif [ $choice -eq "3" ]
then
  spawn scp filePath [email protected]:/usr/tmp   
  expect "password"   
  send "MyPassword\r"
  interact
else
  echo "Wrong input"
fi

wenn ich dieses Skript ausführe, folge ich

./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
15
dev2d

Ihr Skript versucht, zwei Interpreter zu kombinieren. Du hast beide #!/bin/bash und #!/usr/bin/expect. Das wird nicht funktionieren. Sie können nur einen der beiden verwenden. Da bash das erste war, wird Ihr Skript als Bash-Skript ausgeführt.

In Ihrem Skript haben Sie jedoch expect Befehle wie spawn und send. Da das Skript von bash und nicht von expect gelesen wird, schlägt dies fehl. Sie können dies umgehen, indem Sie verschiedene expect - Skripte schreiben und sie aus Ihrem bash - Skript aufrufen oder das Ganze in expect übersetzen.

Der beste Weg und einer, der die schreckliche Praxis vermeidet, Ihre Passwörter im Klartext in einer einfachen Textdatei zu haben, besteht darin, stattdessen passwortloses ssh einzurichten. Auf diese Weise benötigt scp kein Passwort und Sie benötigen expect nicht:

  1. Erstellen Sie zunächst einen öffentlichen SSH-Schlüssel auf Ihrem Computer:

    ssh-keygen -t rsa
    

    Sie werden nach einer Passphrase gefragt, die Sie eingeben müssen, wenn Sie nach jeder Anmeldung zum ersten Mal einen ssh-Befehl ausführen. Dies bedeutet, dass Sie für mehrere ssh- oder scp-Befehle diese nur einmal eingeben müssen. Lassen Sie die Passphrase leer, um einen vollständig kennwortlosen Zugriff zu erhalten.

  2. Nachdem Sie Ihren öffentlichen Schlüssel generiert haben, kopieren Sie ihn auf jeden Computer in Ihrem Netzwerk:

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

    Das IPlistfile.txt sollte eine Datei sein, die den Namen oder die IP eines Servers in jeder Zeile enthält. Zum Beispiel:

    Host1
    Host2
    Host3
    

    Da dies das erste Mal ist, dass Sie dies tun, müssen Sie das Kennwort für jede IP manuell eingeben. Sobald Sie dies getan haben, können Sie Dateien auf eine dieser Maschinen kopieren:

    scp file [email protected]:/path/to/file
    
  3. Entfernen Sie die Erwartung aus Ihrem Skript. Nachdem Sie jetzt kennwortlosen Zugriff haben, können Sie Ihr Skript wie folgt verwenden:

    #!/bin/bash
    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
      scp filePath [email protected]:/usr/tmp   
    Elif [ $choice -eq "2" ]
    then
      scp filePath [email protected]:/usr/tmp   
    Elif [ $choice -eq "3" ]
    then
      scp filePath [email protected]:/usr/tmp   
    else
      echo "Wrong input"
    fi
    
20
terdon

Ihr Code kann viel prägnanter sein:

#!/bin/bash

read -p "Enter file name: " filePath
if ! [[ -r $filePath ]]; then
    echo "cannot read $filePath"
    exit 1
fi

PS3="Where you want to copy? "
select Host in Host1 Host2 Host3; do
    if [[ -n $Host ]]; then
        expect <<END
            spawn scp "$filePath" [email protected]$Host:/usr/tmp   
            expect "password"   
            send "MyPassword\r"
            expect eof
END
        break
    fi
done

Wenn Sie die SSH-Schlüssel wie vorgeschlagen einrichten, ist es noch besser:

    if [[ -n $Host ]]; then
        scp "$filePath" [email protected]$Host:/usr/tmp   
        break
    fi
5
glenn jackman

spawn ist ein expect Befehl . Es funktioniert nicht, wenn Ihr Interpreter /bin/bash Ist.

3
l0b0