स्पॉन - कमांड नहीं मिला!


15

मैं मैक ओएस एक्स 10.9.4 का उपयोग कर रहा हूं, स्थानीय मशीन से विभिन्न होस्ट में फ़ाइलों की प्रतिलिपि बनाने के लिए मेरी स्क्रिप्ट निम्नलिखित है

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

जब इस स्क्रिप्ट को चला रहा हूं तो मैं इसका अनुसरण कर रहा हूं

./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

मेरे मामले में मुझे उम्मीद कोड के आसपास ईओडी मार्करों की आवश्यकता थी। stackoverflow.com/questions/26125036/…
AnneTheAgile

जवाबों:


20

आपकी स्क्रिप्ट दो दुभाषियों को मिलाने का प्रयास कर रही है। आप दोनों है #!/bin/bashऔर #!/usr/bin/expect। यह काम नहीं करेगा। आप केवल दो में से एक का उपयोग कर सकते हैं। चूंकि bashपहले, आपकी स्क्रिप्ट बैश स्क्रिप्ट के रूप में चलाई जा रही थी।

हालाँकि, आपकी स्क्रिप्ट के भीतर, आपके पास expectजैसे spawnऔर कमांड हैं send। चूंकि स्क्रिप्ट को पढ़ा जा रहा है bashऔर इसके द्वारा नहीं expect, यह विफल है। आप अलग-अलग expectस्क्रिप्ट लिखकर और उन्हें अपनी bashस्क्रिप्ट से कॉल करके या पूरी बात का अनुवाद करके इसे प्राप्त कर सकते हैं expect

सबसे अच्छा तरीका है, और एक है कि एक साधारण पाठ फ़ाइल में सादे पाठ में अपने पासवर्ड होने के भयानक अभ्यास से बचा जाता है, इसके बजाय पासवर्डलेस एसएच सेट करना है। इस तरह, scpआपको पासवर्ड की आवश्यकता नहीं होगी और आपको इसकी कोई आवश्यकता नहीं है expect:

  1. सबसे पहले, अपनी मशीन पर एक सार्वजनिक ssh कुंजी बनाएँ:

    ssh-keygen -t rsa

    आपको पासफ़्रेज़ के लिए कहा जाएगा, जिसे आपको प्रत्येक लॉगिन के बाद पहली बार ssh कमांड चलाने के लिए कहा जाएगा। इसका मतलब है कि कई ssh या scp कमांड के लिए, आपको केवल एक बार ही प्रवेश करना होगा। पासवर्डलेस एक्सेस के लिए पासफ़्रेज़ को खाली छोड़ दें।

  2. जब आप अपनी सार्वजनिक कुंजी जनरेट कर लेते हैं, तो इसे अपने नेटवर्क के प्रत्येक कंप्यूटर पर कॉपी करें:

    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
  3. अपनी स्क्रिप्ट से उम्मीद को हटा दें। अब जब आपके पास पासवर्ड रहित पहुंच है, तो आप अपनी स्क्रिप्ट का उपयोग कर सकते हैं:

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

1
यदि आप एक ssh- एजेंट लॉन्च करते हैं, तो आपको केवल एक बार पासफ़्रेज़ दर्ज करना होगा। अन्यथा, आपको इसे हर बार दर्ज करना होगा।
ग्लेन जैकमैन

5

आपका कोड बहुत अधिक संक्षिप्त हो सकता है:

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

यदि आप सुझाए गए अनुसार ssh कीज़ सेट करते हैं, तो यह और भी बेहतर है:

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

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.