आपकी स्क्रिप्ट दो दुभाषियों को मिलाने का प्रयास कर रही है। आप दोनों है #!/bin/bash
और #!/usr/bin/expect
। यह काम नहीं करेगा। आप केवल दो में से एक का उपयोग कर सकते हैं। चूंकि bash
पहले, आपकी स्क्रिप्ट बैश स्क्रिप्ट के रूप में चलाई जा रही थी।
हालाँकि, आपकी स्क्रिप्ट के भीतर, आपके पास expect
जैसे spawn
और कमांड हैं send
। चूंकि स्क्रिप्ट को पढ़ा जा रहा है bash
और इसके द्वारा नहीं expect
, यह विफल है। आप अलग-अलग expect
स्क्रिप्ट लिखकर और उन्हें अपनी bash
स्क्रिप्ट से कॉल करके या पूरी बात का अनुवाद करके इसे प्राप्त कर सकते हैं expect
।
सबसे अच्छा तरीका है, और एक है कि एक साधारण पाठ फ़ाइल में सादे पाठ में अपने पासवर्ड होने के भयानक अभ्यास से बचा जाता है, इसके बजाय पासवर्डलेस एसएच सेट करना है। इस तरह, scp
आपको पासवर्ड की आवश्यकता नहीं होगी और आपको इसकी कोई आवश्यकता नहीं है expect
:
सबसे पहले, अपनी मशीन पर एक सार्वजनिक ssh कुंजी बनाएँ:
ssh-keygen -t rsa
आपको पासफ़्रेज़ के लिए कहा जाएगा, जिसे आपको प्रत्येक लॉगिन के बाद पहली बार ssh कमांड चलाने के लिए कहा जाएगा। इसका मतलब है कि कई ssh या scp कमांड के लिए, आपको केवल एक बार ही प्रवेश करना होगा। पासवर्डलेस एक्सेस के लिए पासफ़्रेज़ को खाली छोड़ दें।
जब आप अपनी सार्वजनिक कुंजी जनरेट कर लेते हैं, तो इसे अपने नेटवर्क के प्रत्येक कंप्यूटर पर कॉपी करें:
while read ip; do
ssh-copy-id -i ~/.ssh/id_rsa.pub user1@$ip
done < IPlistfile.txt
IPlistfile.txt
प्रत्येक पंक्ति पर एक सर्वर के नाम या IP वाली फ़ाइल होना चाहिए। उदाहरण के लिए:
host1
host2
host3
चूंकि यह पहली बार है जब आप ऐसा करते हैं, तो आपको मैन्युअल रूप से प्रत्येक आईपी के लिए पासवर्ड दर्ज करना होगा, लेकिन एक बार जब आप ऐसा कर लेंगे, तो आप इन मशीनों में से किसी भी फाइल को एक साधारण से कॉपी कर पाएंगे:
scp file user@host1:/path/to/file
अपनी स्क्रिप्ट से उम्मीद को हटा दें। अब जब आपके पास पासवर्ड रहित पहुंच है, तो आप अपनी स्क्रिप्ट का उपयोग कर सकते हैं:
#!/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