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
bash
shell-script
expect
dev2d
sumber
sumber
Jawaban:
Script Anda berusaha menggabungkan dua penerjemah. Anda memiliki keduanya
#!/bin/bash
dan#!/usr/bin/expect
. Itu tidak akan berhasil. Anda hanya dapat menggunakan salah satu dari keduanya. Sejakbash
pertama kali, skrip Anda dijalankan sebagai skrip bash.Namun, dalam skrip Anda, Anda memiliki
expect
perintah sepertispawn
dansend
. Karena skrip sedang dibaca olehbash
dan bukan olehexpect
, ini gagal. Anda dapat menyiasatinya dengan menulisexpect
skrip yang berbeda dan memanggilnya daribash
skrip Anda atau dengan menerjemahkan semuanya keexpect
.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,
scp
tidak perlu kata sandi dan Anda tidak perluexpect
:Pertama, buat kunci ssh publik di mesin Anda:
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.
Setelah Anda membuat kunci publik, salin ke setiap komputer di jaringan Anda:
The
IPlistfile.txt
harus file yang berisi nama server atau IP pada setiap baris. Sebagai contoh: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:
Hapus harapan dari skrip Anda. Sekarang Anda memiliki akses tanpa kata sandi, Anda dapat menggunakan skrip Anda sebagai:
sumber
Kode Anda bisa lebih ringkas:
Jika Anda mengatur kunci ssh seperti yang disarankan, itu lebih baik:
sumber
spawn
adalah sebuahexpect
perintah . Ini tidak akan berfungsi jika penerjemah Anda/bin/bash
.sumber