Senaryonuz iki tercümanı birleştirmeye çalışıyor. Sen ikisine de sahip #!/bin/bash
ve #!/usr/bin/expect
. Bu işe yaramaz. İkisinden yalnızca birini kullanabilirsiniz. Dan beribash
, betiğiniz bash betiği olarak çalıştırılıyor.
Ancak, komut dosyası içinde, sahip expect
gibi komutları spawn
ve send
. Komut dosyası tarafından okunuyor bash
ve okunmuyor expect
, bu başarısız oluyor. Farklı expect
komut dosyaları yazıp komut bash
dosyanızdan çağırarak veya her şeyi şu dile çevirerek bu sorunu çözebilirsiniz expect
.
Yine de en iyi yol ve basit bir metin dosyasında düz metin parola sahip olmak korkunç bir uygulama önler, bunun yerine parolasız ssh kurmaktır. Bu şekilde, scp
bir parolaya ihtiyaç duymazsınız ve şunlara ihtiyacınız yoktur expect
:
İlk olarak, makinenizde genel bir ssh anahtarı oluşturun:
ssh-keygen -t rsa
Her girişten sonra herhangi bir ssh komutunu ilk çalıştırdığınızda girmeniz istenecek bir parola girmeniz istenecektir. Bu, birden fazla ssh veya scp komutu için yalnızca bir kez girmeniz gerektiği anlamına gelir. Tamamen şifresiz erişim için parolayı boş bırakın.
Genel anahtarınızı oluşturduktan sonra, ağınızdaki her bilgisayara kopyalayın:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
IPlistfile.txt
Her satıra bir sunucunun adını veya IP içeren bir dosya olmalıdır. Örneğin:
host1
host2
host3
Bunu ilk kez yaptığınızdan, her IP için şifreyi manuel olarak girmeniz gerekecektir, ancak bunu yaptıktan sonra, bu makinelerin herhangi birine basit bir şekilde dosya kopyalayabilirsiniz:
scp file user@host1:/path/to/file
Beklentiyi betiğinizden kaldırın. Artık şifresiz erişime sahip olduğunuza göre, komut dosyanızı şu şekilde kullanabilirsiniz:
#!/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