কোনও স্ক্রিপ্টটি রুট না হলে চলমান থেকে কীভাবে থামানো যায় (এবং "মূল হিসাবে চালাচ্ছে না! প্রস্থান করা হচ্ছে ..." প্রতিধ্বনি)


17

এখানে আমার উত্স:

#!/bin/bash

echo "Running script to free general cached memory!"
echo "";
echo "Script must be run as root!";
echo "";
echo "Clearing swap!";
swapoff -a && swapon -a;
echo "";
echo "Clear inodes and page file!";
echo 1 > /proc/sys/vm/drop_caches;
echo "";

এটি ক্যাশে এবং স্টাফ সাফ করে এবং এটি প্রতিধ্বনি করে যে এটি টার্মিনালে মূল হিসাবে চালানো দরকার। আমি মূলত স্ক্রিপ্টটি চালানো বন্ধ করে দিতে চাই যদি এটি সনাক্ত করে যে এটি মূল হিসাবে কার্যকর করা হচ্ছে না।

উদাহরণ:

"Running script to free general cached memory!"
"Warning: script must be run as root or with elevated privileges!"
"Error: script not running as root or with sudo! Exiting..."

যদি উন্নত সুবিধাগুলি দিয়ে চালানো হয় তবে এটি কেবল স্বাভাবিকের মতো চলে। কোন ধারনা? ধন্যবাদ!



2
@ মুরু, এই ব্যতীত অন্য প্রশ্নটি হ'ল: স্ক্রিপ্টটি ব্যর্থ হলে মূল হিসাবে চলমান।
স্টাফেন চেজেলাস

3
@ স্টাফেনচাজেলাস আহ, আমার খারাপ। প্রত্যাহার করা হয়েছে
মুরু

একটি বিকল্প কাজের পরিমাণ হিসাবে সঞ্চালিত সীমিত করতে হয় rootদিন যোগ করে প্রিফিক্স সব কমান্ড যে চলবে দ্বারা rootসঙ্গে sudo
পুনরায় পোস্টার

উত্তর:


46
#!/bin/sh

if [ "$(id -u)" -ne 0 ]; then
        echo 'This script must be run by root' >&2
        exit 1
fi

cat <<HEADER
Host:          $(hostname)
Time at start: $(date)

Running cache maintenance...
HEADER

swapoff -a && swapon -a
echo 1 >/proc/sys/vm/drop_caches

cat <<FOOTER
Cache maintenance done.
Time at end:   $(date)
FOOTER

মূল ব্যবহারকারীটির ইউআইডি 0 থাকে ("মূল" অ্যাকাউন্টের নাম নির্বিশেষে)। কার্যকর ইউআইডি যদি ফিরে আসে id -uতবে শূন্য না হলে ব্যবহারকারী রুট সুবিধাগুলি সহ স্ক্রিপ্টটি চালাচ্ছে না। id -ruআসল আইডি ( স্ক্রিপ্টটি প্রেরণকারী ব্যবহারকারীর ইউআইডি) এর বিরুদ্ধে পরীক্ষা করতে ব্যবহার করুন ।

$EUIDস্ক্রিপ্টে এটি ব্যবহার করবেন না কারণ এটি কোনও অনিবদ্ধ ব্যবহারকারী দ্বারা সংশোধিত হতে পারে:

$ bash -c 'echo $EUID'
1000

$ EUID=0 bash -c 'echo $EUID'
0

যদি কোনও ব্যবহারকারী এটি করে থাকে তবে স্পষ্টতই এটি বিশেষাধিকারের বৃদ্ধির দিকে পরিচালিত করবে না, তবে স্ক্রিপ্টের কমান্ডগুলির ফলে তারা যা করার কথা বলেছে তা করতে সক্ষম না হওয়ায় এবং ফাইলগুলি ভুল মালিকের সাথে তৈরি করা হতে পারে etc.


1
দ্রষ্টব্য: সোলারিস 5.10-এ, /bin/id -uদেয়/bin/id: illegal option -- u Usage: id [-ap] [user]
jrw32982 মোনিকার

1
@ jrw32982 সোলারিসে POSIX ইউটিলিটিগুলিতে অ্যাক্সেস পাওয়ার জন্য /usr/xpg4/binআপনার প্রথম দিকে হওয়া উচিত $PATH
কুসালানন্দ

1
বিন্দু যে -uবিকল্প idসার্বজনীন নয় এবং সেজন্য এই সমাধান শুধুমাত্র সতর্কীকরণ যে একটি POSIX সংস্করণের সাথে সার্বজনীন idআপনার পাথ প্রথম ঘটতে উচিত নয়।
jrw32982

1
@ jrw32982 আপনার স্ক্রিপ্টটি সোলারিসে সঠিক পসিক্স ইউটিলিটিগুলি বাছাই করার $PATHজন্য, স্ক্রিপ্টের শীর্ষে সংশোধন করুন যা /usr/xpg4/binএর আগে রয়েছে /bin। যদি আপনি নন-পসিক্স ব্যবহারের জন্য জোর দিয়ে থাকেন idতবে স্পষ্টতই আপনাকে আরও বহনযোগ্য সমাধান নিয়ে আসতে হবে।
কুসালানন্দ

1
@ হ্যারি হ্যাঁ, সুতরাং স্ক্রিপ্টটি ব্যবহার করতে PATH=$( getconf PATH )বা কিছু অন্যান্য স্পষ্টতই ডিফল্ট পাথ সেট করতে পারে বা কল করার জন্য একটি স্পষ্ট পথ ব্যবহার করতে পারে id
কুসালানন্দ

19

আমি মনে করি আপনি যা চান তা বরং আপনার সুপার-ব্যবহারকারীর সুবিধাগুলি পরীক্ষা করা যা আপনার কার্যকর ব্যবহারকারী আইডি 0।

zshএবং bashএটি $EUIDভেরিয়েবলে উপলভ্য করুন , যাতে আপনি এটি করতে পারেন:

if ((EUID != 0)); then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

যে কোনও POSIX- এর মতো শেল দিয়ে আপনি idস্ট্যান্ডার্ড কমান্ডটি ব্যবহার করতে পারেন :

if [ "$(id -u)" -ne 0 ]; then
  echo >&2 "Error: script not running as root or with sudo! Exiting..."
  exit 1
fi

নোট সব যে id -unবা whoamiবা $USERNAMEভেরিয়েবলটি zshআপনি পাবেন প্রথম ইউআইডি জন্য ব্যবহারকারীর নাম। আইডি 0 সহ অন্যান্য ব্যবহারকারী রয়েছে এমন সিস্টেমে, rootপ্রক্রিয়াটি প্রামাণিকভাবে প্রমাণিত হওয়ার পরেও এটির বংশধর নাও হতে পারে root

$USERহবে সাধারণত আপনি ব্যবহারকারীর যে প্রামাণ কিন্তু এটা জানানোর বেশ ভঙ্গুর হয় দেব। এটি শেল দ্বারা সেট করা হয়নি, তবে সাধারণত প্রমাণীকরণ কমান্ড দ্বারা সেট করা হয় (যেমন login, su(জিএনইউ / লিনাক্স সিস্টেমে, অন্যদের প্রয়োজন হয় না)) sudo, sshd(ওপেনশ থেকে অন্তত একটি) ...)। এটি সর্বদা না হলেও (ইউড পরিবর্তনটি স্বয়ংক্রিয়ভাবে সেই পরিবর্তনশীলটি সেট করে না, এটি ইউড পরিবর্তন করে অ্যাপ্লিকেশন দ্বারা স্পষ্টভাবে করা উচিত) এবং এটি শেলের বংশধরের অন্য কোনও প্রক্রিয়া দ্বারাও সংশোধন করা যেতে পারে। $LOGNAME, একই ক্যাভ্যাটটি আরও নির্ভরযোগ্য যেমন এটি পসিক্স দ্বারা নির্দিষ্ট করা হয়েছে (মূলত এফএডি 151-2 থেকে)


12

আপনি ব্যবহার করতে পারেন $USERবা whoamiবর্তমান ব্যবহারকারী পরীক্ষা করতে পারেন ।

if [[ "$USER" != "root" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

if [[ $(whoami) != "root" ]]; then
    echo "Warning: script must be run as root or with elevated privileges!"
    exit 1
fi

if [[ $(id -u) != "0" ]]; then
    echo "Error: script not running as root or with sudo! Exiting..."
    exit 1
fi

1
দ্বারা NP। আমি আক্ষরিকভাবে সরাসরি ব্যাশ ম্যানুয়াল [ gnu.org/software/bash/manual/bashref.html] এর মাধ্যমে পড়ার পরামর্শ দিচ্ছি । এটি আসলে একটি আশ্চর্যজনকভাবে সহজ প্রস্তুত। বিশেষ করে এই উত্তরের জন্য আমি রেফারেন্স দেওয়ার পরামর্শ দিচ্ছি: 3.2.4.2 Conditional Constructs 3.5.4 Command Substitution
জেসি_বি

9
অপশন id -uসহ বা ছাড়াই কমান্ড -nহুয়ামি ব্যবহারের বিকল্প। একটি -n ছাড়া এবং শূন্যের সাথে তুলনা কর্নেল আসলে যা করছে তার সাথে আরও ভাল মিল। সমস্ত কার্নেলটি যত্ন করে আইডি, পাসওয়ার্ড ফাইলের নাম নয়।
আইক্রাস

6
আমি বিশ্বাস করি যে ব্যবহার $(id -u)করা ভাল। কিছু (দূষিত) ক্ষেত্রে $USERভুল হতে পারে।
বেসিল স্টারিঙ্কেভিচ

1
যারা @ জেসি_বি প্রদত্ত লিঙ্কটিতে আগ্রহী তাদের জন্য: একটি টাইপো আছে। এটি gnu.org/software/bash/manual/bashref.html
Kryten

1
কিছু সিস্টেম "ইউটিড 0 থাকা অধিকারী অ্যাকাউন্টের নাম হিসাবে" রুট "ব্যবহার করে না Q কিউএনএপি এক হিসাবে মনে করে স্প্রিংস। সুতরাং আপনার কেবল ইউড 0 পরীক্ষা করা উচিত, এবং মূল অ্যাকাউন্টের নামটি নয়।
রোয়াইমা

10

আপনি আসলে যা চান তা হ'ল এই ক্রিয়াকলাপগুলিতে আপনার অ্যাক্সেস রয়েছে কিনা তা নির্ধারণ করা। আপনি তার বদলে মূল হন কিনা তা পরীক্ষা করা খারাপ অভ্যাস হিসাবে বিবেচিত।

সিস্টেমটি যদি কোনও নন-রুট ব্যবহারকারীকে অদলবদল এবং ড্রপ পৃষ্ঠার ক্যাশে পরিবর্তন করতে মঞ্জুরি দেওয়ার জন্য কনফিগার করা থাকে, তবে কেন সেই ব্যবহারকারী আপনার স্ক্রিপ্টটি চালাবেন না?

পরিবর্তে, আপনি কেবল অপারেশনটি চেষ্টা করতে পারেন এবং যদি এটি ব্যর্থ হয় তবে সহায়ক বার্তাটি দিয়ে প্রস্থান করতে পারেন:

if ! ( swapoff -a && swapon -a )
then
  echo "Failed to clear swap (rerun as root?)" >&2
  exit 1
fi

if ! echo 1 > /proc/sys/vm/drop_caches
then 
  echo "Failed to free page cache (rerun as root?)" >&2
  exit 1
fi

কোনও অ-রুট ব্যবহারকারী অদলবদল বন্ধ করছেন?
কুসালানন্দ

2
হ্যাঁ. আপনি এটি সেলইনাক্সের সাথে সেট আপ করতে পারেন। তেমনি, আপনি এটি থেকে কোনও রুট প্রক্রিয়াটি অক্ষম করতে পারেন।
অন্য লোকটি

1
কোনও exitকিছু ব্যর্থ হওয়ার পরে আপনি হয়ত না চান , যদি ব্যবহারকারী তাদের বর্তমান সুযোগ-সুবিধাগুলি দিয়ে তারা যতটা সম্ভব করতে চায় to (তবে একটি সাধারণ সিস্টেমের জন্য যেখানে এই সমস্তের জন্য মূল প্রয়োজন, সেখানে বেরিয়ে আসা আরও কার্যকর / কম গোলমাল হতে পারে))
পিটার কর্ডেস

2
আপনি মূল না কি না তা যাচাই করার জন্য আমি এটি "খারাপ অভ্যাস" বলতে এতদূর যেতে পারি না। বিশেষ করে যে যদি ঠিক কি জানতে চান। আমি আপনার বক্তব্য গ্রহণ করি যে আপনি যা চান তা করার যথেষ্ট অনুমতি আছে কিনা তা যাচাই করা ভাল।
এরিক বেনেট
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.