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. Sejak bash
pertama kali, skrip Anda dijalankan sebagai skrip bash.
Namun, dalam skrip Anda, Anda memiliki expect
perintah seperti spawn
dan send
. Karena skrip sedang dibaca oleh bash
dan bukan oleh expect
, ini gagal. Anda dapat menyiasatinya dengan menulis expect
skrip yang berbeda dan memanggilnya dari bash
skrip 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, scp
tidak perlu kata sandi dan Anda tidak perlu expect
:
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.
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.txt
harus 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
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