วิธีการตรวจสอบว่าทำงานเป็น root ในสคริปต์ทุบตี


274

ฉันกำลังเขียนสคริปต์ที่ต้องได้รับอนุญาตในระดับรากและฉันต้องการที่จะทำมันเพื่อที่ว่าหากสคริปต์ไม่ได้รับการเรียกใช้ในฐานะรากมันก็ก้อง "กรุณาเรียกใช้เป็นราก" และออกจาก

นี่คือรหัสเทียมบางส่วนสำหรับสิ่งที่ฉันกำลังมองหา:

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

  else (do stuff)
fi

exit

ฉันจะทำได้ดีที่สุด (อย่างปลอดภัยและปลอดภัย) ได้อย่างไร ขอบคุณ!

อ่าเพื่อชี้แจง: ส่วน (ทำสิ่ง) จะเกี่ยวข้องกับการใช้คำสั่งที่จำเป็นต้องใช้รูท ดังนั้นการรันเป็นผู้ใช้ปกติจะเกิดข้อผิดพลาดขึ้น นี่หมายถึงการรันสคริปต์ที่ต้องการคำสั่งรูทอย่างชัดเจนโดยไม่ต้องใช้ sudo ภายในสคริปต์ฉันแค่มองหาน้ำตาลประโยค


8
(1) ทำให้มันไม่สามารถเรียกใช้งานได้โดยสิ่งอื่นจากนั้นรูท (2) จัดการสิทธิ์เพิ่มเติมเช่นกัน .. (3) id -uผลตอบแทน0สำหรับรูท
Wrikken

คำตอบ:


403

ตัวแปรสภาพแวดล้อม $ EUID เก็บ UID ของผู้ใช้ปัจจุบัน UID ของรูทคือ 0 ใช้สิ่งนี้ในสคริปต์ของคุณ:

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

หมายเหตุ:ถ้าคุณได้รับ2: [: Illegal number:การตรวจสอบถ้าคุณมีที่ด้านบนและเปลี่ยนเป็น#!/bin/sh#!/bin/bash


ดูเหมือนว่าการอนุญาตที่ดีและการมีความปลอดภัยสองชั้นคือ
Kolob Canyon

25
ฉันคิดว่าเป็นการดีกว่าที่จะเปรียบเทียบสตริงกับสตริงตัวเลขกับตัวเลข ใช้เครื่องหมายวงเล็บคู่คุณสามารถใช้> โดยตรงโดยไม่มีการเสนอราคา [[US $ EUID> 0]]
Sergio Abreu

7
ฉันได้2: [: Illegal number:รับคำเตือนจนกระทั่งเปลี่ยนเป็นเวอร์ชั่นของ Sergio
alexeydemin

1
@ thekiwi5000 อัฒภาคจำเป็นเฉพาะเมื่อthenอยู่ในบรรทัดเดียวกับเงื่อนไข ...
ptierno

1
@StephenAngelico Sudo ควรทำงาน หากคุณกำลังทดสอบโดยทำ $ sudo echo $ EUID; เป็นการทดสอบที่ไม่ดีและจะล้มเหลวเนื่องจากมีการขยาย $ EUID ก่อนที่คำสั่งจะถูกส่งไปยัง sudo ลองวาง echo $ EUID ในสคริปต์ทดสอบแล้วเรียกใช้ด้วย sudo
user1169420

79

ในสคริปต์ทุบตีคุณมีหลายวิธีในการตรวจสอบว่าผู้ใช้ที่ทำงานอยู่รูทหรือไม่

เป็นการเตือนอย่าตรวจสอบว่าผู้ใช้รูทโดยใช้rootชื่อผู้ใช้หรือไม่ การค้ำประกันไม่มีอะไรที่ผู้ใช้ที่มี ID 0 rootเรียกว่า มันเป็นแบบแผนที่แข็งแกร่งมากที่มีการติดตามอย่างกว้าง ๆ แต่ทุกคนสามารถเปลี่ยนชื่อ superuser เป็นชื่ออื่นได้

ฉันคิดว่าวิธีที่ดีที่สุดเมื่อใช้bashคือใช้$EUIDจากหน้า man:

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

วิธีนี้คำสั่งของฉันถูกเรียกใช้โดยรูทเมื่อใช้ superuser หรือโดยsudoเมื่อรันโดยผู้ใช้ทั่วไป

หากรูทสคริปต์ของคุณถูกเรียกใช้โดยรูทให้ตั้งค่าสิทธิ์ตาม ( 0500)


หากบุคคลที่พยายามเรียกใช้สคริปต์ไม่มีสิทธิ์ sudo สิ่งนี้จะทำให้เกิดข้อผิดพลาดในการโยนและคำสั่งจะไม่ทำงาน แค่ต้องการให้แน่ใจว่าฉันเข้าใจถูกต้อง
Caperneoignis

1
ฉันไม่แน่ใจว่าคำตอบนี้ถูกต้อง 100% อย่างสมบูรณ์ ใน RHEL7.2 โดยใช้ Bash 4.2.46 ... หากฉันprintf $EUIDมีหรือไม่มี sudo ฉันจะได้รับ UID ของตัวเองกลับมา ถ้าฉันใช้id -uฉันจะได้รับ UID ของฉันและเมื่อฉันเรียกใช้ด้วย sudo ฉันจะได้ 0 กลับ ฉันทำอะไรผิดหรือเปล่า?
0xSheepdog

4
@ 0xSheepdog เป็นไปได้ว่าใน bash cli การขยายตัวแปร $ EUID ได้รับการแก้ไขก่อนจากนั้นจึงเปลี่ยนผู้ใช้ ดังนั้นคุณจะได้รับพฤติกรรมนั้น แต่ในสคริปต์ทุกอย่างจะยังคงทำงานได้ดี
Alexander Bird

@AlexanderBird จุดดีขอขอบคุณ! ฉันไม่ได้ทำการทดสอบจริง ๆ เพียงรายงานประสบการณ์ของฉัน
0xSheepdog

3
ใช้ "herestring" สำหรับการทดสอบของคุณเพื่อป้องกันการขยายตัวของเชลล์โลคอลของตัวแปร เปรียบเทียบไปsudo bash <<<'echo $EUID' bash <<<'echo $EUID'ข้อมูลเพิ่มเติมเกี่ยวกับ herestoc-like herestring ที่tldp.org/LDP/abs/html/x17837.html
Bruno Bronosky

75

ได้รับคำตอบเล็กน้อย แต่ปรากฏว่าวิธีที่ดีที่สุดคือใช้:

  • id -u
  • หากรันเป็น root จะส่งคืน id 0

ปรากฏขึ้นนี้จะมีความน่าเชื่อถือกว่าวิธีการอื่น ๆ และดูเหมือนว่ามันกลับรหัส 0 sudoแม้ว่าสคริปต์วิ่งผ่าน


1
ดีมากนี่คือคำตอบที่ดีที่สุด
Dan Ortega

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

:)


คุณสามารถพิจารณาการรวมคำตอบของ Jeremy J Starcher เข้า กับส่วนนี้ในท้ายที่สุดมันก็เป็นสิ่งเดียวกันเสมอ ...
จริงๆ

ฉันรู้ว่าจากเทอร์มินัลเมื่อฉันลืมนำหน้าบางสิ่งด้วยsudoฉันสามารถพิมพ์ได้sudo !!และมันก็ใช้ได้ผลสำหรับฉันแทนที่จะกดลูกศรขึ้นไปที่จุดเริ่มต้นของบรรทัดและเพิ่มsudo ด้วยมือ ไม่แน่ใจว่าเป็นสิ่งที่ทุบตีหรือสิ่ง SUDO หรืออื่น ๆ แต่มันใช้งานได้ตลอดเวลา
0xSheepdog

@ 0xSheepdog: มันเป็นเรื่องของ Bash (และเป็นคุณสมบัติของเชลล์อื่น ๆ เช่น csh, ที่ซึ่งมันเกิดขึ้นที่ IIRC)
หยุดชั่วคราวจนกว่าจะมีการแจ้งให้ทราบต่อไป

โดยรวมแล้วฉันจะลบส่วนที่เป็นส่วนหลังทั้งหมดและเขียนบรรทัด ok if [ "$(id -u)" -ne 0 ]; then echo 'Please run as root.' >&2; exit 1; fiใหม่ ไชโย
LinuxSecurityFreak

29

ตามที่ @ wrikken พูดถึงในความคิดเห็นของเขาid -uการตรวจสอบดีกว่าสำหรับรูท

นอกจากนี้เมื่อใช้งานอย่างเหมาะสมsudoคุณสามารถตรวจสอบสคริปต์และดูว่าสคริปต์ทำงานเป็นรูทหรือไม่ หากไม่มีให้เรียกคืนตัวเองผ่านทางsudoและเรียกใช้ด้วยสิทธิ์การรูท

ตัวเลือกอื่นอาจตั้งค่าsudoรายการสำหรับคำสั่งพิเศษที่สคริปต์อาจต้องการ


มีวิธีที่สง่างามที่จะให้โปรแกรมเรียกคืนตัวเองได้หรือไม่? อาจมีตัวแปร bash บางตัวที่มีพา ธ สัมบูรณ์ไปยังโปรแกรมหรือไม่
นาธาน

1
ฉันไม่ใกล้พรอมต์ BASH ในขณะนี้เพื่อทดสอบ แต่$0มีชื่อของสคริปต์ที่ทำงานอยู่ มีตัวอย่างบางส่วนที่นี่ที่อาจจะช่วยให้คุณ
Jeremy J Starcher

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คำสั่งนั้นคืออะไร? ระบบของฉันไม่ได้มีมัน . .
ruakh

โอ้นั่นเป็นเพียงไหวพริบเล็ก ๆ ไม่สำคัญมากขนาดนั้น แต่ฉันจะแนบมัน
Slater Victoroff

4
มันเจ๋งมาก! หากฉันอาจแนะนำการปรับปรุงเล็กน้อย: (1) ย้ายบรรทัดใหม่ไปยังจุดสิ้นสุด; (2) เขียนข้อผิดพลาดมาตรฐานแทนที่จะเป็นเอาท์พุทมาตรฐาน; (3) ตั้งค่าสีเฉพาะเมื่อข้อผิดพลาดมาตรฐานคือเทอร์มินัล (แทนที่จะเสี่ยงเขียนตัวอักษรเลี่ยงลงในล็อกไฟล์หรือlessหรืออะไรก็ตาม) และ (4) ตั้งค่าสีพื้นหลังดังนั้นข้อความจะสามารถอ่านได้โดยไม่คำนึงถึงสีพื้นหลังของเทอร์มินัลของผู้ใช้ function error () { if [[ -t 2 ]] ; then echo $'\033[31;2;47m'"$@"$'\033[0m' ; else echo "$@" ; fi >&2 ; }ดังนั้นสิ่งที่ต้องการ (ปรับแต่งตามต้องการ)
ruakh

3
ไม่ควรเป็น "-ne" แทนที่จะเป็น "-eq" ใช่หรือไม่
Carlos Rendon

2
@CarlosRendon รหัสของ Slater คือการป้องกันบางสิ่งบางอย่างจากการทำงานในฐานะรูท (ตรงข้ามกับสิ่งที่ OP ร้องขอ แต่วิธีการตรวจสอบจะเหมือนกัน)
Joshua Taylor

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

หากคุณทดสอบผู้ใช้ด้วยสตริง "root" คุณไม่อนุญาตให้เรียกใช้ทุกคนที่ชื่อ "root" หรือไม่
pcarvalho

คุณลืม ';' หลังจาก if
Triskeldeian

1
@ peteroak ใครจะเป็นคนอื่นชื่อรูทนอกเหนือจากรูท?
ptierno

3
+1 สำหรับจริงการตอบคำถามเกี่ยวกับการwhoamiมากกว่าการใช้id; whoamiคำสั่งนอกจากนี้ยังสามารถนำมาใช้ในการตรวจสอบอื่น ๆ ที่ผู้ใช้กว่ารากโดยใช้ชื่อ
Jez

10

0- อ่านเอกสาร GNU Linux อย่างเป็นทางการมีหลายวิธีในการทำอย่างถูกต้อง

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และPOSIXdashสคริปต์เปลือกเช่น

ฉันเชื่อว่าไม่มีคำอธิบายมากมายที่นี่เนื่องจากคำตอบที่ได้รับการโหวตอย่างสูงทำหน้าที่อธิบายได้ดีมาก

แต่ถ้ามีอะไรจะอธิบายเพิ่มเติมอย่าลังเลที่จะแสดงความคิดเห็นฉันจะพยายามอย่างเต็มที่เพื่อเติมช่องว่าง


ปรับ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 ผู้ใช้ที่มีประสิทธิภาพมากกว่าเรียกใช้id -uคำสั่งเพื่อPOSIX -ค้นหา ID ผู้ใช้โซลูชันนี้จึงรวมทั้งสองอย่างเข้าด้วยกันเป็นฟังก์ชันที่อัดแน่น หากและถ้าหาก$EUIDไม่ว่าด้วยเหตุผลใดก็ตามid -uคำสั่งจะได้รับการดำเนินการเพื่อให้มั่นใจว่าเราได้รับมูลค่าที่เหมาะสมไม่ว่าจะอยู่ในสถานการณ์ใด


ทำไมฉันโพสต์โซลูชั่นนี้หลังจากหลายปี OP ได้ถาม

ถ้าฉันเห็นอย่างถูกต้องดูเหมือนว่าจะไม่มีโค้ดข้างต้น

คุณจะเห็นว่ามีหลายตัวแปรที่ต้องนำมาพิจารณาและหนึ่งในนั้นคือการรวมประสิทธิภาพและความน่าเชื่อถือ


โซลูชัน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

ข้อสรุป

เท่าที่คุณอาจจะไม่ชอบสภาพแวดล้อม Unix / Linux นั้นมีความหลากหลายมาก หมายความว่ามีคนที่ชอบbashมากพวกเขาไม่ได้คิดถึงการพกพา ( POSIX shells) คนอื่น ๆ เช่นฉันชอบเชลล์POSIX ทุกวันนี้เป็นเรื่องของการเลือกและความต้องการส่วนตัว


6

หากสคริปต์ต้องการการเข้าถึงรูทจริงๆการอนุญาตไฟล์ควรสะท้อนให้เห็น การมีสคริปต์รูทที่สามารถเรียกทำงานได้โดยผู้ใช้ที่ไม่ใช่รูทจะเป็นค่าสถานะสีแดง ฉันขอแนะนำให้คุณไม่ควบคุมการเข้าถึงด้วยifเช็ค

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

4
หากใครบางคนมีสิทธิ์ของพวกเขาในการสั่งซื้อนี้ใช้งานได้ดี แต่ฉันรู้สึกเหมือน777ระเบิดมากเกินไปทำให้การตรวจสอบนี้เป็นความผิดพลาดเล็กน้อยสำหรับผู้ใช้ประเภทที่จะทำผิดพลาดในสถานที่แรก
Slater Victoroff

7
นี่คือการสมมติว่าผู้ใช้กำลังเรียกใช้สคริปต์ที่ปฏิบัติการได้ หากผู้ใช้เพียงแค่เรียกbash /path/to/scriptมันยังคงสามารถวิ่งได้แม้ว่าo=r
ptierno

5

วิธีง่าย ๆ ในการทำให้สคริปต์ที่รันได้โดยรูทคือการเริ่มต้นสคริปต์ด้วยบรรทัด:

#!/bin/su root


1
ฉันอยากรู้ว่าทำไมคำตอบนี้ไม่ได้รับการโหวตสูงกว่า? ดูเหมือนง่ายที่สุดและสะอาดที่สุด ที่นี่มีข้อเสียหรือไม่
Bassinator

@Bassinator ฉันเชื่อว่าบางคนบอกว่ามันจะไม่ทำงานบน nix ที่แน่นอน แต่มันยังทำงานได้อย่างไม่มีที่ติบน Linux ของฉันจนถึงตอนนี้ ลองมัน! บางทีคำตอบนี้อาจมาช้ากว่าการแข่งขัน แต่ฉันพยายามเพิ่มความรู้ที่เป็นเรื่องง่ายสำหรับชุมชน (แทนที่จะให้คำตอบที่คล้ายกันเช่นส่วนใหญ่ในหัวข้อนี้: /) โหวตให้เลยถ้าคุณโชคดีที่อ่านมันและ ทำงานบนเครื่องของคุณ
alexandre1985

@TamusJRoyce หากเป้าหมายกำลังตรวจสอบว่าคุณกำลังใช้งานในฐานะรูทหรือไม่และบังคับให้สคริปต์รันเฉพาะในฐานะรูททำไมในทุกคำตอบหลังจากตรวจสอบว่าทำงานเป็นรูทexitหรือไม่ และคำตอบเหล่านั้นยังถูกยกระดับขึ้นหรือไม่ ฉันเดาว่าคนโดยปริยายไม่ต้องการให้สคริปต์ทำงานเป็นรูท ดังนั้นฉันจึงทำตามวิธีคิดด้วยคำตอบที่ง่ายกว่า แต่ใช่คุณสามารถเรียนรู้จากคำตอบ verbose เพิ่มเติมข้างต้น
alexandre1985

@ alexandre1985 อย่างแน่นอน สถานการณ์สมมติ: หากใช้เป็นรูทคุณอาจต้องการให้สคริปต์เป็นค่าเริ่มต้นในการติดตั้งโปรแกรมทั่วโลกเมื่อถามว่าคุณต้องการติดตั้งอย่างไร มิฉะนั้นค่าเริ่มต้นจะถูกตั้งค่าให้ติดตั้งในเครื่อง แทนที่จะกดปุ่ม Enter ผู้ใช้สามารถเลือกที่จะติดตั้งแบบโกลบอลหรือโลคัล แต่ถ้าพวกเขาชอบค่าเริ่มต้นพวกเขาสามารถกด Enter และพวกเขาจะไม่ได้รับแจ้งด้วยรหัสผ่าน Shebang ของคุณจะไม่ "ตรวจสอบ" ถ้าคุณรูท (ต่อชื่อ) แต่ฉันก็ยังคิดว่าคำตอบนี้มีประโยชน์
TamusJRoyce

@TamusJRoyce ทำให้รู้สึกถึงความคิดเห็นของคุณโดยสิ้นเชิง แท้จริงแล้วเป็นข้อกังวลและทางออกนี้ไม่ได้มีไว้สำหรับกรณีการใช้งาน คุณเปิดมุมมองของฉัน คุณพูดถูก ขอบคุณ
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
@ LinuxSecurityFreak ฉันจะแทนที่ถ้าคุณอธิบายว่าทำไมฉันควรทำ
WebBrother

2

id -uดีกว่าwhoamiเนื่องจากบางระบบเช่น android อาจไม่ให้คำว่า root

ตัวอย่าง:

# 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 ปีที่มีคำตอบอยู่แล้วหลายข้อ
Styphon

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.