ต่อไปนี้จะเป็นกรณีที่คุณต้องการที่จะเรียกใช้คำสั่งโดยไม่ต้องใช้รหัสผ่านเท่านั้นถ้ามันมีเฉพาะชุดของตัวเลือกที่เป็นส่วนหนึ่งในตัวเลือกที่เป็นตัวแปร AFAIK ไม่สามารถใช้ตัวแปรหรือช่วงค่าในการประกาศ sudoers เช่นคุณสามารถอนุญาตการเข้าถึงอย่างชัดเจนcommand option1
แต่ไม่ได้command option2
ใช้:
user_name ALL=(root) /usr/bin/command option1
แต่ถ้าโครงสร้างcommand option1 value1
ที่value1
สามารถแตกต่างกันคุณจะต้องมีอย่างชัดเจน sudoers value1
สายสำหรับแต่ละค่าเป็นไปได้ของ เชลล์สคริปต์ให้วิธีแก้ไข
คำตอบนี้ได้แรงบันดาลใจจากคำตอบของ M. Ahmad Zafar และแก้ไขปัญหาความปลอดภัยที่นั่น
sudo
สร้างเชลล์สคริปต์ที่คุณโทรสั่งได้โดยไม่ต้อง
- บันทึกสคริปต์ในโฟลเดอร์ที่มีสิทธิ์ใช้งานรูท (เช่น
/usr/local/bin/
) สร้างไฟล์ให้เป็นเจ้าของรูท (เช่นchown root:wheel /usr/local/bin/script_name
) โดยไม่มีสิทธิ์การเขียนสำหรับผู้อื่น (เช่นchmod 755 /usr/local/bin/script_name
)
เพิ่มข้อยกเว้นให้กับ sudoers โดยใช้ visudo:
user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name
.
sudo script_name
เรียกใช้สคริปต์ของคุณ
ตัวอย่างเช่นฉันต้องการเปลี่ยนการหมดเวลาแสดงการนอนหลับบน macOS สิ่งนี้ทำได้โดยใช้:
sudo pmset displaysleep time_in_minutes
ฉันคิดว่าการเปลี่ยนการหมดเวลาของการนอนหลับเป็นการกระทำที่ไร้เดียงสาที่ไม่ได้สร้างความยุ่งยากให้กับการพิมพ์รหัสผ่าน แต่pmset
สามารถทำสิ่งต่าง ๆ ได้หลายอย่างและฉันต้องการเก็บสิ่งอื่น ๆ เหล่านี้ไว้เบื้องหลังรหัสผ่าน sudo
ดังนั้นฉันมีสคริปต์ต่อไปนี้ที่/usr/local/bin/ds
:
#!/bin/bash
if [ $# -eq 0 ]; then
echo 'To set displaysleep time, run "sudo ds [sleep_time_in_minutes]"'
else
if [[ $1 =~ ^([0-9]|[1-9][0-9]|1[0-7][0-9]|180)$ ]]; then
pmset displaysleep $1
else
echo 'Time must be 0..180, where 0 = never, 1..180 = number of minutes'
fi
fi
ในตอนท้ายของsudoers
ไฟล์ฉันมีบรรทัดต่อไปนี้:
user_name ALL=(root) NOPASSWD: /usr/local/bin/ds
หากต้องการตั้งค่าการหมดเวลาเป็น 3 นาทีฉันจะเรียกใช้สคริปต์จากบัญชีผู้ใช้ทั่วไปuser_name
:
sudo ds 3
ป.ล. สคริปต์ส่วนใหญ่ของฉันคือการตรวจสอบความถูกต้องของอินพุตซึ่งไม่บังคับดังนั้นสิ่งต่อไปนี้จะใช้ได้:
#!/bin/bash
pmset displaysleep $1
/path/to/my/program
ได้หรือไม่หากเป็นสคริปต์ไพ ธ อน