এটি কোনও রুট হিসাবে চালিত হচ্ছে কিনা তা কোনও স্ক্রিপ্ট কীভাবে পরীক্ষা করতে পারে?


104

আমি একটি সহজ বাশ স্ক্রিপ্ট লিখছি, তবে এটির মূল হিসাবে চালানো হচ্ছে কিনা তা যাচাই করা আমার প্রয়োজন need আমি জানি সম্ভবত এটি করার খুব সহজ উপায় আছে তবে কীভাবে তা আমার কোনও ধারণা নেই।

কেবল পরিষ্কার করার জন্য: foo.sh
স্ক্রিপ্ট লেখার সহজ উপায় কী , যাতে কমান্ড আউটপুট হয় এবং কমান্ড আউটপুট হয় ?./foo.sh0sudo ./foo.sh1

উত্তর:


148
#!/bin/bash
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 
   exit 1
fi

7
আমি সিস্টেম ভেরিয়েবল EID ব্যবহার করে এই এক কারণটি (কিছু পরীক্ষার পরে) স্বীকার করছি (কমান্ড (আইডি-ইউ) চালানোর চেয়ে দ্রুত (প্রায় 100 গুণ) দ্রুত হয়েছে, তবে সমস্ত উত্তর দুর্দান্ত কাজ করেছে of
মালাবরবা

18
এছাড়াও, $UIDএবং $EUIDবাশিজম isms কেবলমাত্র পসিএক্স কমপ্লায়েন্ট শেলগুলির মধ্যে এই পরিবর্তনগুলি নেই এবং id(1)পরিবর্তে আপনাকে ব্যবহার করা দরকার ।
ডেভিড ফোস্টার

3
বাশ স্ক্রিপ্টে, আপনি ব্যবহার করতে পারেন if ((EUID)); then, @ গিরির মন্তব্য দেখুন
jfs

7
@ অ্যান্ড্রু: ভেরিয়েবলগুলি পাস হওয়ার আগে প্রতিস্থাপন করা হয় sudo। আপনি চালানো হলে sudo sh -c 'echo $EUID'আপনি আপনার প্রত্যাশিত ফলাফল দেখতে পাবেন।
এম ডুডলি

6
@ অ্যান্ড্রু - আমি জানি আমি এখানে অনেক দেরিতে এসেছি, তবে $EUIDউত্তরোত্তর জন্য: একটি বাশিজম (যেমন উপরে ডেভিডফোরস্টার উল্লিখিত) এবং আপনার /bin/shসম্ভবত এর লিঙ্ক /bin/dash, সম্ভবত না /bin/bashsudo bash -c 'echo $EUID'প্রত্যাশিত ফলাফল হবে।
অ্যাড্রিয়ান গন্টার

118

কোনও রুট ব্যবহারকারীর নাম রাখতে হবে না "রুট"। whoamiব্যবহারকারীর আইডি সহ প্রথম ব্যবহারকারীর নাম দেয় 0$USERলগ ইন থাকা ব্যবহারকারীর নাম রয়েছে, এতে ব্যবহারকারীর আইডি থাকতে পারে 0তবে আলাদা নাম থাকতে পারে।

অ্যাকাউন্টটি রুট হিসাবে লগ ইন হয়েছে কিনা তা যাচাই করার একমাত্র নির্ভরযোগ্য প্রোগ্রাম:

id -u

আমি কার্যকর ব্যবহারকারী আইডির -uজন্য ব্যবহার করি , আসল ব্যবহারকারী আইডির জন্য নয় । অনুমতিসমূহ হয় নির্ধারিত দ্বারা কার্যকর ব্যবহারকারী আইডি, না বাস্তব অন্যতম।-r

টেস্ট

/etc/passwd0প্রদত্ত ক্রমে ব্যবহারকারী আইডি সহ নিম্নলিখিত ব্যবহারকারীর নামগুলি অন্তর্ভুক্ত করে :

rootx
root2

হিসাবে লগ ইন root2, পরবর্তী ফলাফল দেয়:

  • whoami: rootx
  • echo $USER: root2(প্রোগ্রামটি যদি খালি পরিবেশে শুরু করা হয় তবে এটি একটি খালি স্ট্রিং দেয় env -i sh -c 'echo $USER')
  • id -u: 0 আপনি দেখতে পাচ্ছেন যে অন্যান্য প্রোগ্রামগুলি এই পরীক্ষায় ব্যর্থ হয়েছে, কেবল id -uপাস করেছে।

আপডেট হওয়া স্ক্রিপ্টটি এরকম দেখাচ্ছে:

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   echo "I am not root!"
   exit 1
fi


5
পরিবর্তে sh( dash)) এর পরিবর্তে দোভাষী হিসাবে ব্যবহার করে আমি সর্বদা পসিক্স যথাসম্ভব মেনে চলার চেষ্টা করি bash। তবে ভাল শট, অন্য একটি কাঁটাচামচ সংরক্ষণ করে :)
লেকেনস্টেইন

কিছুক্ষণ ঠাণ্ডা হয়ে যাওয়ার পরে, আমি ফিরে এসে একবার তাকালাম। লেকেনস্টেইনের পদ্ধতিটি আরও ভাল বলে মনে হচ্ছে। তাঁর উত্তরটি এখন নতুন গৃহীত উত্তর। আপনার কাছে +1, লেকেনস্টেইন, এসএসপি। এই প্রশ্নটি থেকে হার্ড-টু-বেজে যাওয়া ব্যাজটি পাওয়ার জন্য;)
টমাস ওয়ার্ড

আমার প্রশ্নটি স্বীকার করার জন্য দীর্ঘ সময় অপেক্ষা করার জন্য ধন্যবাদ: ডিআই একটি উত্তর স্বর্ণের জনপ্রিয়তা ব্যাজ এবং একটি ব্রোঞ্জের সুন্দর উত্তর পেয়েছে :) এই প্রশ্নটি কীভাবে জনপ্রিয় হয়েছিল, আমি একদিনে 345 দর্শন পেয়েছি!
লেকেনস্টেইন

3
আমি ছোট সংস্করণ দেখেছি [ -w / ],। ধারণাটি একই থাকে। দ্রষ্টব্য: নির্দিষ্ট ক্রোটগুলিতে, [ -w /etc/shadow ]ব্যর্থ হবে কারণ /etc/shadowঅস্তিত্বহীন, সুতরাং এর সাথে পদ্ধতির /পছন্দ হয়। রুটের অনুমতিগুলির আসল প্রয়োজনটি আরও ভালভাবে পরীক্ষা করা। যদি স্ক্রিপ্টটিতে লেখার প্রয়োজন হয় /etc/someconfig, কেবলমাত্র সেই ফাইলটি লেখার যোগ্য কিনা তা পরীক্ষা করুন বা ফাইলটি বিদ্যমান নেই এবং /etcলিখিতযোগ্য।
লেকেনস্টেইন

30

@ লেকেনস্টেইন যেমন বলেছে আপনার কার্যকর ব্যবহারকারী আইডি ব্যবহার করা উচিত। আপনাকে id -uব্যাশে কল করার দরকার নেই :

#!/bin/bash

if [[ $EUID -ne 0 ]]; then
   echo "You must be root to do this." 1>&2
   exit 100
fi

মন্তব্যগুলি থেকে @ গিরিহার পরামর্শটি পাটিগণিত মূল্যায়ন ব্যবহার করে:

#!/bin/bash

if (( EUID != 0 )); then
   echo "You must be root to do this." 1>&2
   exit 100
fi

7
সাধারণভাবে ((..))টেস্টিং নম্বরগুলির জন্য, এবং [[..]]স্ট্রিং এবং ফাইলগুলির পরীক্ষার জন্য ব্যবহার করা উচিত , তাই আমি if (( EUID != 0 )); thenপরিবর্তে করব, বা কেবলif ((EUID)); then
গিরিহা

@ গিরিহা: আমি আপনার পরামর্শ যুক্ত করেছি।
jfs

2
EUIDহওয়া উচিত $EUID। পরিবর্তে ব্যবহার (( $EUID != 0 )), ব্যবহার [ $EUID != 0 ]। এটা খুব কাজ করবে dash
লেকেনস্টেইন

2
@ লেকেনস্টেইন: ঠিকঠাক EUIDকাজ করে। প্রশ্ন ট্যাগ করা হয় bashনা dash। কমান্ড env -i sh -c '[ $EUID != 0 ]'ব্যর্থ হয়, কিন্তু env -i bash -c '(( EUID != 0 ))'কাজ করে। বিটিডব্লিউ, dashউবুন্টু স্ট্যাকওভারফ্লো.com/ প্রশ্নসন / ৫১60০১২২/২ এর কিছু অ-এস্কি অক্ষরের জন্য কাজ করে না এটি ২০১১ এবং সেখানে অন্যান্য ভাষা ব্যবহার করা লোক রয়েছে।
jfs

ভয়াবহ উদাস হয়ে যাওয়া এবং পরীক্ষার সময় এই দিকে ফিরে তাকানোর পরে, আমি $EUIDএই পয়েন্টটি সামনে থেকে স্টাফগুলির সাথে এখানে তালিকাভুক্ত হিসাবে এই পদ্ধতিটি ব্যবহার করতে যাচ্ছি । ফলস্বরূপ আমি গ্রহণযোগ্য উত্তর পরিবর্তন করেছি।
টমাস ওয়ার্ড

20

আপনি whoamiকমান্ডটি ব্যবহার করে এটি সম্পাদন করতে পারেন , যা বর্তমান ব্যবহারকারীকে প্রদান করে:

#!/bin/bash

if [ `whoami` != 'root' ]
  then
    echo "You must be root to do this."
    exit
fi

...

উপরের চলমান You must be root to do this.বর্তমান ব্যবহারকারী না থাকলে মুদ্রণ করা হবে root


দ্রষ্টব্য: কিছু ক্ষেত্রে একটি বিকল্প হ'ল $USERভেরিয়েবলটি পরীক্ষা করা :

if [ $USER != 'root' ]

আমি কোডটি একবার দেখে নেব, দেখুন স্ক্রিপ্টটি ব্যর্থ হয় না বা কিছু করে। যদি এটি কার্যকর হয় তবে আমি আপনার উত্তরটি গ্রহণ করব :)
টমাস ওয়ার্ড

4
@ জর্জ এডিসন: আমি $USERবিশেষত এইভাবে ব্যবহারের বিরুদ্ধে সুপারিশ করছি । $USERলগইন শেল দ্বারা সেট করা হয়, এটি প্রোগ্রামে প্রচার করা প্রয়োজন হয় না ( env -i sh -c 'echo $USER')। এইভাবে, $USERখালি এবং একটি বাক্য গঠন ত্রুটি ঘটে।
লেকেনস্টেইন

1
@ লেকেনস্টেইন কেবল $USERশেল দ্বারা সেট করা হয় না, এটি প্রতারণা করাও সহজ something হোয়ামি প্রকৃত ব্যবহারকারীকে ফিরিয়ে দেবে।
পল ডি ভ্রিজে

2
@ পোলডেভিরিজ এই চেকটিকে বোকা বানানোর কী আছে?
হর্দক

1
@ এবং প্রতিক্রিয়া: $USERআপনার শেল দ্বারা ব্যাখ্যা করা হয়, আপনার উদাহরণটি sudo sh -c 'echo $USER'অর্থবহ হওয়ার জন্য হওয়া উচিত । @ জর্জ: এটি ভুল ধারণা তৈরি করে যা whoamiসর্বদা rootইউআইডি 0
সাম হোচেভার

11

দক্ষতা বিবেচনায় নিয়ে আপনি প্রথমে EUIDপরিবেশ পরিবর্তনশীল পরীক্ষা করতে পারেন এবং তারপরে যদি তা না থাকে তবে স্ট্যান্ডার্ড idকমান্ডটি কল করুন :

if ((${EUID:-0} || "$(id -u)")); then
  echo You are not root.
else
  echo Hello, root.
fi

এইভাবে, ওআর শর্টকাটের কারণে আপনি ইন-মেমরি ভেরিয়েবলের ক্যোয়ারীটিকে অগ্রাধিকার দিয়ে একটি সিস্টেম কমান্ড কল করা এড়াবেন।

কোড পুনরায় ব্যবহার:

function amIRoot() {
  ! ((${EUID:-0} || "$(id -u)"))
}

আমি আশঙ্কা করছি আপনি এটি বেঞ্চমার্ক করেন নি, ভাল আমার আছে এবং এটি হিসাবে একই সময় নেয় id -u। এটির নীচে ফলাফলের সাথে বেঞ্চ স্ক্রিপ্টটি দেখুন: পেস্টবিন.
com


2

স্ক্রিপ্টটিকে কেবল রুট দ্বারা চালিত করার সহজ উপায় হ'ল লাইনটি দিয়ে স্ক্রিপ্টটি শুরু করা:
#!/bin/su root


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


1

এই স্নিপেটটি হবে:

  • বিভিন্ন সেশন পরীক্ষা করুন
  • ব্যবহার করার পরামর্শ sudo !!
  • এবং একটি ত্রুটি ফিরে
যদি ["$ (হোয়ামি & 2> / দেব / নাল)"! = "মূল"] && ["$ (আইডি-অন & 2> / দেব / নাল)"! = "মূল"]
      তারপর
      প্রতিধ্বনি "এই স্ক্রিপ্টটি চালানোর জন্য আপনাকে অবশ্যই মূল হতে হবে!"
      প্রতিধ্বনি "ব্যবহার 'সুডো !!'"
      প্রস্থান 1
ফাই

1

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

#!/bin/bash
if ! [ $(id -u) = 0 ]; then
   gksudo -w $0 $@
   exit
fi

#here go superuser commands, e.g. (switch intel cpu into powersave mode):
echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
cpupower frequency-set -g powersave

এইভাবে আপনি রুট ব্যবহারকারীর পাসওয়ার্ড চেয়ে আপনাকে সুন্দর ডায়লগ উইন্ডো পাবেন। ঠিক কমান্ড-লাইন সুডোর সাথে।

gksudoতারপর আপনার সিস্টেমে উপলব্ধ নাও হতে পারে সঙ্গে এটি ইনস্টল করুন sudo apt-get install gksu


0

এই কোডটি বাশ এবং স্টক বোর্ন শ উভয়ের (ফ্রিবিএসডি এর অধীনে পরীক্ষিত) অধীনে কাজ করে যা ইইউডি সংজ্ঞায়িত করে না। যদি EID উপস্থিত থাকে তবে এর মানটি ফিরে আসবে, অন্যথায় 'আইডি' কমান্ডটি চালানো হবে। এটি উপরের "বা" উদাহরণের চেয়ে স্বল্পতর, কারণ এটি অন্তর্নির্মিত শেল ব্যবহার করে ": -"।

শ মধ্যে মূল:

# echo $EUID

# euid=${EUID:-`id -u`}
# echo $euid
0

In bash:
[chaapala@tenfwd2 ese]$ euid=${EUID:-`id -u`}
[chaapala@tenfwd2 ese]$ echo $euid
10260
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.