วิธีการรันโปรแกรมเฉพาะในฐานะรูทโดยไม่ต้องใส่รหัสผ่าน?


169

ฉันจำเป็นต้องเรียกใช้บางสิ่งบางอย่างเป็น sudo โดยไม่ต้องใช้รหัสผ่านดังนั้นฉันจึงใช้visudoและเพิ่มลงในsudoersไฟล์ของฉัน:

MYUSERNAME ALL = NOPASSWD: /path/to/my/program

จากนั้นฉันก็ลองดู:

$ sudo /path/to/my/program
[sudo] password for MYUSERNAME: 

ทำไมถึงถามรหัสผ่าน? ฉันจะรัน / ใช้คำสั่งในฐานะรูทกับผู้ใช้ที่ไม่ใช่รูทโดยไม่ต้องขอรหัสผ่านได้อย่างไร

คำตอบ:


91

คุณมีรายการอื่นในsudoersไฟล์ที่ตรงกับผู้ใช้ของคุณ NOPASSWDกฎจะต้องหลังจากที่หนึ่งในเพื่อให้มันมีความสำคัญ

หลังจากทำเช่นนั้นแล้วsudoจะถามรหัสผ่านตามปกติสำหรับคำสั่งทั้งหมดยกเว้น/path/to/my/programซึ่งจะช่วยให้คุณสามารถทำงานได้โดยไม่ต้องขอรหัสผ่าน


6
สิ่งนี้จะยังคงใช้งาน/path/to/my/programได้หรือไม่หากเป็นสคริปต์ไพ ธ อน
sadmicrowave

สามารถโปรแกรมแทนที่จะเป็นนามแฝงที่กำหนดไว้สำหรับทุบตี (เช่นใน.bashrc)? หรือแม้แต่เปลือกสคริปต์ภายใน/usr/local/sbin? เพื่อลอง
Nikos Alexandris

Nikos - ไม่เป็นชื่อแทนไม่ได้ มันจะต้องชี้ไปยังเส้นทางที่แท้จริง
Paul Hedderly

sudoers? อยู่ไหน? ขอให้ใช้คำตอบของคุณ (
Vasilii Suricov

@ VasiliiSuricov: มันมักจะอยู่ใน/etcแต่บางระบบก็วางไว้ที่อื่น man sudoersหากคุณไม่สามารถหาได้ลอง ตำแหน่งโลคัลสำหรับไฟล์นั้นควรถูกแทนที่ในmanหน้าในเวลาที่sudoถูกสร้างสำหรับระบบนั้น
Warren Young

135

หากมีรายการที่ตรงกันหลายรายการใน/etc/sudoerssudo ใช้รายการสุดท้าย ดังนั้นหากคุณสามารถดำเนินการคำสั่งใด ๆ ด้วยการแจ้งให้รหัสผ่านและคุณต้องการที่จะสามารถดำเนินการคำสั่งเฉพาะโดยไม่ต้องแจ้งให้รหัสผ่านที่คุณต้องการข้อยกเว้นที่ผ่านมา

myusername ALL = (ALL) ALL
myusername ALL = (root) NOPASSWD: /path/to/my/program

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

หมายเหตุสำหรับผู้อ่านที่ไม่ได้ใช้งาน Ubuntu หรือเปลี่ยนการตั้งค่า sudo เป็นค่าเริ่มต้น (sudo ของ Ubuntu นั้นใช้ได้โดยค่าเริ่มต้น) : การเรียกใช้สคริปต์เชลล์ที่มีสิทธิ์ในการยกระดับมีความเสี่ยงคุณต้องเริ่มจากสภาพแวดล้อมที่สะอาด มันสายเกินไป (ดูที่อนุญาตให้ setuid บนเชลล์สคริปต์ ) ดังนั้นคุณต้องใช้ sudo เพื่อดูแลสิ่งนั้น) ตรวจสอบให้แน่ใจว่าคุณมีDefaults env_resetใน/etc/sudoersหรือว่าตัวเลือกนี้เป็นค่าเริ่มต้นเวลารวบรวม ( sudo sudo -V | grep envควรมีReset the environment to a default set of variables)


3
ex to go root จาก jhon ด้วย sudo su an no pass -----> john ALL = (ALL) NOPASSWD: / bin / su
bortunac

5
@adrian หากคุณต้องการอนุญาตให้รูทคำสั่งเป็นรูทให้ทำjohn ALL=(ALL) NOPASSWD: allเช่นนั้น ไม่มีจุดผ่านไปsuได้
Gilles

คำถาม: ฉันควรเปลี่ยนสิทธิ์ของเชลล์สคริปต์ของฉันเพื่อให้สามารถแก้ไขและอ่านโดยผู้ใช้รูทเท่านั้นเพื่อความปลอดภัยหรือไม่ ฉันกำลังคิดเกี่ยวกับผู้โจมตีที่ปรับเปลี่ยนสคริปต์ซึ่งมีสิทธิ์ทั้งหมดที่ได้รับโดยไม่ต้องใช้รหัสผ่านเพื่อให้เป็นไปตามที่เขา / เธอต้องการ เห็นได้ชัดว่าผู้โจมตีไม่สามารถแม้แต่จะอ่านไฟล์ sudoers เพื่อรู้ว่าสคริปต์ใดที่มีสิทธิ์นี้ แต่ยังสามารถลองกับสคริปต์ที่กำหนดเองทั้งหมดของฉันได้เมื่อเขา / เธอพบโฟลเดอร์ที่เก็บไว้ด้วยความหวังว่าจะอนุญาตบางอย่างหรืออะไรทำนองนั้น .
Jeffrey Lebowski

1
@JeffreyLebowski หากคุณมีกฎ sudo ที่เรียกใช้สคริปต์ (ไม่ว่าโดยตรงหรือโดยอ้อม) คุณจำเป็นต้องรูทเท่านั้น (หรือผู้ที่มีสิทธิ์ใช้งานรูทอยู่แล้ว) สามารถเขียนไปยังไฟล์สคริปต์และไดเรกทอรีที่มีไฟล์สคริปต์และ ไดเรกทอรีหลักของมันและอื่น ๆ ไม่สำคัญว่าทุกคนสามารถอ่านไฟล์สคริปต์ได้ (เว้นแต่จะมีรหัสผ่านหรือบางอย่าง แต่เป็นความคิดที่ดีถ้ามีรหัสผ่านควรอยู่ในไฟล์ของตัวเองมิฉะนั้นจะมีความเสี่ยงจากการรั่วไหลโดยไม่ตั้งใจเช่น คัดลอกวางส่วนของรหัสในคำถามในเว็บไซต์นี้)
Gilles

1
@alper ไม่มากมีบางสิ่งที่จำเป็นต้องรีบูตเครื่อง หลังจากเปลี่ยนsudoersแล้วคุณไม่จำเป็นต้องทำอะไรเป็นพิเศษ: sudoตรวจสอบทุกครั้ง
Gilles

24

คำเตือน : คำตอบนี้ถือว่าไม่ปลอดภัย ดูความคิดเห็นด้านล่าง

โซลูชันที่สมบูรณ์:ขั้นตอนต่อไปนี้จะช่วยให้คุณได้ผลลัพธ์ที่ต้องการ:

  1. สร้างไฟล์สคริปต์ใหม่ (แทนที่create_dir.shด้วยชื่อสคริปต์ที่คุณต้องการ):

    vim ~/create_dir.sh
    

    สคริปต์จะถูกสร้างขึ้นในไดเรกทอรีบ้านของผู้ใช้

  2. เพิ่มคำสั่งบางอย่างที่ผู้ใช้rootหรือsudoผู้ใช้เท่านั้นที่สามารถดำเนินการได้เช่นการสร้างโฟลเดอร์ที่ระดับไดเรกทอรีราก:

    mkdir /abc
    

    หมายเหตุ:อย่าเพิ่มsudoคำสั่งเหล่านี้ บันทึกและออก (โดยใช้:wq!)

  3. กำหนดสิทธิ์ดำเนินการให้กับมันโดยใช้:

    sudo chmod u+x create_dir.sh
    
  4. ทำการเปลี่ยนแปลงเพื่อให้สคริปต์นี้ไม่ต้องใช้รหัสผ่าน

    1. เปิดsudoersไฟล์:

      sudo visudo -f /etc/sudoers
      
    2. เพิ่มบรรทัดต่อไปนี้ในตอนท้าย:

      ahmad ALL=(root) NOPASSWD: /home/ahmad/create_dir.sh
      

      แทนที่ahmadด้วยชื่อผู้ใช้ของคุณ ตรวจสอบให้แน่ใจว่านี่เป็นบรรทัดสุดท้าย บันทึกและออก.

  5. ตอนนี้เมื่อรันคำสั่งเพิ่มsudoก่อนหน้าเช่น:

    sudo ./create_dir.sh
    

    สิ่งนี้จะรันคำสั่งภายในไฟล์สคริปต์โดยไม่ต้องขอรหัสผ่าน

ทำตามขั้นตอนง่าย ๆ ที่กล่าวถึงที่นี่http://step4wd.com/2013/09/14/run-root-commands-in-linux-ubuntu-without-password/


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

15
คำแนะนำนี้ไม่ปลอดภัย sudoส่วนหนึ่งของsudo chmod u+x create_dir.shที่ไม่จำเป็นที่ผู้ใช้มี (สมมุติ) กรรมสิทธิ์เหนือ / dir บ้านของเขาและเธอ เนื่องจากผู้ใช้สามารถเขียนถึงcreate_dir.shคุณได้ให้รูทเชลล์ฟรีแก่ผู้ใช้นั้นอย่างมีประสิทธิภาพ
Lekensteyn

1
@Lekensteyn ซึ่งหมายถึงโปรแกรมใด ๆ ที่ทำงานในฐานะผู้ใช้ อาจอนุญาตให้ผู้ใช้เรียกใช้สิ่งใดด้วย sudo โดยไม่ต้องใช้รหัสผ่าน
pydsigner

2
ฉันพลาดอะไรไปรึเปล่า? ฉันเชื่อว่าทั้งหมดchmodนั้นไม่จำเป็นเนื่องจากคุณต้องพึ่งพาsudoเพื่อยกระดับสิทธิ์ของคุณ
G-Man

10

ฉันคิดว่าไวยากรณ์ของคุณผิด อย่างน้อยฉันก็ใช้สิ่งต่อไปนี้ที่ใช้ได้กับฉัน:

myusername ALL=(ALL) NOPASSWD: /path/to/executable

6
ชิ้น(ALL)ส่วนนั้นเป็นทางเลือกโดยไม่ส่งผลใด ๆ มี(root)จะดีกว่าว่า แต่ไม่มีตัวตนไม่ได้อธิบายปัญหา
Gilles

+1 สำหรับ sudo สำหรับคำสั่งนี้และไม่มีอะไรอื่น! ไม่มีเหตุผลที่จะทำลายทั้งระบบ ...
โจฮาน

3
@Johan: นั่นมีอยู่แล้วในคำถาม
Gilles

5

หากคุณต้องการหลีกเลี่ยงการใช้ sudo และไม่ต้องเปลี่ยนไฟล์ sudoers config คุณสามารถใช้:

sudo chown root:root path/to/command/COMMAND_NAME
sudo chmod 4775 path/to/command/COMMAND_NAME

สิ่งนี้จะทำให้คำสั่งรันเป็นรูทโดยไม่จำเป็นต้องใช้ sudo


ว้าวผมไม่เคยได้ยินของการแก้ปัญหานี้มาก่อนเชื่อได้ใจ
somethingSomething

ทำไมฉันต้องเลื่อนไปที่ด้านล่างของสิ่งเหล่านี้เพื่อค้นหาคำตอบที่ดีที่สุด ขอบคุณสำหรับโซลูชันความปลอดภัยที่เรียบง่ายนี้
RyanNerd

5

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

ไฟล์นี้คือ:

sudo cat /etc/sudoers.d/10-installer

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

ในไฟล์ที่คุณเลือกคุณสามารถเพิ่มบรรทัดต่อไปนี้เพื่อรับการกำหนดค่าที่คุณต้องการ:

ละเว้นการรับรองความถูกต้องสำหรับกลุ่ม

%group ALL=(ALL) NOPASSWD: ALL

หรือละเว้นการรับรองความถูกต้องสำหรับผู้ใช้

youruser ALL=(ALL) NOPASSWD: ALL

หรือละเว้นการรับรองความถูกต้องที่สามารถเรียกใช้งานได้สำหรับผู้ใช้ที่ระบุ

youruser ALL=(ALL) NOPASSWD: /path/to/executable

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


4

ตรวจสอบว่า sudo ไม่ได้ใช้นามแฝง ทำงานแบบนี้

/usr/bin/sudo /path/to/my/program

ตัวอย่างเช่นนามแฝงของเชลล์เช่นนี้:

alias sudo="sudo env PATH=$PATH"

อาจทำให้เกิดพฤติกรรมนี้


คุณพูดถูกความคิดเห็นของฉันไม่ดีที่นี่ขอโทษสำหรับสิ่งนั้น อย่างไรก็ตามฉันรู้สึกทึ่ง - คุณคาดหวังว่าการเปลี่ยนนามแฝงจะเปลี่ยนกระบวนการของsudoerssudo อย่างไร หรือคุณกำลังพูดถึงการเปลี่ยนเส้นทางsudoไปยังบางสิ่งที่พิมพ์ข้อความแสดงข้อผิดพลาดนี้เพื่อตักรหัสผ่านอยู่เสมอ ไม่น่าเป็นไปได้ที่นี่ ...
เตอร์

2
ฉันมีปัญหาเช่นเดียวกับ OP มันเปิดออกมาอาจเกิดจากมีในของฉันalias sudo="sudo env PATH=$PATH" ~/.bashrcแทนที่จะแก้ปัญหาด้วยตัวเองและทำธุรกิจของตัวเองแบบสุ่มสี่สุ่มห้าฉันส่งคำตอบเพื่อเป็นคำตอบสำหรับคนอื่น ๆ ที่เข้ามาในกระทู้นี้
Sepero

1
ไม่เป็นไร แต่เมื่อมันไม่ชัดเจน (ซึ่งในกรณีนี้ไม่ใช่อย่างน้อยสำหรับบางคน) เป็นการดีที่จะอธิบายคำตอบเพื่อให้บริบทและป้องกันไม่ให้ผู้อื่นใช้เวทมนตร์คาถา +2 (- (- - 1) + +1) :)
เตอร์

2

sudo /path/to/my/scriptเมื่อคุณรันสคริปต์ของคุณคุณจำเป็นต้องเรียกว่ามันเป็น

แก้ไข:จากความคิดเห็นของคุณเป็นคำตอบอื่นคุณต้องการเรียกใช้จากไอคอน คุณจะต้องสร้าง.desktopไฟล์ที่เรียกใช้งานโปรแกรมของคุณด้วย sudo เหมือนกับที่เทอร์มินัล

คุณสามารถลองใช้gtk-sudoรหัสผ่านแบบเห็นภาพได้

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


7
อย่าทำให้เชลล์สคริปต์ setuid ดูอนุญาตให้ setuid ในเชลล์สคริปต์
Gilles

ฉันคิดว่าไม่พูดถึงมันเพราะมันเป็นตัวเลือกที่ไม่ดี ฉันเพิ่งลบไปเพราะฉันกังวลว่าผู้ถามรายนี้อาจใช้คำแนะนำแม้จะมีคำเตือนว่าเป็นคำแนะนำที่ไม่ดี!
Caleb

2

วิธีนี้แก้ไขปัญหาสำหรับฉัน (ลองคำตอบอื่น ๆ ซึ่งอาจช่วยได้):

สคริปต์ที่ฉันเรียกนั้นอยู่ใน/usr/binไดเรกทอรีที่ฉันไม่มีสิทธิ์เขียน (แม้ว่าโดยปกติฉันจะสามารถอ่านไฟล์ใด ๆ ที่นั่น) สคริปต์ถูก chmodded + x (อนุญาตให้ใช้งานได้) แต่ก็ยังใช้งานไม่ได้ การย้ายไฟล์นี้ไปยังพา ธ ในโฮมไดเร็กตอรี่ของฉัน, แทน/usr/bin, ในที่สุดฉันก็สามารถเรียกมันด้วย sudo โดยไม่ต้องป้อนรหัสผ่าน.

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


ย่อหน้าที่สองมีคำตอบสำหรับปัญหาของฉัน
M. Ahmad Zafar

@MuhammadAhmadZafar ดีใจที่ได้ช่วย!
Luc

4
การใช้งานจริงsudoภายในของสคริปต์นั้นสมบูรณ์แบบหากคุณมีสิทธิ์ที่เหมาะสมในsudoersการรันคำสั่งโดยไม่ต้องใช้รหัสผ่าน มันทำให้สิ่งต่าง ๆ มีความปลอดภัยมากขึ้น
เตอร์

จริงๆสามารถใช้คำตอบนี้เขียนใหม่เป็นขั้นตอน 'นี่คือวิธีที่คุณทำมัน' มากกว่าเป็นบทสนทนากับคำตอบอื่น ๆ
Walrus the Cat

@WalrustheCat จุดที่ดี อ่านคำตอบของฉันอีกครั้งฉันคิดว่าฉันอาจสับสนนิดหน่อย แม้ว่าตอนนี้ฉันจำไม่ได้ว่าสถานการณ์ที่แน่นอนคืออะไรฉันจึงไม่สามารถเขียนได้ดีขึ้น หากคุณคิดออกมาอาจจะเป็นการรวมกันของคำตอบหลาย ๆ อย่างโดยทั้งหมดส่งคำตอบใหม่!
Luc

1

ความเป็นไปได้อีกอย่างหนึ่งคือการติดตั้งกำหนดค่าจากนั้นใช้คำสั่งsuperเพื่อเรียกใช้สคริปต์ของคุณ

super /path/to/your/script

หากคุณต้องการที่จะทำงานบางไบนารีปฏิบัติการ (เช่นที่คุณได้เรียบเรียงเป็นเอลฟ์ไบนารีจากซอร์สโค้ด C บางคน) -which คือไม่ script- เป็นรากคุณอาจพิจารณาการทำมันsetuid (และที่จริง/bin/login, /usr/bin/sudoและ/bin/suและsuperทั้งหมดใช้เทคนิคที่ ) อย่างไรก็ตามระวังให้ดีคุณสามารถเปิดช่องโหว่ขนาดใหญ่ได้

โปรแกรมของคุณควรเขียนโปรแกรมแบบ Paranoically (ดังนั้นให้ตรวจสอบข้อโต้แย้งทั้งหมดและสภาพแวดล้อมและเงื่อนไขภายนอกก่อนที่ "ทำหน้าที่" โดยถือว่าเป็นผู้ใช้ที่อาจเป็นปฏิปักษ์) จากนั้นคุณสามารถใช้seteuid (2)และเพื่อน ๆ (ดูsetreuid (2) ) อย่างระมัดระวัง (ดูเพิ่มเติมที่ความสามารถ (7) & ข้อมูลรับรอง (7) & execve (2) ... )

คุณจะใช้chmod u+s(อ่านchmod (1) ) เมื่อติดตั้งไบนารีดังกล่าว

แต่ต้องระวังให้มาก

อ่านสิ่งต่าง ๆ เกี่ยวกับsetuidรวมถึงการเขียนโปรแกรม Linux ขั้นสูงก่อนเขียนโค้ดดังกล่าว

ขอให้สังเกตว่าสคริปต์หรือใด ๆshebangสิ่ง -ed ไม่สามารถ setuid แต่คุณสามารถเขียนโค้ด (ใน C) setuid-binary ขนาดเล็กได้


0

เป็นการดีถ้าคุณกำลังปรับแต่งคำสั่งที่สามารถเรียกใช้ผ่านsudoคุณควรทำการเปลี่ยนแปลงเหล่านี้ในไฟล์แยกต่างหากภายใต้/etc/sudoers.d/แทนการแก้ไขsudoersไฟล์โดยตรง คุณควรใช้visudoเพื่อแก้ไขไฟล์เสมอ คุณไม่ควรให้NOPASSWDในALLคำสั่ง

ตัวอย่าง: sudo visudo -f /etc/sudoers.d/mynotriskycommand

แทรกการอนุญาตให้ใช้สายของคุณ: myuser ALL= NOPASSWD: /path/to/your/program

จากนั้นบันทึกและออกและvisudoจะเตือนคุณหากคุณมีข้อผิดพลาดทางไวยากรณ์

คุณสามารถเรียกใช้sudo -lเพื่อดูสิทธิ์ที่ผู้ใช้ของคุณได้รับหากNOPASSWDคำสั่งใด ๆ ของผู้ใช้ปรากฏขึ้นก่อน%groupyouarein ALL=(ALL) ALLคำสั่งใด ๆในผลลัพธ์ที่คุณจะได้รับพร้อมท์สำหรับรหัสผ่านของคุณ

หากคุณพบว่าคุณสร้างไฟล์ sudoers.d เหล่านี้จำนวนมากคุณอาจต้องการสร้างชื่อต่อผู้ใช้เพื่อให้มองเห็นได้ง่ายขึ้น โปรดทราบว่าการเรียงลำดับชื่อไฟล์และกฎภายในไฟล์นั้นมีความสำคัญอย่างยิ่งการโหลดล่าสุดหนึ่งรายการชนะไม่ว่าจะเป็นมากกว่าหรือน้อยกว่ารายการก่อนหน้า

คุณสามารถควบคุมการเรียงลำดับชื่อไฟล์โดยใช้คำนำหน้าเป็น 00-99 หรือ aa / bb / cc แต่โปรดจำไว้ว่าหากคุณมีไฟล์ใด ๆ ที่ไม่มีคำนำหน้าเป็นตัวเลขพวกเขาจะโหลดหลังจากไฟล์ที่มีหมายเลขกำกับ การตั้งค่า นี่เป็นเพราะขึ้นอยู่กับการตั้งค่าภาษาของคุณ "การเรียงคำศัพท์" เชลล์ใช้หมายเลขเรียงลำดับก่อนแล้วจึงอาจแทรกส่วนบนและส่วนล่างเมื่อเรียงลำดับ "เรียงจากน้อยไปมาก"

ลองใช้printf '%s\n' {{0..99},{A-Z},{a-z}} | sortและprintf '%s\n' {{0..99},{A-Z},{a-z}} | LANG=C sortเพื่อดูว่าพิมพ์ภาษาปัจจุบันของคุณAaBbCcฯลฯ หรือABCแล้วabcเพื่อตรวจสอบสิ่งที่ดีที่สุด "ล่าสุด" คำนำหน้าตัวอักษรที่จะใช้จะเป็น


0

เพื่อให้ผู้ใช้สามารถรันโปรแกรมเป็น sudo โดยไม่ต้องถามรหัสผ่านคุณสามารถเพิ่มบรรทัดต่อไปนี้

%sudo ALL=(root) NOPASSWD: /path/to/your/program

ใน /etc/sudoers

โปรดทราบว่า% sudoสร้างมันขึ้นมา


ในขณะที่เป็นวิธีหนึ่งในการทำกฎ sudo ให้สำเร็จ แต่ก็ไม่ได้ตอบคำถามว่าทำไมการตั้งค่าสถานะ NOPASSWD ในกฎนี้จึงยังส่งผลให้มีการถามรหัสผ่าน ดูคำตอบที่ยอมรับสำหรับความคิดว่าทำไมมันเกิดขึ้น
Jeff Schaller

0

ต่อไปนี้จะเป็นกรณีที่คุณต้องการที่จะเรียกใช้คำสั่งโดยไม่ต้องใช้รหัสผ่านเท่านั้นถ้ามันมีเฉพาะชุดของตัวเลือกที่เป็นส่วนหนึ่งในตัวเลือกที่เป็นตัวแปร AFAIK ไม่สามารถใช้ตัวแปรหรือช่วงค่าในการประกาศ sudoers เช่นคุณสามารถอนุญาตการเข้าถึงอย่างชัดเจนcommand option1แต่ไม่ได้command option2ใช้:

user_name ALL=(root) /usr/bin/command option1

แต่ถ้าโครงสร้างcommand option1 value1ที่value1สามารถแตกต่างกันคุณจะต้องมีอย่างชัดเจน sudoers value1สายสำหรับแต่ละค่าเป็นไปได้ของ เชลล์สคริปต์ให้วิธีแก้ไข

คำตอบนี้ได้แรงบันดาลใจจากคำตอบของ M. Ahmad Zafar และแก้ไขปัญหาความปลอดภัยที่นั่น

  1. sudoสร้างเชลล์สคริปต์ที่คุณโทรสั่งได้โดยไม่ต้อง
  2. บันทึกสคริปต์ในโฟลเดอร์ที่มีสิทธิ์ใช้งานรูท (เช่น/usr/local/bin/) สร้างไฟล์ให้เป็นเจ้าของรูท (เช่นchown root:wheel /usr/local/bin/script_name) โดยไม่มีสิทธิ์การเขียนสำหรับผู้อื่น (เช่นchmod 755 /usr/local/bin/script_name)
  3. เพิ่มข้อยกเว้นให้กับ sudoers โดยใช้ visudo:

    user_name ALL=(root) NOPASSWD: /usr/local/bin/script_name.

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