แนวทางปฏิบัติที่ดีที่สุดเกี่ยวกับการใช้ sudo ในสคริปต์ทุบตี


11

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

ฉันมาด้วยวิธีการบางอย่าง แต่พวกเขาแต่ละคนมีปัญหาบางอย่าง

วิธีที่ 1: การใช้ sudo ภายในไฟล์

#!/bin/bash
sudo echo "I must be run by root"
touch needsToBeOwnedByUser1
echo "needs to be run by user"
sleep 1000
sudo echo "I, again, must be run by root"

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

วิธีที่ 2: ใช้ sudo เพื่อโทรหาไฟล์จากนั้นเปลี่ยนกลับเป็นผู้ใช้ดั้งเดิมเมื่อต้องการ

#!/bin/bash
echo "I must be run by root"
su username -c 'touch needsToBeOwnedByUser1'
su username -c 'echo "needs to be run by user"'
su username -c 'sleep 1000'
echo "I, again, must be run by root"

สิ่งนี้ก็แย่เพราะฉันต้องเพิ่มsu username -cต่อหน้าเกือบทุกบรรทัด การหาชื่อผู้ใช้ดั้งเดิมหลังจากนั้นsudoก็เป็นไปได้เช่นกัน แต่ก็ยุ่งยาก

มีวิธีที่ดีกว่า?

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


4
สิ่งนี้ไม่ค่อยมีความจำเป็น ในกรณีส่วนใหญ่คุณเพียงเรียกใช้สคริปต์ด้วยsudoหากจำเป็นต้องมีการยกระดับสิทธิ์ แต่มีจุดในการเปลี่ยนไปใช้ไม่มีการเรียกใช้su username -c echoกล่าวอีกนัยหนึ่งฟังดูเหมือน [XY] คุณสามารถแก้ไขและอธิบายสิ่งที่สคริปต์ของคุณจะทำจริง ๆ และทำไมคุณถึงรู้สึกว่าคุณต้องเปลี่ยนผู้ใช้บ่อยครั้ง
terdon

1
@ElderGeek คุณวางลิงก์ผิดหรือเปล่า ดูเหมือนจะไม่เกี่ยวข้องกันเลย นี่อาจเป็นคำซ้ำของฉันจะรันคำสั่ง 'sudo' ภายในสคริปต์ได้อย่างไร แต่ฉันหวังว่า OP สามารถอธิบายได้มากกว่านี้
terdon

@terdon ดูเหมือนจะเป็นเช่นนั้น การทำความสะอาด.
Elder Geek

นี่เป็นเพียงสคริปต์ตัวอย่าง ฉันไม่ต้องการวางสคริปต์ไลน์มากกว่า 200 รายการที่นี่ ฉันจะแก้ไขคำตอบสำหรับรายละเอียดเพิ่มเติม
Dakkaron

คุณได้พิจารณาตัวเลือกการตรวจสอบซึ่งอธิบายไว้ในman sudo? -v, --validate 'อัปเดตข้อมูลประจำตัวที่แคชของผู้ใช้รับรองความถูกต้องของผู้ใช้หากจำเป็น สำหรับปลั๊กอิน sudoers สิ่งนี้จะขยายการหมดเวลาของ sudo อีก 15 นาทีโดยค่าเริ่มต้น แต่ไม่ได้รันคำสั่ง นโยบายความปลอดภัยบางส่วนไม่สนับสนุนข้อมูลประจำตัวที่แคชไว้ ' (ถ้าคุณเรียกใช้บ่อยพอการรับรองความถูกต้องของ sudo ไม่ควรหมดเวลา)
sudodus

คำตอบ:


5

เกี่ยวกับวิธีที่ 2 คุณสามารถใช้ฟังก์ชั่นได้ง่ายขึ้น ตัวอย่างเช่น:

#!/bin/bash

func(){
    echo "Username: $USER"
    echo "    EUID: $EUID"
}

export -f func

func
su "$SUDO_USER" -c 'func'

$SUDO_USERคือชื่อผู้ใช้ของ sudoer คุณสามารถใช้$(logname)แทนได้

ทำงานบนเครื่องของฉัน:

$ sudo bash test.sh
[sudo] password for wja: 
Username: root
    EUID: 0
Username: wja
    EUID: 1000

2

โดยการอ่านman sudoersหนึ่งเห็น:

 PASSWD and NOPASSWD

   By default, sudo requires that a user authenticate him or herself
   before running a command.  This behavior can be modified via the
   NOPASSWD tag.  Like a Runas_Spec, the NOPASSWD tag sets a default for
   the commands that follow it in the Cmnd_Spec_List.  Conversely, the
   PASSWD tag can be used to reverse things.  For example:

   ray     rushmore = NOPASSWD: /bin/kill, /bin/ls, /usr/bin/lprm

   would allow the user ray to run /bin/kill, /bin/ls, and /usr/bin/lprm
   as root on the machine rushmore without authenticating himself. 

ดังนั้นคุณสามารถอนุญาตให้regularโฮสต์machine1ทำการดำเนินการcommand1และcommand2ในฐานะรูทโดยไม่ต้องมีการตรวจสอบสิทธิ์ด้วยรหัสผ่านด้วย:

reguser machine1 root = NOPASSWD: /usr/local/command1, /usr/local/command2  

แต่อ่านman -k sudoรายละเอียดแต่ละข้อ


0

บางทีนี่อาจช่วยได้:

chmod 775 yourscript.sh

จากนั้นคุณสามารถใช้ sudo ภายในสคริปต์ (โดยไม่ต้องใส่รหัสผ่าน) และไม่สามารถใช้ sudo สำหรับคำสั่งอื่น ๆ ภายในสคริปต์ของคุณ


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