spawn - perintah tidak ditemukan!

15

Saya menggunakan Mac OS X 10.9.4, berikut ini adalah skrip saya untuk menyalin file dari mesin lokal ke host yang berbeda

#!/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

saat menjalankan skrip ini saya mendapatkan pengikut

./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
dev2d
sumber
Dalam kasus saya, saya membutuhkan penanda EOD di sekitar kode harapan. stackoverflow.com/questions/26125036/...
AnneTheAgile

Jawaban:

20

Script Anda berusaha menggabungkan dua penerjemah. Anda memiliki keduanya #!/bin/bashdan #!/usr/bin/expect. Itu tidak akan berhasil. Anda hanya dapat menggunakan salah satu dari keduanya. Sejak bashpertama kali, skrip Anda dijalankan sebagai skrip bash.

Namun, dalam skrip Anda, Anda memiliki expectperintah seperti spawndan send. Karena skrip sedang dibaca oleh bashdan bukan oleh expect, ini gagal. Anda dapat menyiasatinya dengan menulis expectskrip yang berbeda dan memanggilnya dari bashskrip Anda atau dengan menerjemahkan semuanya ke expect.

Namun, cara terbaik, dan yang menghindari praktik mengerikan yaitu memasukkan kata sandi dalam teks biasa dalam file teks sederhana, adalah dengan mengatur kata sandi ssh sebagai gantinya. Dengan begitu, scptidak perlu kata sandi dan Anda tidak perlu expect:

  1. Pertama, buat kunci ssh publik di mesin Anda:

    ssh-keygen -t rsa

    Anda akan diminta untuk memasukkan frasa sandi yang akan Anda masukkan pertama kali menjalankan perintah ssh setelah setiap login. Ini berarti bahwa untuk beberapa perintah ssh atau scp, Anda hanya perlu memasukkannya satu kali. Biarkan frasa sandi kosong untuk akses tanpa kata sandi sama sekali.

  2. Setelah Anda membuat kunci publik, salin ke setiap komputer di jaringan Anda:

    while read ip; do 
     ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip 
    done < IPlistfile.txt

    The IPlistfile.txtharus file yang berisi nama server atau IP pada setiap baris. Sebagai contoh:

    host1
    host2
    host3

    Karena ini adalah pertama kalinya Anda melakukan ini, Anda harus secara manual memasukkan kata sandi untuk setiap IP tetapi setelah Anda melakukannya, Anda akan dapat menyalin file ke salah satu mesin ini dengan sederhana:

    scp file user@host1:/path/to/file
  3. Hapus harapan dari skrip Anda. Sekarang Anda memiliki akses tanpa kata sandi, Anda dapat menggunakan skrip Anda sebagai:

    #!/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 uname@host1:/usr/tmp   
    elif [ $choice -eq "2" ]
    then
      scp filePath uname@host2:/usr/tmp   
    elif [ $choice -eq "3" ]
    then
      scp filePath uname@host3:/usr/tmp   
    else
      echo "Wrong input"
    fi
terdon
sumber
1
Jika Anda meluncurkan ssh-agent, Anda hanya perlu memasukkan frasa sandi satu kali. Kalau tidak, Anda harus memasukkannya setiap waktu.
glenn jackman
5

Kode Anda bisa lebih ringkas:

#!/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" uname@$host:/usr/tmp   
            expect "password"   
            send "MyPassword\r"
            expect eof
END
        break
    fi
done

Jika Anda mengatur kunci ssh seperti yang disarankan, itu lebih baik:

    if [[ -n $host ]]; then
        scp "$filePath" uname@$host:/usr/tmp   
        break
    fi
glenn jackman
sumber