बैश स्क्रिप्ट में रूट के रूप में चल रहा है, तो कैसे जांचें


274

मैं एक स्क्रिप्ट लिख रहा हूं जिसके लिए रूट स्तर की अनुमति की आवश्यकता होती है, और मैं इसे बनाना चाहता हूं ताकि यदि स्क्रिप्ट रूट के रूप में नहीं चलती है, तो यह बस गूँजता है "कृपया रूट के रूप में चलाएं।" और बाहर निकलता है।

यहाँ मैं देख रहा हूँ के लिए कुछ pseudocode है:

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

  else (do stuff)
fi

exit

मैं इसे कैसे (सर्वोत्तम रूप से और सुरक्षित रूप से) पूरा कर सकता था? धन्यवाद!

आह, बस स्पष्ट करने के लिए: (क्या सामान) भाग में चलने वाले कमांड शामिल होंगे जो स्वयं में और रूट की आवश्यकता होती है। इसलिए इसे सामान्य उपयोगकर्ता के रूप में चलाना केवल एक त्रुटि के साथ आएगा। इसका मतलब सिर्फ एक स्क्रिप्ट को साफ-सुथरा चलाना है, जिसमें रूट कमांड्स की जरूरत होती है, बिना स्क्रिप्ट के अंदर सूडो का इस्तेमाल किए बिना, मैं बस कुछ सिन्थेटिक चीनी की तलाश में हूं।


8
(1) इसे किसी और चीज के द्वारा निष्पादित नहीं किया जाता है तब रूट (2) आगे की अनुमति के साथ ही व्यवस्था करता है .. (3) रूट के लिए id -uरिटर्न 0
17

जवाबों:


403

$ EUID पर्यावरण चर वर्तमान उपयोगकर्ता का UID रखता है। Root का UID है 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
@StephenAngelico सूडो को काम करना चाहिए। यदि आप $ sudo इको $ EUID करके इसका परीक्षण कर रहे हैं; यह एक बुरा परीक्षण है और विफल हो जाएगा क्योंकि कमांडो को पारित करने से पहले $ EUID का विस्तार किया जाता है। एक परीक्षण स्क्रिप्ट में गूंज $ EUID लगाने की कोशिश करें और सूडो के साथ चलाएं।
user1169420

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)।


यदि वह व्यक्ति जो स्क्रिप्ट चलाने का प्रयास कर रहा है, उसके पास sudo विशेषाधिकार नहीं हैं, तो यह त्रुटि का कारण होगा और कमांड नहीं चलेगा? बस यह सुनिश्चित करना चाहता हूं, मैं सही ढंग से समझता हूं।
Caperneoignis

1
मुझे यकीन नहीं है कि यह उत्तर 100% पूरी तरह से सही है। RHEL7.2 पर बैश 4.2.46 का उपयोग करके ... अगर मैं सूडो के printf $EUIDसाथ या उसके बिना, मुझे अपना खुद का यूआईडी वापस मिलता है। यदि मैं उपयोग करता id -uहूं तो मुझे मेरा यूआईडी मिलता है और जब मैं इसे सूडो के साथ आमंत्रित करता हूं तो मुझे 0 मिलता है। क्या मैंने कुछ गलत किया?
19x पर 0xSheepdog

4
@ 0xSheepdog, यह संभव है कि बैश क्ली पर, $ EUID चर विस्तार पहले हल हो जाए, फिर sudo उपयोगकर्ता को बदल देता है। इसलिए आपको वह व्यवहार मिलेगा, लेकिन लिपियों में, सब कुछ अभी भी ठीक काम करेगा।
अलेक्जेंडर बर्ड

@AlexanderBird अच्छी बात है, धन्यवाद! मैंने कोई वास्तविक परीक्षण नहीं किया, बस अपने अनुभव की सूचना दी।
0xSheepdog

3
चर के स्थानीय शेल विस्तार को रोकने के लिए अपने परीक्षण के लिए "हेस्ट्रिंगिंग" का उपयोग करें। से तुलना sudo bash <<<'echo $EUID'करें bash <<<'echo $EUID'। अधिक पर हियरडॉक की तरह herestring के बारे में tldp.org/LDP/abs/html/x17837.html
ब्रूनो Bronosky

75

कुछ उत्तर दिए गए हैं, लेकिन यह प्रतीत होता है कि उपयोग करने के लिए सबसे अच्छी विधि है:

  • id -u
  • यदि रूट के रूप में चलाया जाता है, तो 0 की आईडी लौटा देगा।

यह अन्य विधियों की तुलना में अधिक विश्वसनीय प्रतीत होता है, और ऐसा लगता है कि यह स्क्रिप्ट के माध्यम से चलने पर भी 0 की आईडी लौटाता है sudo


1
महान यह सबसे अच्छा जवाब है
दान ओर्टेगा

59
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 हाथ से जोड़ने के लिए । यकीन नहीं है कि अगर यह एक BASH चीज़ या SUDO चीज़ या अन्य है, लेकिन यह हर समय काम करता है।
0xSheepdog

@ 0xSheepdog: यह एक बैश चीज़ है (और कुछ अन्य गोले जैसे csh की सुविधा, जहाँ IIRC की उत्पत्ति हुई थी)।
अगली सूचना तक रोक दिया गया।

सब सब में, मैं एक पूरे के रूप में पीछे के हिस्से को हटा दूंगा और ओके लाइन को फिर से लिखूंगा if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fi। चीयर्स।
LinuxSecurityFreak

29

जैसा कि @wrikken ने अपनी टिप्पणियों में उल्लेख किया है, 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) अंतिम पंक्ति में नई ले जाएँ; (2) मानक आउटपुट के बजाय मानक त्रुटि को लिखें; (३) केवल रंग सेट करें यदि मानक त्रुटि एक टर्मिनल है (बजाय लॉग-फाइल lessया व्हाट्सएप में जोखिम लेखन से बचने के अक्षर ); और (4) पृष्ठभूमि-रंग सेट करें, इसलिए उपयोगकर्ता के टर्मिनल के पृष्ठभूमि-रंग की परवाह किए बिना पाठ पठनीय होगा। तो, कुछ इस तरह function error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }। (वांछित के रूप में ट्वीक।)
20:13

3
"-ईक" के बजाय "-एन" नहीं होना चाहिए?
कार्लोस रेंडन

2
@CarlosRendon स्लेटर का कोड कुछ को रूट के रूप में चलाने से रोकना है। (यह विपरीत है जो ओपी के लिए पूछ रहा था, लेकिन जाँच का तरीका समान होगा।)
जोशुआ टेलर

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

यदि आप एक स्ट्रिंग "रूट" के साथ उपयोगकर्ता का परीक्षण करते हैं, तो क्या आप किसी को "रूट" नाम से चलाने की अनुमति नहीं दे रहे हैं?
पीसीरवलहो

आप भूल गए '' अगर के बाद
Triskeldeian

1
@peteroak रूट के अलावा और कौन होगा?
ptierno

3
+1 whoamiका उपयोग करने के बजाय वास्तव में प्रश्न का उत्तर देने के लिए id; whoamiआदेश भी जांच करने के लिए इस्तेमाल किया जा सकता अन्य , जड़ से उपयोगकर्ताओं नाम से।
Jez

10

0- आधिकारिक GNU लिनक्स प्रलेखन पढ़ें, इसे सही तरीके से करने के कई तरीके हैं।

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और जैसे POSIX शेल स्क्रिप्ट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चर, प्रभावी उपयोगकर्ता आईडी नंबर को पढ़ने के लिए कई गुना तेजी से होता है , POSIX को id -uकमांड निष्पादित करने की तुलना में-उपयोगकर्ता आईडी ढूंढता है, यह समाधान दोनों को अच्छी तरह से पैक किए गए फ़ंक्शन में जोड़ता है। यदि, और केवल अगर, किसी भी कारण से उपलब्ध नहीं है, तो कमांड निष्पादित हो जाएगी, यह सुनिश्चित करते हुए कि हमें उचित वापसी मूल्य प्राप्त नहीं होता है, चाहे परिस्थितियां क्यों न हों$EUIDid -u


मैंने इतने सालों बाद यह समाधान क्यों पोस्ट किया ओपी ने पूछा है

ठीक है, अगर मैं सही ढंग से देखता हूं, तो ऊपर एक अनुपलब्ध कोड प्रतीत होता है।

आप देखते हैं, कई चर हैं जिन्हें ध्यान में रखा जाना चाहिए, और उनमें से एक प्रदर्शन और विश्वसनीयता का संयोजन है


पोर्टेबल POSIX समाधान + उपरोक्त फ़ंक्शन के उपयोग का उदाहरण

#!/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बहुत पसंद करते हैं, वे पोर्टेबिलिटी ( POSIX गोले) के बारे में भी नहीं सोचते हैं । मेरे जैसे अन्य लोग POSIX गोले पसंद करते हैं । यह आजकल व्यक्तिगत पसंद और जरूरतों का मामला है।


6

यदि स्क्रिप्ट को वास्तव में रूट एक्सेस की आवश्यकता होती है, तो इसकी फ़ाइल अनुमतियों को प्रतिबिंबित करना चाहिए। गैर-रूट उपयोगकर्ताओं द्वारा एक रूट स्क्रिप्ट निष्पादन योग्य होने से एक लाल झंडा होगा। मैं आपको ifचेक के साथ पहुंच को नियंत्रित नहीं करने के लिए प्रोत्साहित करता हूं ।

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

4
यदि किसी के पास उनकी अनुमति है तो यह बहुत अच्छा काम करता है, लेकिन मुझे लगता है कि 777बम का अति प्रयोग इस तरह के उपयोगकर्ताओं के लिए थोड़ा दोषपूर्ण है, जो पहले स्थान पर गलती करेगा।
स्लाटर विक्टरऑफ

7
यह मान रहा है कि उपयोगकर्ता एक निष्पादन योग्य स्क्रिप्ट चला रहा है। यदि उपयोगकर्ता कॉल करता है, bash /path/to/scriptतो इसे अभी भी चलाया जा सकता हैo=r
ptierno

5

केवल स्क्रिप्ट को रूट द्वारा रन करने योग्य बनाने का एक सरल तरीका यह है कि स्क्रिप्ट को लाइन से शुरू किया जाए:

#!/bin/su root


1
मैं उत्सुक हूं कि इस उत्तर को अधिक क्यों नहीं दिया गया? यह सबसे सरल और साफ लगता है। क्या यहां नुकसान हैं?
बेसिनेटर

@Bassinator मेरा मानना ​​है कि कुछ लोग कहते हैं कि यह कुछ निश्चित निक्स पर नहीं चलेगा, लेकिन यह मेरे लिनक्स पर अब तक काम नहीं कर रहा है। कोशिश करो! हो सकता है कि यह उत्तर दौड़ में देर से आया हो, लेकिन मैं इस जानकारी को जोड़ने की कोशिश कर रहा हूं, जो समुदाय के लिए सरल है (इस धागे पर सबसे अधिक पसंद करने के बजाए, जैसे: /) वोट दें यदि आप इसे पढ़ने के लिए भाग्यशाली हैं और इसे आपकी मशीन पर काम करता है
अलेक्जेंडर

@TamusJRoyce यदि लक्ष्य की जाँच की जा रही है यदि आप रूट के रूप में चल रहे हैं और स्क्रिप्ट को केवल रूट के रूप में चलाने के लिए मजबूर नहीं कर रहे हैं, तो क्यों हर उत्तर में, यदि चेक रूट के रूप में चल रहा है, तो वे स्क्रिप्ट बनाते हैं exit? और अभी भी उन उत्तरों को उखाड़ा जा रहा है? मुझे लगता है कि लोग स्पष्ट रूप से स्क्रिप्ट को रूट के रूप में नहीं चलाना चाहते हैं। तो मैं एक सरल उत्तर के साथ सोचने के उस तरीके का अनुसरण कर रहा हूं। लेकिन हाँ, आप ऊपर दिए गए अधिक क्रिया उत्तरों से भी सीख सकते हैं
अलेक्जेंड्रे १

@ अलेक्सांद्र १ ९ 85५ बिल्कुल। परिदृश्य: यदि रूट के रूप में चल रहा है, तो शायद आप स्क्रिप्ट को प्रोग्राम को स्थापित करने के लिए डिफ़ॉल्ट रूप से चाहते हैं जब यह पूछता है कि आप इसे कैसे स्थापित करना चाहते हैं। अन्यथा, स्थानीय रूप से इसे स्थापित करने के लिए डिफ़ॉल्ट सेट है। दर्ज करने के बजाय, उपयोगकर्ता इसे वैश्विक या स्थानीय स्थापित करने का विकल्प चुन सकता है। लेकिन अगर उन्हें डिफ़ॉल्ट पसंद है, तो वे एंट्री मार सकते हैं। और उन्हें पासवर्ड से संकेत नहीं दिया जाएगा। यदि आप रूट (प्रति शीर्षक) हैं तो आपका शेबेन कभी भी "चेक" नहीं करेगा। लेकिन मुझे अभी भी लगता है कि यह उत्तर उपयोगी है।
TamusJRoyce

@TamusJRoyce पूरी तरह से आपकी टिप्पणी को समझ में आता है। वास्तव में यह एक चिंता का विषय है और यह समाधान उस उपयोग के मामले के लिए नहीं है। आपने मेरे दृष्टिकोण खोल दिए। तुम सही हो। धन्यवाद
अलेक्सांद्र

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
@LinuxSecurityFreak, मैं इसे प्रतिस्थापित करूँगा यदि आप बताते हैं कि मुझे ऐसा क्यों करना चाहिए।
वेबब्रोथ

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

परीक्षण किया और रूट में चल रहा है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.