কোনও ইনস্টল স্ক্রিপ্টের সময়কালের জন্য অস্থায়ীভাবে সুডোর সময়সীমা বাড়ানো


22

আমি এমন একটি স্ক্রিপ্ট লেখার চেষ্টা করছি যা একগুচ্ছ সফ্টওয়্যার ইনস্টল করবে এবং আমার মতো সমস্ত কিছু চালানো উচিত নয় root, তাই আমি পাসওয়ার্ডের জন্য অনুরোধ করতে সক্ষম হতে চাই এবং তারপরে ইনস্টল সম্পর্কে জানার চেষ্টা করব sudoবা suআমার যখন প্রয়োজন হয় তখন সুযোগ-সুবিধা পেতে পারি।

আমি sudo -vস্ক্রিপ্টের শুরুতে একটি পাসওয়ার্ডের জন্য অনুরোধ জানাতে চেষ্টা করছিলাম এবং পরে কেবল পরে সুডো ব্যবহার করব। সময় শেষ হওয়ার পরে আমি একক ইনস্টল না হওয়া পর্যন্ত এটি দুর্দান্ত কাজ করে।

আমি স্থায়ীভাবে সময়সীমা বাড়াতে হবে না। আমি কি কেবল বর্তমান অধিবেশনের জন্য সুডোর সময়সীমা বাড়ানোর কোনও উপায় রাখি?

উত্তর:


8

আপনি একটি লুপ সেটআপ করতে পারেন যা "সুডো-ভি" পর্যায়ক্রমে সম্পাদন করতে ব্যাকগ্রাউন্ডে চলমান, আপনার স্ক্রিপ্টটি সমাপ্ত হলে অবশ্যই কৌশলটি কৌশলটি পরিষ্কারভাবে শেষ করতে লুপ পাচ্ছে। সুতরাং দুটি প্রক্রিয়ার মধ্যে এক ধরণের যোগাযোগ থাকতে হবে; tmp ফাইলগুলি এটির জন্য ভাল, এবং স্ক্রিপ্টটি চলার পরে এগুলি সহজেই পরিষ্কার করা যায়। (একটি ইনস্টল স্ক্রিপ্ট সাধারণত এটি হয়, যাইহোক।)

উদাহরণস্বরূপ (এটি ব্যবহার করার জন্য 'প্রতিধ্বনি' বিবৃতিগুলি সরিয়ে দিন; এগুলি এটি "কাজ করে" দেখায়):

#!/bin/bash
log=running_setup.txt
sudo_stat=sudo_status.txt

echo "========= running script $$ ========"
echo $$ >> $sudo_stat
trap 'rm -f $sudo_stat >/dev/null 2>&1' 0
trap "exit 2" 1 2 3 15

sudo_me() {
 while [ -f $sudo_stat ]; do
  echo "checking $$ ...$(date)"
  sudo -v
  sleep 5
 done &
}


echo "=setting up sudo heartbeat="
sudo -v
sudo_me

echo "=running setup=" | tee $log
while [ -f $log ]
do
 echo "running setup $$ ...$(date) ===" | tee -a $log
 sleep 2
done

# finish sudo loop
rm $sudo_stat

তারপরে আপনি দেখতে পাবেন ... (দ্রষ্টব্য: পিডটি টিএমপি ফাইলের মধ্যে রাখা হয়েছে, যাতে আপনি সহজেই এটি হত্যা করতে পারেন though যদিও এটি প্রয়োজনীয় নয়):

$ ./do_it.sh
========= running script 6776 ========
=setting up sudo heartbeat=
[sudo] password for user: 
=running setup=
checking 6776 ...Wed May  4 16:31:47 PDT 2011
running setup 6776 ...Wed May  4 16:31:48 PDT 2011 ===
running setup 6776 ...Wed May  4 16:31:50 PDT 2011 ===
running setup 6776 ...Wed May  4 16:31:52 PDT 2011 ===
checking 6776 ...Wed May  4 16:31:53 PDT 2011
running setup 6776 ...Wed May  4 16:31:54 PDT 2011 ===
<ctrl-c>  (cleans up files, then exits)

9

আমি মাইকেল_এন এর উত্তর পছন্দ করেছি, তবে একটি টেম্প ফাইল ব্যবহার না করার সবচেয়ে যুক্তিযুক্ত ইচ্ছা ছিল। হতে পারে এটি কিছু দৃষ্টিকোণ সরবরাহ করতে পারে।

আমার সমাধানটি ছিল:

#!/bin/bash
function sudo_ping() {
    if [[ ! -z $SUDO_PID ]]; then
        if [[ $1 -eq stop ]]; then
            echo "Stopping sudo ping in PID = $SUDO_PID"
            kill $SUDO_PID
            return
        else
            echo "Already sudo pinging in PID = $SUDO_PID"
            return
        fi
    fi

    echo "Starting background sudo ping..."
    sudo -v
    if [[ $? -eq 1 ]]; then
        echo "Oops, wrong password."
        return
    fi
    sudo echo "ok"

    while true; do
        echo 'Sudo ping!'
        sudo -v
        sleep 1
    done &
    SUDO_PID=$!
    sudo echo "Sudo pinging in PID = $SUDO_PID"

    # Make sure we don't orphan our pinger
    trap "sudo_ping stop" 0
    trap "exit 2" 1 2 3 15
}

sudo_ping
sleep 5
echo "Goodbye!"

আবার, echoবাহ্যিক ...

$ ./sudoping.sh 
Starting background sudo ping...
Password:
ok  
Sudo ping!
Sudo pinging in PID = 47531
Sudo ping!
Sudo ping!
Sudo ping!
Sudo ping!
Goodbye!
Stopping sudo ping in PID = 47531

আবার, ctrl-c কাজ করে ...

$ ./sudoping.sh 
Starting background sudo ping...
ok  
Sudo ping!
Sudo pinging in PID = 47599
Sudo ping!
^CStopping sudo ping in PID = 47599

6
এবং আরও সংক্ষিপ্ত সমাধান: gist.github.com/3118588
গ্রেগরি পার্কিনস

এর কীভাবে 1000+ upvotes নেই ??? সংক্ষিপ্ত সংস্করণটি দুর্দান্ত। (তবে এর থেকে আরও ভাল উদাহরণ সাহায্য করবে, আমি মনে করি))
মোনিকা সেলিও

3

এই সূচনার ভিত্তিতে , আমি একটি সংক্ষিপ্ত এবং পরিষ্কার সংস্করণ তৈরি করেছি:

# Prevent sudo timeout
sudo -v # ask for sudo password up-front
while true; do
  # Update user's timestamp without running a command
  sudo -nv; sleep 1m
  # Exit when the parent process is not running any more. In fact this loop
  # would be killed anyway after being an orphan(when the parent process
  # exits). But this ensures that and probably exit sooner.
  kill -0 $$ 2>/dev/null || exit
done &

আমি মনে করি গিস্ট সংস্করণটি আরও ভাল হবে, কারণ যদি sudo -Kশেল স্ক্রিপ্টের অন্য জায়গায় ডাকা হয়, তবে আপনার সংস্করণ sudo: a password is requiredপ্রতি মিনিটে স্ট্যাডারে চিৎকার করবে ।
রকাল্লাইট

পছন্দ করেছেন তারা আসলে একই।
বোহর

0

sudoম্যান পৃষ্ঠা অনুসারে :

   -v          If given the -v (validate) option, sudo will update the user's time stamp,
               prompting for the user's password if necessary.  This extends the sudo timeout for
               another 15 minutes (or whatever the timeout is set to in sudoers) but does not run
               a command.

সুতরাং আমি অনুমান করি যে আপনি যদি sudo -vআপনার সেটআপ স্ক্রিপ্টটির আরও কিছু পয়েন্ট যোগ করেন তবে সেশনটি বৈধতা দেওয়ার জন্য (এবং শুধুমাত্র শুরুতে নয়) আপনি যা চান তা পাবেন, যেহেতু প্রতিটি সময় এটি সময়সীমা বাড়িয়ে তুলবে (এটি কেবলমাত্র আবার পাসওয়ার্ড জিজ্ঞাসা করে যদি সময়সীমা শেষ হয়েছে)। কেবলমাত্র সমস্যাটি যদি আপনার স্ক্রিপ্টে কোনও আদেশ থাকে যা টাইমআউট থেকে বেশি সময় নেয় (সুতরাং আপনি যদি তার ঠিক পরে বৈধতা প্রদান করেন তবে অন্য বৈধকরণের জন্য এটি শেষ করার আগে সময়সীমা শেষ হয়ে যায়) তবে এটি খুব নির্দিষ্ট ক্ষেত্রে specific

যা ঘটে তা হ'ল কেবল ব্যবহার করা sudoসময়সীমা বাড়ায় না, এবং sudo -vকোনও আদেশ চালায় না, সুতরাং sudo -vঅধিবেশনটি বৈধ করার জন্য আপনাকে আরও সময় ব্যবহার করতে হবে।


হ্যাঁ ধন্যবাদ. সমস্যাটি হল আমার সুডোর সময়সীমাটি 5 মিনিটের কাছাকাছি এবং আমার একক মেক ইনস্টল কমান্ড রয়েছে যা অনেক আগে চলে।
অ্যারেলিয়াস

হুম। ভাল। সময়সীমা বাড়ানো থেকে দূরে থাকার মতো অনেক কিছুই নেই। এটি অস্থায়ীভাবে সেট করার কোনও উপায় নেই।
coredump

0

গ্রেগরি পারকিন্স এবং আমার অভিজ্ঞতা সরবরাহ করেছেন আভাসের ভিত্তিতে , এখানে আমার ওয়ান-লাইনার রয়েছে:

trap "exit" INT TERM; trap "kill 0" EXIT; sudo -v || exit $?; sleep 1; while true; do sleep 60; sudo -nv; done 2>/dev/null &

অথবা

trap "exit" INT TERM
trap "kill 0" EXIT
sudo -v || exit $?
sleep 1
while true; do
    sleep 60
    sudo -nv
done 2>/dev/null &

ব্যাখ্যা

  • trap "exit" INT TERM; trap "kill 0" EXIT: এটি প্রস্থান করার সময় বা সাইন ইন / সিগনেটারে পুরো প্রক্রিয়া গাছটি নামিয়ে ফেলবে।

  • sudo -v || exit $?: পাসওয়ার্ডটি আপ-ফ্রন্টের জন্য জিজ্ঞাসা করুন এবং সুরক্ষা শংসাপত্রগুলি ক্যাশে করুন, তবে কোনও কমান্ড চালাবেন না। যদি পাসওয়ার্ডটি সঠিক না হয়, sudo দ্বারা ফিরে কোড সহ প্রস্থান করুন।

  • sleep 1: সুরক্ষা শংসাপত্রগুলি কার্যকরভাবে সংরক্ষণ করা যায় সে জন্য কিছুটা বিলম্ব করুন। যদি পরবর্তী সুডো খুব শীঘ্রই চলতে থাকে তবে এটি এটি জানতে পারবে না কারণ শংসাপত্রগুলি এখনও সংরক্ষিত হয়নি, এভাবে আবার পাসওয়ার্ড চাইবে।

  • while true; do sleep 60; sudo -nv; done 2>/dev/null &: বিদ্যমান সুডোর সুরক্ষা শংসাপত্রগুলি বারবার আপডেট করুন। লক্ষ্য করুন যে এই সংস্করণটি সংযুক্ত টুকরোটির একটির থেকে পৃথক: এটি sleep 60প্রথমে চলে এবং তারপরেও sudo -nv

    • &অপারেটর পুরো রাখে whileপটভূমি মধ্যে লুপ, একটি শিশু প্রক্রিয়া যেমন চলছে।

    • 2>/dev/nullএর দ্বারা stderr পুনর্নির্দেশ while, অকার্যকর করার লুপ তাই লুপ ভিতরে কোন কমান্ড দ্বারা উত্পন্ন ত্রুটি বার্তা পরিত্যাগ করা হবে।

    • -nবিকল্প sudoএটি একটি পাসওয়ার্ডের জন্য প্রণোদিত করা থেকে আটকায়, কিন্তু একটি ত্রুটির বার্তা প্রদর্শন করে প্রস্থান প্রদর্শন একটি পাসওয়ার্ড প্রয়োজন।

    • কোন ব্যাপার kill -0 "$$" || exit, লিঙ্ক সারকথা হিসেবে কারণ প্রথম দুই trapগুলি কাজ হবে। অভিভাবক প্রক্রিয়াটি চলছে না তার আগে এটি 59 সেকেন্ডের জন্য ঘুমাতে হবে না!

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