কীভাবে বাশ স্ক্রিপ্টটি ব্যবহারকারীর উত্তরের জন্য অপেক্ষা করতে জোর করবেন?


3

ইতিমধ্যে অনুরূপ প্রশ্ন আছে তবে আমি এটি পোস্ট করছি কারণ উত্তরগুলির কোনওটিই কাজ করে না। আমি আমার আর্চ সিস্টেমে প্যাকম্যান এবং এআর প্যাকেজগুলির ইনস্টলেশন স্বয়ংক্রিয় করতে বাশ স্ক্রিপ্ট লিখছি। প্যাকেজটির নাম দিয়ে একটি ফাইল (মাইফাইল) প্রথম লাইনে লাইন এবং তারপরে শব্দ দ্বারা শব্দ এবং প্রতিটি শব্দের জন্য ইনস্টলেশন সম্পাদন করা ধারণা। এটি প্যাকম্যানের পক্ষে সূক্ষ্ম কাজ করে তবে এআউআর হেল্পারের (অরম্যান) পক্ষে নয়। আরমানের অংশটি দেখতে এরকম দেখাচ্ছে:

while read line; do
if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
then
    aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
    for aurpkg in $aurline
    do
       sudo -u "${my_user}" bash << EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF
    done
fi
done < "$myfile"

বিকল্পগুলির সাথে --noconfirm --needed --noedit aurman আমাকে হ্যাঁ / নায়ের জন্য অনুরোধ করে না তবে কিছু প্যাকেজগুলির জন্য এটি আমাকে একটি সংখ্যার জন্য অনুরোধ জানায়। সুতরাং সমস্যাটি এই ক্ষেত্রে স্ক্রিপ্টটি অপেক্ষা করে না, প্যাকেজটি ইনস্টল হয় না এবং অরমন একটি ত্রুটি তৈরি করে "EOFError: EOF একটি লাইন পড়ার সময়"। আমি স্ক্রিপ্টটি এভাবে বিরতি দেওয়ার চেষ্টা করেছি:

aurman ...
wait

বা এই মত:

aurman ... &
wait

তবে এগুলির কোনওটিই কাজ করে না।

আরমান যখন আমাকে একটি সংখ্যার জন্য অনুরোধ করে আমি কীভাবে আমার স্ক্রিপ্টটি থামিয়ে দিতে পারি? এই জাতীয় ক্ষেত্রে সাধারণ পদ্ধতি কী? আমি স্ক্রিপ্টটি চালানোর সময় থেকেই কীভাবে নির্দিষ্ট প্যাকেজের জন্য উত্তর দিতে পারি (উদাহরণস্বরূপ প্যাকেজ এক্সের জন্য 1)?


আমি জানি না aurmanতবে সম্ভবত expectআপনার প্রয়োজনীয় সরঞ্জাম। দেখুন man 1 expectএবং এই উত্তর
কামিল ম্যাকিয়েরোস্কি

উত্তর:


4

মূল সমস্যাটি হ'ল স্টিডিন (যা aurmanথেকে পড়ার চেষ্টা করছে) ব্যবহারকারীর কাছ থেকে আসে নি, এটি প্রথমে পুনর্নির্দেশ করা হচ্ছে $myfileএবং তারপরে sudoচালানোর জন্য শেল কমান্ড সম্বলিত একটি এখানে-নথি থেকে। একটি বিকল্প হ'ল # 3 (যা সাধারণত অব্যবহৃত থাকে) এর মতো একটি আলাদা ফাইল বর্ণনাকারীর মাধ্যমে সেই ফাইলগুলি পাস করা। আমি মনে করি আপনি এটির নীচে থাকা শেলটি সরিয়েও এটিকে সহজ করতে পারবেন sudo- যেহেতু আপনি aurmanঅগ্রভাগে চলেছেন, waitএটির জন্য কোনও প্রয়োজন নেই , সুতরাং আপনার শেলটির প্রয়োজন নেই (এবং সুতরাং এখানে ডকটির প্রয়োজন নেই) )।

while read line <&3; do
    if [[ "$line" =~ \$[[:space:]]aurman[[:space:]]-S[[:space:]][[:alnum:]]* ]]
    then
        aurline=$(echo "$line" | awk '{ $1=""; $2=""; $3=""; print}' | sed 's/^ *//')
        for aurpkg in $aurline
        do
            sudo -u "${my_user}" aurman -S --noconfirm --needed --noedit "$aurpkg"
        done
    fi
done 3< "$myfile"

যদি এটি কাজ না করে এবং আপনার আসলে শেলটি চালনার প্রয়োজন হয় তবে sudoআপনি এফডি # 3 এর মাধ্যমেও এটি পুনর্নির্দেশ করতে পারেন, এবং bashস্ক্রিপ্ট হিসাবে এটি পড়েছেন:

            sudo -u "${my_user}" bash /dev/fd/3 3<< EOF
aurman -S --noconfirm --needed --noedit "$aurpkg"
wait
EOF

0

বাশের জন্য, স্লিপ কমান্ড রয়েছে, যা স্ক্রিপ্টটিকে সেকেন্ডের মধ্যে সময় ব্যয় না করে ঘুমিয়ে রাখে। যাইহোক, আপনি যা চান সেটি যদি পাসওয়ার্ড ধরা হয় তবে নীচের 2 টি পদ্ধতির মধ্যে একটি (আমি নীচে যে স্ক্রিপ্টটি নীচে রেখেছি তা পরীক্ষা করুন, ঘুম কীভাবে কাজ করে তা চিত্রিত করার জন্য, এবং নীচে উল্লিখিত 2 টি বিকল্পও দেখুন) recommend

  • স্ক্রিপ্ট শুরু করার সময় আপনি প্যারামিটার হিসাবে পাসওয়ার্ডটি প্রেরণ করতে পারেন।
  • আপনি রিড কমান্ডটি ব্যবহার করতে পারেন , গ্রাহক প্রবেশ না করা পর্যন্ত এটি ইনপুট রেকর্ড করবে।

[root@client ~]# cat readPass.sh
#!/bin/bash

# Author: @djcerdas
password="$1"

# Sample sleep command
echo "Hi, I am the PID $$, I am going to sleep 3 seconds"
date&&sleep 3&&date
echo "---------------------------------------"
# Sample method 1: passing password a parameter
echo  "Method 1: The password is $password"
password=""
echo "---------------------------------------"
# Sample method 2: using read
echo "Method 2: Please provide your password:"
read password
echo The password is $password

[root@client ~]# ./readPass.sh myPasswordX
Hi, I am the PID 2257, I am going to sleep 3 seconds
Tue Apr  3 01:17:55 CST 2018
Tue Apr  3 01:17:58 CST 2018
---------------------------------------
Method 1: The password is myPasswordX
---------------------------------------
Method 2: Please provide your password:
myNewPassword
The password is myNewPassword
[root@client ~]#

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