Bash Scripting: ต้องการให้สคริปต์ทำงานเป็น root (หรือด้วย sudo)


26

ฉันพยายามเขียนสคริปต์ทุบตี (ใน Ubuntu) ที่จะสำรองข้อมูลไดเรกทอรีโดยใช้ tar

ฉันจะตรวจสอบในสคริปต์เพื่อให้สามารถทำงานในฐานะ root (หรือด้วย sudo) ได้อย่างไร

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

ฉันรู้ว่าต้องมีวิธีแก้ปัญหาที่ง่ายฉันไม่สามารถค้นพบได้โดย googling

คำตอบ:


37

เพื่อดึง uid ที่มีประสิทธิภาพใช้คำสั่งนี้:

id -u

หากผลลัพธ์คือ '0' แสดงว่าสคริปต์กำลังทำงานเป็น root หรือใช้ sudo คุณสามารถเรียกใช้เช็คโดยทำสิ่งที่ชอบ:

if [[ $(/usr/bin/id -u) -ne 0 ]]; then
    echo "Not running as root"
    exit
fi

5
ฉันขอแนะนำเส้นทางที่มีคุณสมบัติครบถ้วนไปยัง id (เช่น / usr / bin / id) มิฉะนั้นผู้ใช้ที่คดเคี้ยวสามารถเขียนสคริปต์ / ไบนารีของตนเองที่ส่งคืน 0 เสมอและวางไว้ในตำแหน่งที่มีอยู่ก่อนหน้านี้ในเส้นทางผู้ใช้ที่กำลังดำเนินการ
ktower

ตกลง แก้ไขด้วยการแก้ไข
Scott Pack

6
ทุกคนที่ 'คดเคี้ยว' พยายามเรียกใช้สคริปต์จะไม่ถูกหยุดโดยคุณโดยใช้เส้นทางแบบเต็มไปยัง id
theotherreceive

ฉันเห็นด้วยกับพวกเขา ... มันเป็นสคริปต์ทุบตี การมีคุณสมบัติของถังขยะ 'id' จะไม่หยุดยั้งผู้ที่ตั้งใจจะตรวจสอบอย่างจริงจัง ดีกว่าที่จะปล่อยให้มันไม่มีเงื่อนไขสำหรับการพกพา
307 Chris Chris

1
นี่ไม่ได้ตอบสนองความต้องการ "sudo"
GregB

17

ฉันถือว่าคุณรู้ว่าโดยการเปลี่ยนความเป็นเจ้าของเป็นรูท

chown root:root file

และตั้งค่าการอนุญาตเป็น 700

chmod 700 file

คุณจะประสบความสำเร็จในสิ่งเดียวกันโดยไม่ต้องมีข้อเสนอแนะให้เรียกใช้ในฐานะ sudo

แต่ฉันจะโพสต์คำตอบนี้เพื่อความสมบูรณ์


3
นี่เป็นวิธีแก้ปัญหามากกว่าคำตอบที่ยอมรับได้ - $ 0.02 ของฉัน
Chris

หมายเหตุด้านข้าง: การตรวจสอบสคริปต์ให้เป็นคอมไพล์จะยากขึ้น ในการแก้ไขsudo git add <file>
Chaim Eliyah

2

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

หากคุณต้องการแจ้งผู้ใช้มากกว่าข้อเสนอแนะ uid ใด ๆ ก็ดี แต่มันมีประโยชน์เหมือนยางบนหลังม้าเพื่อเป็นการป้องกันความปลอดภัย - ไม่มีอะไรที่จะหยุดยั้งผู้ใช้ไม่ให้คัดลอกสคริปต์ และเรียกใช้ต่อไป

หากนี่เป็นปัญหาด้านความปลอดภัยสคริปต์ควรถูกตั้งค่าเป็น 700 ซึ่งเป็นเจ้าของโดย root: root ดังนั้นจึงไม่สามารถอ่านหรือปฏิบัติการได้โดยผู้ใช้รายอื่น


หรืออาจเป็นสคริปต์ที่ต้องการการเข้าถึงไฟล์หรือคำสั่งที่เข้าถึงได้เฉพาะกับ root เพื่อดำเนินงานเช่นเดียวกับในกรณีของฉัน
chrisbunney

2

คุณสามารถใช้คำสั่ง whoami ได้เช่นกัน

if [ ! "`whoami`" = "root" ]
then
    echo "\nPlease run script as root."
    exit 1
fi

อันที่จริง uid 0 เป็นบัญชีผู้ใช้พิเศษที่มีสิทธิ์เต็ม "root" เป็นเพียงชื่อป้าย / ชื่อที่พบมากที่สุดที่แมปกับ UID นั้น ไม่จำเป็นต้องเป็น 'รูท' และผู้โจมตีอาจพยายามใช้ประโยชน์จากสิ่งนี้
0xSheepdog

2

ตัวแปร bash $EUIDแสดง UID ที่มีประสิทธิภาพซึ่งสคริปต์กำลังทำงานอยู่หากคุณต้องการตรวจสอบให้แน่ใจว่าสคริปต์ทำงานในฐานะรูทให้ตรวจสอบว่า$EUIDมีค่า 0 หรือไม่:

if [ $EUID -ne 0 ]; then
    echo "$0 is not running as root. Aborting."
    exit 2
fi

สิ่งนี้ดีกว่าโซลูชันที่มี/usr/bin/id(สำหรับสคริปต์ทุบตี!) เพราะไม่ต้องการคำสั่งภายนอก


แทนที่จะเป็นเพียงการออกสามารถแจ้งให้ผู้ใช้เข้าสู่ระบบ sudo โดยการเปลี่ยนechoสายที่มีsudo "$0" "$@"และแทนที่ด้วยexit 2 exit $?
schumacher574

0

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


-1

"#! / bin / su root" อนุญาตให้ผู้ใช้ในโหมด super user เรียกใช้สคริปต์โดยไม่ต้องใช้รหัสผ่านรูท ถ้าคุณต้องการให้ผู้ใช้ขั้นสูงเรียกใช้สคริปต์ด้วยผลลัพธ์ของรูทสิ่งนี้จะทำเช่นนั้น

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.