ฉันจะแก้ไข / etc / sudoers จากสคริปต์ได้อย่างไร


116

ฉันต้องการแก้ไข/etc/sudoersจากสคริปต์เพื่อเพิ่ม / ลบสิ่งต่างๆจากรายการสีขาว

สมมติว่าฉันมีคำสั่งที่ใช้กับไฟล์ปกติฉันจะนำไปใช้กับมันได้/etc/sudoersอย่างไร?

ฉันสามารถคัดลอกและแก้ไขแล้วvisudoแทนที่ต้นฉบับด้วยสำเนาที่แก้ไขได้หรือไม่ โดยให้สคริปต์ของฉันเองใน$EDITOR?

หรือฉันสามารถใช้ล็อคเดียวกันและcp?

คำถามนี้เกี่ยวกับปัญหาที่อาจเกิดขึ้นมากกว่าแค่การค้นหาสิ่งที่ใช้ได้ผล

คำตอบ:


146

กระทู้เก่า แต่สิ่งที่เกี่ยวกับ:

echo 'foobar ALL=(ALL:ALL) ALL' | sudo EDITOR='tee -a' visudo

10
นี่คือคำตอบที่ยอดเยี่ยม subshell echo "$USER ALL=NOPASSWD:/usr/bin/rsync" | (sudo su -c 'EDITOR="tee" visudo -f /etc/sudoers.d/rsync')ทั้งควรจะดำเนินการเป็นรากเช่น
simon

3
คำตอบนี้ใช้ได้ผลดีมาก! ฉันใช้สำหรับ postinst skripts ในแพ็คเกจเดเบียน ขอบคุณ! เนื่องจากสิ่งนี้มักจะรูทมันจึงสั้นและสะดวก:echo "$CONFIGLINE" | (EDITOR="tee -a" visudo)
Boris Däppen

3
ฉันแค่ต้องการชี้ให้เห็นถึงความแตกต่างที่สำคัญสำหรับคำตอบของ @ BorisDäppen: -aแฟล็กถึงEDITOR="tee": มันจะต่อท้ายบรรทัดในไฟล์ไม่เพียง แต่เขียนทับบรรทัดแรกเท่านั้น ตอนแรกฉันไม่เข้าใจสิ่งที่แตกต่างและฉันคิดวิธีต่อท้ายไม่ได้ ฉันหวังว่าฉันจะพบบางคนได้บ้างโดยชี้ไปที่ตรงนั้น ;-)
Jean-Philippe Murray

3
ใครช่วยอธิบายหน่อยได้ไหมว่างานนี้ฉันหมายความว่าไม่จำเป็นต้องใช้อัฒภาคหลัง EDITOR = 'tee -a' ฉันรู้ว่าจะผิดคำสั่ง EDITOR เป็นตัวแปรเชลล์และ visudo เป็นอีกคำสั่งหนึ่งดังนั้นที่นี่เรากำลังส่ง EDITOR และ visudo ในบรรทัดคำสั่งเดียวกัน มันทำงานอย่างไร?
Sagar

1
ฉันลองใช้ x = "something" echo $ x สิ่งนี้ไม่ได้ผลสำหรับฉัน
Sagar

43

ใช้ visudo สำหรับสิ่งนี้ด้วยโปรแกรมแก้ไขแบบกำหนดเอง วิธีนี้ช่วยแก้ปัญหาสภาพการแข่งขันและปัญหา "แฮ็ก" ทั้งหมดด้วยโซลูชันของ Brian

#!/bin/sh
if [ -z "$1" ]; then
  echo "Starting up visudo with this script as first parameter"
  export EDITOR=$0 && sudo -E visudo
else
  echo "Changing sudoers"
  echo "# Dummy change to sudoers" >> $1
fi

สคริปต์นี้จะเพิ่มบรรทัด "# Dummy change to sudoers" ต่อท้าย sudoers ไม่มีการแฮ็กและไม่มีเงื่อนไขการแข่งขัน

เวอร์ชันคำอธิบายประกอบที่อธิบายวิธีการใช้งานจริง:

if [ -z "$1" ]; then

  # When you run the script, you will run this block since $1 is empty.

  echo "Starting up visudo with this script as first parameter"

  # We first set this script as the EDITOR and then starts visudo.
  # Visudo will now start and use THIS SCRIPT as its editor
  export EDITOR=$0 && sudo -E visudo
else

  # When visudo starts this script, it will provide the name of the sudoers 
  # file as the first parameter and $1 will be non-empty. Because of that, 
  # visudo will run this block.

  echo "Changing sudoers"

  # We change the sudoers file and then exit  
  echo "# Dummy change to sudoers" >> $1
fi

5
สิ่งนี้ต้องการให้มีการคอมไพล์ sudo ด้วย--enable-env-editorมิฉะนั้นจะใช้การเคารพตัวแปรเอดิเตอร์หากเป็นหนึ่งในค่าที่ทราบเล็กน้อยเท่านั้น
Caleb

มันใช้ได้สำหรับฉัน (Ubuntu 12.04) แต่ฉันไม่เข้าใจว่ามันทำงานอย่างไร มีใครช่วยอธิบายวิธีใช้อย่างถูกต้องและใช้งานได้จริงหรือไม่? ขอบคุณ
MountainX

ต้องการทราบว่าสิ่งนี้ไม่ได้ผลสำหรับฉันในวันที่ 12.04 ที่แม่นยำ ฉันสร้างสคริปต์ทุบตีเพิ่มสิทธิ์ + x ให้กับมันและเรียกใช้ไฟล์ด้วยผลลัพธ์ต่อไปนี้ visudo: ไม่สามารถรัน / tmp / edit_sudoers: Exec format error visudo: /etc/sudoers.tmp unchanged
Jose Diaz-Gonzalez

สิ่งนี้ใช้งานได้ดีสำหรับฉันแม้ว่าฉันจะเข้าสู่ระบบในฐานะรูทและลบออกsudo -Eจากคำสั่งแรก
merlin2011

ฉันชอบคำตอบนี้มาก แต่มันไม่ได้ผลสำหรับฉัน ฉันคิดว่า sudo ของฉันไม่ได้รวบรวมด้วยค่าสถานะที่จำเป็น
Mnebuerquo

30

คุณควรแก้ไขไฟล์ชั่วคราวจากนั้นใช้ visudo -c -f sudoers.temp เพื่อยืนยันว่าการเปลี่ยนแปลงนั้นถูกต้องจากนั้นคัดลอกไปที่ด้านบนของ / etc / sudoers

#!/bin/sh
if [ -f "/etc/sudoers.tmp" ]; then
    exit 1
fi
touch /etc/sudoers.tmp
edit_sudoers /tmp/sudoers.new
visudo -c -f /tmp/sudoers.new
if [ "$?" -eq "0" ]; then
    cp /tmp/sudoers.new /etc/sudoers
fi
rm /etc/sudoers.tmp

ดูเหมือนว่าคุณกำลังใช้ sudoers.tmp เป็นไฟล์ล็อคไม่แน่ใจว่าจะยืนยันการเปลี่ยนแปลงได้อย่างไร เราควรตรวจสอบสถานะการออกของ visudo เพื่อให้แน่ใจว่าไม่มีข้อผิดพลาดหรือไม่?
converter42

/etc/sudoers.tmp คือไฟล์ล็อกที่ตรวจสอบโดย visudo ในโหมดโต้ตอบ visudo -c -f ส่งคืน 1 หากมีข้อผิดพลาดดังนั้นการตรวจสอบรหัสส่งคืน
Brian C. Lane

ฉันกังวลเกี่ยวกับการใช้ sudoers.tmp เนื่องจากดูเหมือนว่าจะใช้อินเทอร์เฟซภายในของ visudo นั่นคือการแฮ็ก เป็นมาตรฐานหมายความว่ารับประกันว่าเป็น sudoers.tmp ที่ใช้เป็นตัวล็อคเสมอหรือไม่? หรือพวกเขามีอิสระที่จะเปลี่ยนแปลงสิ่งนั้นในอนาคต?
n-alexander

2
ต้องใช้ lockfile แทน test / touch
n-alexander

2
manpage ระบุว่าใช้ /tmp/sudoers.tmp ซึ่งเป็นมาตรฐานในปัจจุบัน แน่นอนว่ามันอาจเปลี่ยนแปลงได้ในอนาคต และใช่คุณพูดถูกแล้วว่ามีสภาพการแข่งขัน
Brian C. Lane

18

ใน Debian และสารอนุพันธ์ของมันคุณสามารถแทรกสคริปต์ที่กำหนดเองลงใน/etc/sudoers.d/ไดเรกทอรีที่มีสิทธิ0440- สำหรับข้อมูลเพิ่มเติมโปรดดูที่/etc/sudoers.d/README

มันอาจช่วยได้


มันไม่ได้แสดงความคิดเห็นเหรอ?

2
@TomDworzanski: IMHO no. ดูsudoers คน (5)และอื่น ๆ อีกเพียบ
pevik

คุณถูก! ขอบคุณสำหรับลิงค์และคำตอบที่ดี

3
ฉันใช้ไดเรกทอรีนั้นใน centos 7 เช่นกัน
Alexander Bird

ฉันคิดว่านี่เป็นวิธีที่ถูกต้องที่จะทำ
jansohn

11

visudo /etc/sudoersควรจะเป็นอินเตอร์เฟซของมนุษย์สำหรับการแก้ไข คุณสามารถบรรลุสิ่งเดียวกันได้โดยการแทนที่ไฟล์โดยตรง แต่คุณต้องดูแลตัวเองเกี่ยวกับการแก้ไขพร้อมกันและการตรวจสอบไวยากรณ์ คำนึงถึงr--r-----สิทธิ์


9

หากคุณsudoอนุญาตให้เพิ่มรายการใน/etc/sudoers.dคุณสามารถใช้คำตอบนี้โดย @ dragon788:

https://superuser.com/a/1027257/26022

โดยพื้นฐานแล้วคุณvisudoจะใช้เพื่อยืนยันไฟล์ก่อนที่จะคัดลอกลงในไฟล์/etc/sudoers.dดังนั้นคุณจึงมั่นใจได้ว่าคุณจะไม่ทำลายsudoใคร

visudo -c -q -f filename

การตรวจสอบนี้ก็ประสบความสำเร็จและผลตอบแทน (0) ถ้ามันถูกต้องเพื่อให้คุณสามารถใช้กับif, &&และการดำเนินงานแบบบูสคริปต์อื่น ๆ เมื่อคุณตรวจสอบความถูกต้องแล้วให้คัดลอกลงในเครื่อง/etc/sudoers.dและควรใช้งานได้ ตรวจสอบให้แน่ใจว่าเป็นของรูทและไม่สามารถเขียนได้โดยผู้อื่น


5

ตั้งค่าตัวแก้ไขแบบกำหนดเอง โดยทั่วไปจะเป็นสคริปต์ที่ยอมรับชื่อไฟล์ (ในกรณีนี้คือ /etc/sudoers.tmp) และแก้ไขและบันทึกในตำแหน่งนั้น คุณก็เขียนลงไฟล์นั้นได้ เมื่อคุณทำเสร็จแล้วให้ออกจากสคริปต์และ visudo จะจัดการแก้ไขไฟล์ sudoers จริงให้คุณ

sudo EDITOR=/path/to/my_dummy_editor.sh visudo

ฉันถูกต้องหรือไม่ที่ dummy_editor.sh need ทั้งหมดเป็นแบบนี้ #!/bin/sh; echo "# my changes to sudoers" >> $1; exit 0ดูเหมือนว่าจะได้ผลสำหรับฉัน
MountainX

4

มีคำตอบมากมายทำงานร่วมกับ sudo สำหรับ yonks แต่ไม่จำเป็นต้องกำหนดค่าการตั้งค่าอัตโนมัติจนถึงตอนนี้ ฉันใช้คำตอบบางส่วนผสมกันโดยเขียนบรรทัด config ของฉันไปที่ /etc/sudoers.d รวมตำแหน่งดังนั้นฉันไม่ต้องแก้ไขไฟล์ sudoers หลักจากนั้นตรวจสอบไฟล์นั้นเพื่อหาไวยากรณ์ตัวอย่างง่ายๆด้านล่าง:

เขียนบรรทัดของคุณไปยังไฟล์ sudoers include:

sudo bash -c 'echo "your_user ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/99_sudo_include_file'

ตรวจสอบว่า sudoers ของคุณรวมไฟล์ผ่านการตรวจสอบไวยากรณ์ visudo แล้ว:

sudo visudo -cf /etc/sudoers.d/99_sudo_include_file

แค่เว้นเครื่องหมายดอกจันก็ไม่น่ามี ^^
Sonata

และส่งคืนความสำเร็จ (0) - รับ
Oleg

2

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

sudo EDITOR="cp /tmp/sudoers.new" visudo

เพื่อให้แน่ใจว่าไฟล์ใหม่ได้รับการตรวจสอบและติดตั้งอย่างถูกต้องด้วยการอัปเดตสิทธิ์

โปรดทราบว่าหากมีข้อผิดพลาดใน/tmp/sudoers.newไฟล์นั้นvisudoจะแจ้งให้ผู้ใช้ป้อนข้อมูลดังนั้นขอแนะนำให้ตรวจสอบvisudo -c -f /tmp/sudoers.newก่อน


1

ฉันคิดว่าวิธีแก้ปัญหาที่ตรงไปตรงมาที่สุดคือ:

สร้างสคริปต์addudoers.sh

#!/bin/sh

while [ -n "$1" ]; do
    echo "$1    ALL=(ALL:ALL) ALL" >> /etc/sudoers;
    shift # shift all parameters
done

และเรียกมันกับผู้ใช้ที่คุณต้องการเพิ่มเป็น:

root prompt> ./addsudoers.sh user1 user2

สำหรับคำอธิบายทั้งหมดดูคำตอบนี้: การเพิ่มผู้ใช้ไปยัง sudoers ผ่านเชลล์สคริปต์

ความนับถือ!


0

พยายามที่จะสะท้อนมัน คุณต้องเรียกใช้ใน subshell แม้ว่า ตัวอย่าง:

sudo sh -c "echo \"group ALL=(user) NOPASSWD: ALL\" >> /etc/sudoers"


-2

สิ่งนี้ได้ผลสำหรับฉันโดยอิงจากสิ่งที่คนอื่นโพสต์ที่นี่ เมื่อฉันใช้สคริปต์คนอื่นมันจะเปิด visudo ให้ฉัน แต่จะไม่ทำการแก้ไข สิ่งนี้ทำให้ฉันต้องแก้ไขเพื่อให้ผู้ใช้ทั้งหมดรวมถึงผู้ใช้มาตรฐานติดตั้ง java 7u17 สำหรับซาฟารี / firefox

#!/usr/bin/env bash
rm /etc/sudoers.new
cp /etc/sudoers /etc/sudoers.new
echo "%everyone   ALL = NOPASSWD: /usr/sbin/installer -pkg /Volumes/Java 7 Update 17/Java 7 Update 17.pkg -target /" >> /etc/sudoers.new
cp /etc/sudoers.new /etc/sudoers

สิ่งนี้เพิ่ม% ทุกคน blah blah blah ที่ด้านล่างของไฟล์ sudoers ฉันต้องเรียกใช้สคริปต์เช่นนี้

sudo sh sudoersedit.sh

ขอให้โชคดี: D

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