বাশ স্ক্রিপ্টে রুট হিসাবে চলমান কিনা তা কীভাবে পরীক্ষা করবেন


273

আমি একটি স্ক্রিপ্ট লিখছি যার জন্য মূল স্তরের অনুমতি প্রয়োজন, এবং আমি এটি তৈরি করতে চাই যাতে স্ক্রিপ্টটি রুট হিসাবে চালিত না হয়, তবে এটি সহজভাবে প্রতিধ্বনিত করে "দয়া করে রুট হিসাবে চালান" " এবং প্রস্থান।

আমি যা খুঁজছি তার জন্য এখানে কয়েকটি সিডোকোড রয়েছে:

if (whoami != root)
  then echo "Please run as root"

  else (do stuff)
fi

exit

আমি কীভাবে সেরা (পরিষ্কার এবং নিরাপদে) এটি সম্পাদন করতে পারি? ধন্যবাদ!

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


8
(1) এটিকে অন্য কোনও কিছুর দ্বারা নির্বাহযোগ্য না করে তারপরে রুট (2) পাশাপাশি আরও অনুমতিের ব্যবস্থা করুন .. (3) মূলের জন্য id -uফিরে আসে 0
রিক্কেন

উত্তর:


403

$ EID পরিবেশের পরিবর্তনশীলটি বর্তমান ব্যবহারকারীর ইউআইডি ধারণ করে। রুটের ইউআইডি 0 হয় আপনার স্ক্রিপ্টে এর মতো কিছু ব্যবহার করুন:

if [ "$EUID" -ne 0 ]
  then echo "Please run as root"
  exit
fi

দ্রষ্টব্য: আপনি 2: [: Illegal number:যদি #!/bin/shশীর্ষে আছেন কিনা তা যদি পরীক্ষা করে নেন এবং এটিকে পরিবর্তন করেন #!/bin/bash


দেখে মনে হচ্ছে ভাল অনুমতি এবং এটি থাকা সুরক্ষার দ্বৈত স্তর
কলব ক্যানিয়ন

25
আমি মনে করি স্ট্রিংয়ের সাথে স্ট্রিং, সংখ্যার সাথে সংখ্যা তুলনা করা ভাল। ডাবল বন্ধনী ব্যবহার করে, আপনি সরাসরি কোনও উদ্ধৃতি [[$ EUID> 0]] ব্যবহার করতে পারবেন
সার্জিও

7
2: [: Illegal number:সার্জিওর সংস্করণে এটি পরিবর্তন না হওয়া পর্যন্ত আমি সতর্কতা পেয়েছি ।
আলেক্সিডেমিন

1
@ thekiwi5000 এই অবস্থাটি thenএকই লাইনে থাকলে সেমিকোলনটি কেবল তখনই প্রয়োজন ...
ptierno

1
@ স্টেফেনএঞ্জেলিকো সুডোর কাজ করা উচিত। যদি আপনি এটি $ sudo প্রতিধ্বনি $ EID করে পরীক্ষা করে থাকেন; এটি একটি খারাপ পরীক্ষা এবং ব্যর্থ হবে কারণ কমান্ডটি সুডো পাস হওয়ার আগে EID প্রসারিত হয়। প্রতিস্থাপনের চেষ্টা করুন cho EID একটি পরীক্ষার স্ক্রিপ্টে এবং এটি sudo দিয়ে চালাচ্ছেন।
ব্যবহারকারী 1169420

79

ব্যাশ স্ক্রিপ্টে, চলমান ব্যবহারকারীটি মূল কিনা আপনি তা পরীক্ষা করার বিভিন্ন উপায় রয়েছে।

সতর্কতা হিসাবে , ব্যবহারকারীর rootনাম ব্যবহার করে কোনও ব্যবহারকারী রুট কিনা তা পরীক্ষা করবেন না । আইডি 0 সহ ব্যবহারকারীকে কল করার কোনও নিশ্চয়তা নেই root। এটি একটি খুব শক্তিশালী কনভেনশন যা ব্যাপকভাবে অনুসরণ করা হয় তবে যে কেউ সুপারসরের নাম পরিবর্তন করতে পারে।

আমি সবচেয়ে ভালো উপায় ব্যবহার করে যখন মনে ব্যাশ ব্যবহার করা $EUIDমানুষ পাতা থেকে:

EUID   Expands to the effective user ID of the current  user,  initialized
       at shell startup.  This variable is readonly.

এটি $UIDপরিবর্তিত হতে পারে এবং স্ক্রিপ্টটি চালিত প্রকৃত ব্যবহারকারীকে প্রতিফলিত না করার চেয়ে এটি আরও ভাল উপায় ।

if (( $EUID != 0 )); then
    echo "Please run as root"
    exit
fi

sudoযখন আমি রুট হিসাবে চালিত না হয় তখন আমার কমান্ডগুলিতে ইনজেকশন দিয়ে এই ধরণের সমস্যার কাছে যাওয়ার উপায় । এখানে একটি উদাহরণ:

SUDO=''
if (( $EUID != 0 )); then
    SUDO='sudo'
fi
$SUDO a_command

আমার কমান্ডটি সুপারুসার ব্যবহার করার sudoসময় বা নিয়মিত ব্যবহারকারীর দ্বারা চালিত হয়ে রুট দ্বারা চালিত হয়।

যদি আপনার স্ক্রিপ্টটি সর্বদা রুট দ্বারা চালিত হয় তবে কেবল সেই অনুযায়ী অধিকারগুলি সেট করুন ( 0500)।


যে ব্যক্তি স্ক্রিপ্টটি চালানোর চেষ্টা করছেন তার যদি সুডোর সুবিধাগুলি না থাকে তবে এর ফলে ত্রুটি নিক্ষেপ হবে এবং কমান্ডটি চলবে না? শুধু নিশ্চিত করতে চাই, আমি সঠিকভাবে বুঝতে পারি।
ক্যাপেরনিওগিনিস

1
আমি নিশ্চিত নই যে এই উত্তরটি 100% সম্পূর্ণ সঠিক। RHEL7.2 এ ব্যাশ 4.2.46 ব্যবহার করে ... আমি যদি printf $EUIDসুডো সহ বা না দিয়ে থাকি তবে আমি আমার নিজস্ব ইউআইডি ফিরে পাই। যদি আমি ব্যবহার id -uকরি তবে আমি আমার ইউআইডি পাই এবং যখন আমি এটির সাথে অনুরোধ করি তখন আমি 0 ফিরে আসি। আমি কি কিছু ভুল করবেন?
0x শিপডগ

4
@ 0x শিপডগ, এটি সম্ভব যে ব্যাশ ক্লাইমে, $ EID পরিবর্তনশীল প্রসারণটি প্রথমে সমাধান হয়ে যায়, তারপরে sudo ব্যবহারকারী পরিবর্তন করে। সুতরাং আপনি সেই আচরণটি পাবেন তবে স্ক্রিপ্টগুলিতে সবকিছু ঠিকঠাক কাজ করবে।
আলেকজান্ডার বার্ড

@ আলেকজান্ডার বার্ড ভাল পয়েন্ট, আপনাকে ধন্যবাদ! আমি কোনও আসল পরীক্ষা করিনি, কেবল আমার অভিজ্ঞতার কথা জানিয়েছি।
0x শিপডগ

3
ভেরিয়েবলের স্থানীয় শেল প্রসারণ রোধ করতে আপনার পরীক্ষার জন্য একটি "হরস্ট্রিং" ব্যবহার করুন। তুলনা sudo bash <<<'echo $EUID'করার জন্য bash <<<'echo $EUID'। Tldp.org/LDP/abs/html/x17837.html এ হেরেডোকের
ব্রুনো ব্রোনোস্কি

74

কয়েকটি উত্তর দেওয়া হয়েছে, তবে এটি ব্যবহার করার সর্বোত্তম পদ্ধতি হ'ল:

  • id -u
  • রুট হিসাবে চালানো হলে 0 এর একটি আইডি ফিরে আসবে।

এটি অন্যান্য পদ্ধতির তুলনায় আরও নির্ভরযোগ্য বলে মনে হয় এবং স্ক্রিপ্টটি চলমান থাকলেও এটি 0 এর একটি আইডি প্রত্যাবর্তন করে sudo


দুর্দান্ত এটি সেরা উত্তর
ড্যান অরটেগা

58
if [[ $(id -u) -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi

অথবা

if [[ `id -u` -ne 0 ]] ; then echo "Please run as root" ; exit 1 ; fi

:)


আপনি জেরেমি জে স্টারচারের উত্তরটিকে এই অংশের সাথে সংহত করার বিষয়ে বিবেচনা করতে পারেন , শেষ পর্যন্ত এটি সর্বদা একই জিনিস ...
সত্যই সুন্দর

আমি জানি যে টার্মিনাল থেকে, যখন আমি কিছু প্রিফিক্স করতে ভুলে sudoযাই আমি কেবল টাইপ করতে পারি sudo !!এবং এটি ইউপি তীর টিপুন, লাইনের শুরুতে গিয়ে sudo হাত দিয়ে যোগ করার চেয়ে আমার পক্ষে কাজ করে । নিশ্চিত না যে এটি কোনও বেস জিনিস বা সুডো জিনিস বা অন্য কোনও বিষয়, তবে এটি বেশিরভাগ সময় কাজ করে।
0x শিপডোগ

@ 0x শিপডগ: এটি একটি বাশ জিনিস (এবং সিএসএসের মতো কিছু অন্যান্য শেলের একটি বৈশিষ্ট্য, যেখানে এটি আইআরসি তৈরি হয়েছিল)।
পরবর্তী বিজ্ঞপ্তি না হওয়া পর্যন্ত বিরতি দেওয়া হয়েছে।

সব মিলিয়ে, আমি পুরোপুরি ব্যাকটিক অংশটি অপসারণ করব এবং ঠিক লাইনটি আবার লিখতে চাই if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi। চিয়ার্স।
লিনাক্সসিকিউরিটিফ্রেক

29

@ উরক্কেন যেমন তাঁর মন্তব্যে উল্লেখ করেছেন, id -uমূলের জন্য এটি আরও অনেক ভাল চেক।

এছাড়াও, যথাযথ ব্যবহারের সাথে sudo, আপনি স্ক্রিপ্টটি পরীক্ষা করে দেখতে পারেন এবং এটি রুট হিসাবে চলমান কিনা। যদি তা না হয় তবে এটির মাধ্যমে নিজেকে পুনরায় স্মরণ করুন sudoএবং তারপরে রুট অনুমতি নিয়ে চালান।

স্ক্রিপ্ট কী করে তার উপর নির্ভর করে, অন্য একটি বিকল্প হতে পারে স্ক্রিপ্টটির যে sudoকোনও বিশেষ কমান্ডের প্রয়োজন হতে পারে তার জন্য একটি এন্ট্রি সেট করা ।


কোনও প্রোগ্রাম নিজেই পুনর্বিবেচনা করার একটি দুর্দান্ত উপায় আছে? প্রোগ্রামটির পরম পথের সাথে সম্ভবত কিছু বাশ ভেরিয়েবল রয়েছে?
নাথান

1
আমি এখনই পরীক্ষার জন্য কোনও BASH প্রম্পটের কাছে নেই, তবে $0চলমান স্ক্রিপ্টটির নাম রয়েছে। এখানে কিছু উদাহরণ রয়েছে যা আপনাকে সাহায্য করতে পারে।
জেরেমি জে স্টারচার

25

ব্যবহারকারীর রুট হওয়ার জন্য একটি সাধারণ চেক রয়েছে।

[[ stuff ]]সিনট্যাক্স ব্যাশ মধ্যে একটি চেক চলমান মান উপায়।

error() {
  printf '\E[31m'; echo "$@"; printf '\E[0m'
}

if [[ $EUID -eq 0 ]]; then
    error "Do not run this as the root user"
    exit 1
fi

এটি ধরেও নেয় যে আপনি ব্যর্থ হলে আপনি 1 দিয়ে প্রস্থান করতে চান। errorফাংশন কিছু বিচারবুদ্ধি যে লাল সেট আউটপুট পাঠ্য (প্রয়োজন না, কিন্তু চমত্কার উত্কৃষ্ট যদি তুমি আমাকে জিজ্ঞাসা করুন) হয়।


হুকুম কী error? আমার সিস্টেমে এটি আছে বলে মনে হয় না। । ।
রুখ

ওহ, এটি কেবল একটি ছোট্ট শিখা জিনিস। এত কিছু যায় আসে না, তবে আমি এটি সংযুক্ত করব।
স্লেটার ভিক্টোরফ

4
যে বেশ শান্ত! যদি আমি কয়েকটি উন্নতির পরামর্শ দিতে পারি: (1) শেষ পর্যন্ত নতুন লাইনটি সরান; (২) স্ট্যান্ডার্ড আউটপুটের পরিবর্তে স্ট্যান্ডার্ড ত্রুটিতে লিখুন; (3) শুধুমাত্র স্ট্যান্ডার্ড ত্রুটি যদি টার্মিনাল হয় তবে রঙটি সেট করুন (লগ-ফাইলগুলিতে lessবা ঝাঁপিতে অক্ষরে লিখিত ঝুঁকি লেখার চেয়ে ); এবং (4) একটি পটভূমি রঙ সেট করে, তাই পাঠকের ব্যবহারকারীর টার্মিনালের ব্যাকগ্রাউন্ড বর্ণ নির্বিশেষে পাঠযোগ্য হবে read সুতরাং, মত কিছু function error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }। (পছন্দসই
টুইঙ্ক

3
"-Eq" এর পরিবর্তে "-ne" হওয়া উচিত নয়?
কার্লোস রেনডন

2
@ কার্লোস রেনডন স্লেটারের কোডটি হ'ল কিছুকে রুট হিসাবে চালানো থেকে বিরত রাখতে । (এটি ওপি যা চেয়েছিল তার বিপরীতে, তবে চেক করার পদ্ধতিটি একই রকম হবে))
জোশুয়া টেলর

11

খুব সহজ উপায়:

if [ "$(whoami)" == "root" ] ; then
    # you are root
else
    # you are not root
fi

এর পরিবর্তে এটি ব্যবহারের সুবিধা idহ'ল আপনি পরীক্ষা করতে পারবেন যে কোনও নির্দিষ্ট অ-রুট ব্যবহারকারী কমান্ডও চালাচ্ছেন কিনা; যেমন।

if [ "$(whoami)" == "john" ] ; then
    # you are john
else
    # you are not john
fi

আপনি যদি স্ট্রিং "রুট" দিয়ে ব্যবহারকারীকে পরীক্ষা করেন, আপনি কি "রুট" নামক কাউকে চালানোর অনুমতি দিচ্ছেন না?
pcarvalho

আপনি '' 'ভুলে গেছেন; যদি পরে
ত্রিশ্কেল্ডিয়ান

1
@ পেটারোক শিকের বাদে আর কার নাম দেওয়া হবে?
ptierno

3
whoamiব্যবহারের চেয়ে বরং প্রশ্নের উত্তর দেওয়ার জন্য +1 id; whoamiকমান্ড এছাড়াও জন্য চেক করতে ব্যবহার করা যেতে পারে অন্য , রুট চেয়ে ব্যবহারকারীদের নামে।
জেজ

10

0- সরকারী জিএনইউ লিনাক্স ডকুমেন্টেশন পড়ুন, এটি সঠিকভাবে করার অনেকগুলি উপায় রয়েছে।

1- ব্যাখ্যায় ত্রুটি এড়াতে আপনি শেল স্বাক্ষরটি রেখেছেন তা নিশ্চিত করুন:

 #!/bin/bash

2- এটি আমার লিপি

#!/bin/bash 

if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
  echo "Please run as root/sudo"
  exit 1
else
  #do your stuff
fi

10

এই উত্তরে, এটি পরিষ্কার হওয়া উচিত, আমি অনুমান করি পাঠক পড়তে সক্ষম bashএবং পসিক্স শেল স্ক্রিপ্টগুলি পছন্দ করে dash

আমি বিশ্বাস করি যে এখানে উচ্চারণের মত উত্তরগুলি এর বেশিরভাগ ব্যাখ্যা করার জন্য ভাল কাজ করে বলে এখানে ব্যাখ্যা করার মতো খুব বেশি কিছু নেই।

তবুও, যদি আরও ব্যাখ্যা করার মতো কিছু থাকে তবে মন্তব্য করতে দ্বিধা করবেন না, আমি শূন্যস্থানগুলি পূরণ করার জন্য যথাসাধ্য চেষ্টা করব।


bashপারফরম্যান্স এবং নির্ভরযোগ্যতার জন্য চূড়ান্ত (কেবল নয় ) সমাধান অনুকূলিতকরণ ; সমস্ত শাঁস সামঞ্জস্যপূর্ণ

নতুন সমাধান:

# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }

বেঞ্চমার্ক (ফাইল এ সংরক্ষণ করুন is_user_root__benchmark)

###############################################################################
##                          is_user_root() benchmark                         ##
##                  Bash is fast while Dash is slow in this                  ##
##          Tested with Dash version 0.5.8 and Bash version 4.4.18           ##
##                     Copyright: 2020 Vlastimil Burian                      ##
##                      E-mail: info@vlastimilburian.cz                      ##
##                             License: GPL-3.0                              ##
##                               Revision: 1.0                               ##
###############################################################################

# intentionally, the file does not have executable bit, nor it has no shebang
# to use it, please call the file directly with your shell interpreter like:

# bash is_user_root__benchmark
# dash is_user_root__benchmark

# bool function to test if the user is root or not
is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }

# helper functions
print_time   () { date +"%T.%2N"; }
print_start  () { printf '%s' 'Start  : '; print_time; }
print_finish () { printf '%s' 'Finish : '; print_time; }

readonly iterations=10000

printf '%s\n' '______BENCHMARK_____'
print_start

i=1; while [ $i -lt $iterations ]; do
    is_user_root
    i=$((i + 1))
done

print_finish

আসল সমাধান:

#!/bin/bash

is_user_root()
# function verified to work on Bash version 4.4.18
# both as root and with sudo; and as a normal user
{
    ! (( ${EUID:-0} || $(id -u) ))
}

if is_user_root; then
    echo 'You are the almighty root!'
else
    echo 'You are just an ordinary user.'
fi

^^^ স্ট্রাইকড আউট সমাধানটি জিনিসগুলির গতি বাড়ানোর পক্ষে প্রমাণিত হয়নি, তবে এটি দীর্ঘকাল ধরে রয়েছে, সুতরাং আমি যতক্ষণ প্রয়োজন দেখছি এটিকে এখানে রাখব।


ব্যাখ্যা

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


আমি কেন এত বছর পরে এই সমাধান পোস্ট করব ওপি জিজ্ঞাসা করেছে

ঠিক আছে, আমি যদি সঠিকভাবে দেখতে পাই তবে উপরের কোডটির একটি অনুপস্থিত অংশ মনে হচ্ছে।

আপনি দেখুন, অনেকগুলি ভেরিয়েবল রয়েছে যা বিবেচনায় নিতে হবে এবং এর মধ্যে একটি হ'ল পারফরম্যান্স এবং নির্ভরযোগ্যতা


পোর্টেবল পসিক্স সমাধান + উপরের ফাংশনটির ব্যবহারের উদাহরণ

#!/bin/sh

# bool function to test if the user is root or not (POSIX only)
is_user_root() { [ "$(id -u)" -eq 0 ]; }

if is_user_root; then
    echo 'You are the almighty root!'
    exit 0 # unnecessary, but here it serves the purpose to be explicit for the readers
else
    echo 'You are just an ordinary user.' >&2
    exit 1
fi

উপসংহার

আপনি যতটা সম্ভবত এটি পছন্দ করেন না, ইউনিক্স / লিনাক্স পরিবেশ অনেক বৈচিত্রপূর্ণ করেছে। মানে এমন কিছু লোক আছে যারা bashএত বেশি পছন্দ করে তারা এমনকি বহনযোগ্যতা ( পসিক্স শেলস) ভাবেন না । আমার মতো অন্যরাও পসিক্স শেল পছন্দ করে । এটি আজকাল ব্যক্তিগত পছন্দ এবং প্রয়োজনের বিষয়।


6

যদি স্ক্রিপ্টটিতে সত্যিকার অর্থে রুট অ্যাক্সেসের প্রয়োজন হয় তবে এর ফাইল অনুমতিগুলির মধ্যে এটি প্রতিফলিত হওয়া উচিত। রুটবিহীন ব্যবহারকারীদের দ্বারা নির্ধারিত একটি রুট স্ক্রিপ্ট থাকা একটি লাল পতাকা হবে। আমি আপনাকে ifচেক দিয়ে অ্যাক্সেস নিয়ন্ত্রণ না করতে উত্সাহিত করি ।

chown root:root script.sh
chmod u=rwx,go=r script.sh

4
যদি কারও কাছে অনুমতি থাকে তবে এটি দুর্দান্ত কাজ করে তবে আমি মনে করি 777বোমার অতিরিক্ত ব্যবহারের ফলে এই ধরণের ব্যবহারকারীর ক্ষেত্রে এই তদন্তটিকে কিছুটা ত্রুটিযুক্ত করে তোলে যে ভুলটি প্রথম স্থানে ফেলবে।
স্লেটার ভিক্টোরফ

7
এটি ধরে নিচ্ছে যে ব্যবহারকারী একটি নির্বাহযোগ্য স্ক্রিপ্ট চালাচ্ছেন। ব্যবহারকারী যদি কেবল কল করে তবে bash /path/to/scriptএটি চালানো যেতে পারে যদিওo=r
পটিয়ার্নো

5

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

#!/bin/su root


1
আমি উত্সাহী কেন এই উত্তরটি বেশি ভোট হয় না? এটি সবচেয়ে সহজ এবং পরিষ্কার বলে মনে হচ্ছে। এখানে কি অসুবিধা আছে?
বেসিনেটর

@ বাসিনেটর আমি বিশ্বাস করি কিছু লোক বলে যে এটি নির্দিষ্ট নিক্সে চলবে না তবে এটি এখনও আমার লিনাক্সে নির্বিঘ্নে কাজ করেছে। চেষ্টা করে দেখুন! সম্ভবত এই উত্তরটি দৌড়ে আসতে দেরীতে এসেছে তবে আমি সম্প্রদায়ের কাছে সহজ সরল জ্ঞান যুক্ত করার চেষ্টা করছি (এই থ্রেডের মতো বেশিরভাগের মতো একইরকম উত্তর দেওয়ার পরিবর্তে: /) আপনি যদি ভাগ্যবান হন তবে এটি পড়ুন এবং এটি আপনার মেশিনে কাজ করে
alexandre1985

@ টিমুসজেয়েস যদি লক্ষ্যটি পরীক্ষা করে থাকে যে আপনি যদি রুট হিসাবে চলছেন এবং স্ক্রিপ্টটিকে কেবল রুট হিসাবে চালাতে বাধ্য করছেন না, তবে প্রতিটি উত্তরে কেন, চেকের পরে রুট হিসাবে চলছে কিনা, তারা স্ক্রিপ্ট তৈরি করে exit? এবং এখনও সেই উত্তরগুলি উড়িয়ে দেওয়া হচ্ছে? আমার ধারণা লোকেরা স্পষ্টতই স্ক্রিপ্টটি মূল হিসাবে চালিত করতে চায় না। তাই আমি সরল উত্তরের সাথে ভাবনার সেই পদ্ধতি অনুসরণ করছি। তবে হ্যাঁ, আপনি উপরের আরও ভার্ভোজের উত্তরগুলি থেকেও শিখতে পারেন
আলেকজান্দ্রে

@ alexandre1985 ঠিক আছে। পরিস্থিতি: মূল হিসাবে চলতে থাকলে, আপনি কীভাবে এটি ইনস্টল করতে চান তা জিজ্ঞাসা করার সময় আপনি বিশ্বব্যাপী প্রোগ্রামটি ইনস্টল করার জন্য কোনও স্ক্রিপ্ট ডিফল্ট করতে চান। অন্যথায়, স্থানীয়ভাবে এটি ইনস্টল করতে ডিফল্ট সেট করা আছে। এন্টার টিপে আঘাত করার পরিবর্তে ব্যবহারকারী এটি বৈশ্বিক বা স্থানীয় ইনস্টল করতে পছন্দ করতে পারেন। তবে যদি তারা ডিফল্ট পছন্দ করে তবে তারা এন্টার চাপতে পারে। এবং তাদের একটি পাসওয়ার্ড দিয়ে জিজ্ঞাসা করা হবে না। আপনি রুট (প্রতি শিরোনাম) থাকলে আপনার শেবাং কখনই "চেক" করতে পারে না। তবে আমি এখনও এই উত্তরটি দরকারী বলে মনে করি।
তমুসজেরোয়েস

@ টিমাসজেআরয়েস সম্পূর্ণভাবে আপনার মন্তব্যটি বোঝায়। প্রকৃতপক্ষে উদ্বেগজনক এবং এই সমাধানটি ব্যবহারের ক্ষেত্রে নয়। আপনি আমার দৃষ্টিভঙ্গি খুলেছেন। তুমি ঠিক. ধন্যবাদ
alexandre1985

4

নিম্নলিখিত কোড চেষ্টা করুন:

if [ "$(id -u)" != "0" ]; then
    echo "Sorry, you are not root."
    exit 1
fi

অথবা

if [ `id -u` != "0" ]; then
    echo "Sorry, you are not root."
    exit 1
fi

3

যতদূর আমি জানি এটি পরীক্ষা করার সঠিক উপায়:

if [ $(id -u) = "0" ]; then
    echo "You are root"
else
    echo "You are NOT root"
fi

এখানে "রুটের জন্য পরীক্ষার" বিভাগটি দেখুন:

http://linuxcommand.org/lc3_wss0080.php


1
প্রতিস্থাপন = "0"সঙ্গে-eq 0
LinuxSecurityFreak

1
@ লিনাক্স সিকিউরিটি ফ্র্যাক, আমি কেন এটি করব তা যদি আপনি ব্যাখ্যা করেন তবে আমি এটিকে প্রতিস্থাপন করব।
WebBrother

2

id -uএর চেয়ে অনেক ভাল whoami, যেহেতু অ্যান্ড্রয়েডের মতো কিছু সিস্টেমগুলি মূল শব্দটি সরবরাহ করতে পারে না।

উদাহরণ:

# whoami
whoami
whoami: unknown uid 0

0
#!/bin/bash

# GNU bash, version 4.3.46
# Determine if the user executing this script is the root user or not

# Display the UID
echo "Your UID is ${UID}"

if [ "${UID}" -eq 0 ]
then
    echo "You are root"
else
    echo "You are not root user"
fi

সম্পাদকের দ্রষ্টব্য: আপনার যদি ডাবল বন্ধনী প্রয়োজন না হয় তবে কোড বহনযোগ্যতার জন্য একক ব্যবহার করুন।


3
আপনি কেন 5 বছরের পুরানো প্রশ্নের বিকল্প বিকল্প কেন সরবরাহ করেছেন তা ইতিমধ্যে এর বেশ কয়েকটি উত্তর রয়েছে কেন তা আপনি ব্যাখ্যা করেন নি।
স্টিফন

0

আপনি রুট কিনা তা যাচাই করুন এবং আপনি না থাকলে ছেড়ে দিন:

if ((EUID != 0)); then
    echo "Root or Sudo  Required for script ( $(basename $0) )"
    exit
fi

বা এই উদাহরণে, মূল অবস্থানে একটি ডিরেক্টরি তৈরি করার চেষ্টা করুন এবং তারপরে অধিকারগুলি উন্নত করার পরে চেষ্টা করুন।

আপনি রুট কিনা এবং যদি সম্ভব হয় উন্নত না হয় তা পরীক্ষা করুন:

# Fails to create these dirs (needs sudo)
mkdir /test-dir-$(basename $0)
rmdir /test-dir-$(basename $0)

if ((EUID != 0)); then
    echo "Granting root privileges for script ( $(basename $0) )"
    if [[ -t 1 ]]; then
        sudo "$0" "$@"
    else
        exec 1> output_file
        gksu "$0" "$@"
    fi
    exit
fi
echo "Root privileges granted..."
# Creates Dirs as it now has rights
mkdir /test-dir-$(basename $0)
rmdir /test-dir-$(basename $0)

-1

মূলের জন্য পরীক্ষা করুন:

ROOT_UID=0   # Root has $UID 0.

if [ "$UID" -eq "$ROOT_UID" ]
then
  echo "You are root."
else
  echo "You are just an ordinary user."
fi

exit 0

পরীক্ষিত এবং শিকড় মধ্যে চলমান।

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