স্প্যান - কমান্ড পাওয়া গেল না!


15

আমি ম্যাক ওএস এক্স ১০.৯.৪ ব্যবহার করছি, স্থানীয় মেশিন থেকে বিভিন্ন হোস্টে ফাইলগুলি অনুলিপি করতে আমার স্ক্রিপ্টটি নিম্নলিখিত

#!/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প্রথম থেকেই , আপনার স্ক্রিপ্টটি ব্যাশ স্ক্রিপ্ট হিসাবে চালানো হচ্ছে run

যাইহোক, আপনার স্ক্রিপ্ট মধ্যে আপনি expectযেমন কমান্ড spawnএবং send। যেহেতু স্ক্রিপ্টটি দ্বারা bashএবং না দ্বারা পড়া হচ্ছে তাই এটি expectব্যর্থ হয়। আপনি বিভিন্ন expectস্ক্রিপ্ট লিখতে এবং আপনার bashস্ক্রিপ্ট থেকে তাদের কল করে বা পুরো জিনিসটি অনুবাদ করে এটি পেতে পারেন expect

যদিও সবচেয়ে ভাল উপায় এবং যে কোনও সাধারণ পাঠ্য ফাইলে আপনার পাসওয়ার্ডগুলি সরল পাঠ্যে থাকা ভয়াবহ অনুশীলনকে এড়িয়ে চলেছে তা হল এর পরিবর্তে পাসওয়ার্ডহীন এসএসএস সেটআপ করা। এইভাবে, scpকোনও পাসওয়ার্ডের প্রয়োজন হবে না এবং আপনার প্রয়োজন নেই expect:

  1. প্রথমে আপনার মেশিনে একটি পাবলিক এসএস কী তৈরি করুন:

    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
আপনি যদি কোনও এসএস-এজেন্ট চালু করেন তবে আপনাকে কেবল একবার পাসফ্রেজ প্রবেশ করতে হবে। অন্যথায়, আপনাকে এটি প্রতিবার প্রবেশ করতে হবে।
গ্লেন জ্যাকম্যান

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

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.