অ ইন্টারেক্টিভ স্ক্রিপ্টে sudo


9

আমি একটি স্ক্রিপ্ট তিন ফাংশন executes আছে: A && B && C

Bএকটি সুপার-ব্যবহারকারী হিসাবে ফাংশনটি চালানো দরকার, যখন নেই Aএবং Cনা।

আমার বেশ কয়েকটি সমাধান রয়েছে তবে এর একটিও সন্তোষজনক নয়:

  1. পুরো স্ক্রিপ্ট sudo: sudo 'A && B && C'

    এটি চালানোর জন্য একটি খারাপ ধারণা Aএবং Cসুপার-ইউজার হিসাবে এটির প্রয়োজন না হলে মনে হয়

  2. স্ক্রিপ্টটি ইন্টারেক্টিভ করুন: A && sudo B && C

    আমার পাসওয়ার্ডটি টাইপ-ইন করতে হতে পারে তবে আমি চাই আমার স্ক্রিপ্টটি অ-ইন্টারেক্টিভ হোক, কারণ প্রতিটি ফাংশনে কিছুটা সময় নিতে পারে এবং আমি চাই না যে স্ক্রিপ্টটি আমার জন্য অপেক্ষা করবে। ঠিক আছে, এ কারণেই এটি প্রথম স্থানে একটি স্ক্রিপ্ট, সুতরাং আমাকে এটি চালানো দেখতে হবে না।

  3. বোকা সমাধান: sudo : && A && sudo -n B && C

    প্রথমে প্রথমে কোনও অপ-চালানো বোকামি বলে মনে হচ্ছে sudoএবং আমার আঙুলটিও অবশ্যই কাটতে হবে যা A এর চেয়ে বেশি নেবে না $sudo_timeout

  4. হাইপোথিটিক্যাল সমাধান (আমি আশা করি আপনি এটি আমাকে বলুন এটি বিদ্যমান):

    sudo --store-cred 'A && sudo --use-cred-from-parent-sudo B && C'

    এটি শুরুতে আমার পাসওয়ার্ডের জন্য অনুরোধ জানাবে এবং তারপরে প্রয়োজনের সময় কেবলমাত্র সেই শংসাপত্রগুলি ব্যবহার করবে।

এই সব সম্পর্কে আপনার মতামত কি? আমি খুব অবাক হয়েছি যে এই সমস্যার কোনও সমাধান নেই, কারণ আমি মনে করি এটি একটি সাধারণ সমস্যা (কী সম্পর্কে make all && sudo make install)


3
আপনি একটি স্ক্রিপ্ট তৈরি করতে পারেন যা আপনি sudo দিয়ে সম্পাদন করেন তবে স্ক্রিপ্টে এবং Aএবং Cঅংশগুলি স্পষ্টভাবে ব্যবহার করে সম্পাদন করতে পারেন su -l some_non_priviliged_user। সময়সীমা ছাড়ার সমস্যা নেই এবং এ এবং সি এর জন্য কোনও প্রাইভেলিজ নেই বলে আমি মনে করি না যে 4 টি সম্ভব, এটি sudoকোনও ব্যবহারকারীর জন্য "গ্লোবাল স্টেট" বলে মনে হয়।
অ্যান্থন

উত্তর:


7

আমি মনে করি আপনি করতে পারেন এমন সেরা কাজটি হ'ল স্ক্রিপ্টটি চালু করা sudoএবং তারপরে আপনি সাধারণ ব্যবহারকারী হিসাবে চালাতে চান এমন প্রক্রিয়াগুলি স্পষ্টভাবে su userবা এর সাথে চালু করতে sudo -u user:

#!/usr/bin/env bash

## Detect the user who launched the script
usr=$(env | grep SUDO_USER | cut -d= -f 2)

## Exit if the script was not launched by root or through sudo
if [ -z $usr ] && [ $USER = "root" ]
then
    echo "The script needs to run as root" && exit 1
fi

## Run the job(s) that don't need root
sudo -u $usr commandA

## Run the job that needs to be run as root
commandB

9

আপনার স্ক্রিপ্টটি বৈশিষ্ট্যে /etc/sudoersফাইলটিতে যুক্ত করুন NOPASSWD, যাতে এটি পাসওয়ার্ডের জন্য অনুরোধ না করে চালানোর অনুমতি দেয়। আপনি এটিকে কোনও নির্দিষ্ট ব্যবহারকারীর (বা ব্যবহারকারীদের সেট) বেঁধে রাখতে পারেন, বা এটি sudoআপনার সিস্টেমে যে কেউ দ্বারা চালিত হতে পারবেন ।

নামক একটি স্ক্রিপ্টের জন্য একটি নমুনা লাইন এর /usr/local/bin/bossyমতো দেখতে পারে

ALL ALL = (root) NOPASSWD: /usr/local/bin/bossy

এবং আপনি এই জাতীয় কিছু ব্যবহার করতে চাইবেন

A && sudo bossy && C

এই উদাহরণের জন্য আমি ধরে নিয়েছি এর PATHমধ্যে রয়েছে /usr/local/bin। যদি তা না হয় তবে স্ক্রিপ্টের পুরো পথটি ব্যবহার করুন, অর্থাত্‍sudo /usr/local/bin/bossy


সর্বাধিক সুরক্ষিত পদ্ধতির জন্য উত্সাহ দিন।
eyoung100

0

আপনি !requirettyবিকল্পটি sudoপাশাপাশি বিকল্পটিও ব্যবহার করতে চাইতে পারেন NOPASSWD। তবে মনে রাখবেন এটি সুরক্ষা হ্রাস করে।


1
যেহেতু সমস্যাটি স্ক্রিপ্টটি ইন্টারেক্টিভ হিসাবে না চাওয়া হিসাবে সংজ্ঞায়িত করা হয়েছে, # 2 /etc/sudoersব্যবহারকারীর সাথে কমান্ড কার্যকর করতে প্রবেশের Bসাথে NOPASSWDসঠিক উত্তর is
অ্যান্ড্রু

এটি "আপনি এক্স বা ওয়াই করতে পারতেন", এটি ছিল "আপনি এক্স এবং ওয়াই করতে পারেন"। উভয়ই সমস্যার সমাধান করবে। সম্ভবত আমার উত্তরটি আমার পুনরায় লেখা উচিত।
স্টিভ উইলস 21

0

আমার প্রু-অনুমোদনের উত্তরটির উপর ভিত্তি করে ? (সুতরাং এটি পরে চালানো যেতে পারে) , দুটি স্ক্রিপ্ট লিখুন:

  • ABC_script:

    #!/bin/sh
    sudo -b ./B_script
    A  &&  > A_is_done
    while [ ! -f B_is_done ]
    do
            sleep 60
    done
    rm -f B_is_done
    C
  • B_script:

    #!/bin/sh
    while [ ! -f A_is_done ]
    do
            sleep 60
    done
    rm -f A_is_done
    B  &&  > B_is_done

চালান ./ABC_script:

  • এটি চলবে sudo -b ./B_script। এই পাসওয়ার্ড (জন্য অনুরোধ অবিলম্বে আপনি চালাতে পর ABC_script)। Assuming যে সঠিক পাসওয়ার্ডটি প্রবেশ করানো হয়, এটা spawns B_scriptমধ্যে ackground (কারণ -bউল্লেখ করা হয়েছে) রুট হিসাবে। এটি সমতুল্য বলে মনে হচ্ছে sudo sh -c "./B_script &"
  • B_scriptএর সাথে সমান্তরালে, অ্যাসিঙ্ক্রোনালি চলমান শুরু হয় ABC_script।  B_scriptকল হওয়া কোনও ফাইলের অস্তিত্বের পরীক্ষা করে A_is_done এটি প্রদর্শিত না হওয়া অবধি লুপ হয়।
  • সমান্তরালে, ABC_scriptরান A। যদি / যখন Aসফলভাবে শেষ হয়, স্ক্রিপ্টটি একটি ফাইল তৈরি করে A_is_done
  • ABC_scriptতারপরে ফোন করা অস্তিত্বের জন্য পরীক্ষা করা হয় B_is_done এবং এটি উপস্থিত না হওয়া অবধি লুপ হয়।
  • সমান্তরালভাবে, B_scriptএর অস্তিত্ব সনাক্ত করে A_is_doneএবং লুপ থেকে বেরিয়ে যায়। এটি A_is_doneফাইলটি মুছে ফেলে এবং চালায় B। মনে রাখবেন, B_scriptরুট হিসাবে চলমান, তাই এটি Bরুট হিসাবে চলে । যদি / যখন Bসাফল্যের সাথে শেষ হয়, স্ক্রিপ্টটি একটি ফাইল তৈরি করে B_is_doneএবং প্রস্থান করে।
  • সমান্তরালভাবে, ABC_scriptএর অস্তিত্ব সনাক্ত করে B_is_doneএবং লুপ থেকে বেরিয়ে যায়। এটি B_is_doneফাইলটি মুছে দেয় । মনে রাখবেন, B_scriptরুট হিসাবে দৌড়াদৌড়ি, তাই রুটের B_is_doneমালিকানাধীন, এবং আপনি rm -fনিশ্চয়তার জন্য অনুরোধ না এড়াতে ব্যবহার করতে চান । ABC_scriptতারপরে Cদৌড়ে বের হয়

আরও পরিমার্জন জন্য নোট:

  • ABC_scriptএর B_scriptচেয়ে সম্ভবত একটি পরম পথে চালানো উচিত ./
  • বরং A_is_doneএবং B_is_done, ABC_scriptসম্ভবত র্যান্ডম, অনন্য ফাইলের নামের উৎপন্ন করা উচিত নয়।
  • যে স্ক্রিপ্টটির জন্য অপেক্ষা করা প্রোগ্রামটি শেষ হয়েছে তবে ব্যর্থ হয়েছে যদি সেই স্প্রি-ওয়েটিং-কে বিজ্ঞপ্তি দেওয়া হয় তবে সেই স্ক্রিপ্টের জন্য ব্যবস্থা রাখা দরকার। (এই মুহুর্তে, যদি Aব্যর্থ হয় তবে উভয় স্ক্রিপ্টগুলি কেবল অসীম অপেক্ষার লুপে যায়।) এটি পরিবর্তনের মতোই সহজ হতে পারে

    A  &&  > A_is_done

    প্রতি

    A; echo $? > A_is_done

    এবং তারপরে স্পিন-সংশোধন করে X_is_doneফাইলগুলি পড়তে অপেক্ষা করুন এবং এতে 0 রয়েছে এবং অন্যথায় প্রস্থান করলে এটি এগিয়ে যান।


-3

বোবা হও। অনেক লাইন ব্যবহার করুন।

if A; then

    if sudo B ; then
        C
    fi
fi

কীভাবে তা আমার উদ্বেগের সমাধান করছে? সমস্যাটির কোনও &&
যোগসূত্র নেই

&& প্রথম কমান্ড ব্যর্থ হলে কার্যকর করা বন্ধ করে দেয়। যদি বিবৃতি এটি আরও ভার্চুয়ালভাবে করে। আমার বক্তব্যটি হ'ল আপনার কাজটি করা, এটি সুন্দর না হলেও।
রবার্ট জ্যাকবস

1
এটি বিকল্প 2: এর আরও ভার্বোজ সংস্করণ ছাড়া আর কিছুই নয় A && sudo B && C। এন্টোইন যেমন প্রশ্নে ব্যাখ্যা করেছেন; Aএটি শেষ না হওয়া অবধি পাসওয়ার্ড জিজ্ঞাসা করে না , এবং তার জন্য অপেক্ষা করতে বা স্ক্রিপ্টটি তার জন্য অপেক্ষা করতে চায় না।
স্কট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.