Używam Mac OS X 10.9.4, poniżej znajduje się mój skrypt do kopiowania plików z lokalnego komputera na inny 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
po uruchomieniu tego skryptu otrzymuję następujące informacje
./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
źródło
źródło
Odpowiedzi:
Twój skrypt próbuje połączyć dwóch tłumaczy. Masz zarówno
#!/bin/bash
i#!/usr/bin/expect
. To nie zadziała. Możesz użyć tylko jednego z dwóch. Odbash
pierwszego uruchomienia skrypt jest uruchamiany jako skrypt bash.Jednak w twoim skrypcie masz
expect
takie polecenia, jakspawn
isend
. Ponieważ skrypt jest czytany przez,bash
a nie przezexpect
, kończy się to niepowodzeniem. Można to obejść, pisząc różneexpect
skrypty i wywołując je zebash
skryptu lub tłumacząc całośćexpect
.Najlepszym sposobem jednak, który pozwala uniknąć okropnej praktyki posiadania haseł w postaci zwykłego tekstu w prostym pliku tekstowym, jest skonfigurowanie bezhasłowego ssh. W ten sposób
scp
hasło nie będzie potrzebne i nie będziesz potrzebowaćexpect
:Najpierw utwórz publiczny klucz ssh na swoim komputerze:
Zostaniesz poproszony o hasło, które zostaniesz poproszony o podanie pierwszego polecenia ssh po każdym logowaniu. Oznacza to, że w przypadku wielu poleceń ssh lub scp wystarczy wprowadzić je tylko raz. Pozostaw hasło puste, aby uzyskać dostęp całkowicie bez hasła.
Po wygenerowaniu klucza publicznego skopiuj go na każdy komputer w sieci:
The
IPlistfile.txt
Powinien być plik zawierający nazwę serwera lub adres IP na każdej linii. Na przykład:Ponieważ robisz to po raz pierwszy, będziesz musiał ręcznie wprowadzić hasło dla każdego adresu IP, ale gdy to zrobisz, będziesz mógł skopiować pliki na dowolny z tych komputerów za pomocą prostego:
Usuń oczekiwanie ze skryptu. Teraz, gdy masz dostęp bez hasła, możesz używać skryptu jako:
źródło
Twój kod może być o wiele bardziej zwięzły:
Jeśli skonfigurujesz klucze ssh zgodnie z sugestią, jeszcze lepiej:
źródło
spawn
toexpect
polecenie . To nie zadziała, jeśli twój tłumacz jest/bin/bash
.źródło