ถ้าฉัน sudo เรียกใช้ไฟล์สคริปต์ Bash คำสั่งทั้งหมดภายในสคริปต์ Bash จะถูกเรียกใช้งานเป็น sudo ด้วยหรือไม่


30

ฉันต้องการเขียนสคริปต์หลังการติดตั้งอัตโนมัติใน Bash ( post-install.shเช่นชื่อ) สคริปต์จะเพิ่มและอัปเดตที่เก็บติดตั้งและอัพเดทแพ็คเกจโดยอัตโนมัติแก้ไขไฟล์กำหนดค่า ฯลฯ

ตอนนี้ถ้าฉันรันสคริปต์นี้เช่นsudo post-install.shฉันจะได้รับแจ้งให้ป้อนsudoรหัสผ่านครั้งเดียวเท่านั้นหรือฉันจะต้องป้อนsudoรหัสผ่านในแต่ละการเรียกใช้คำสั่งภายในสคริปต์ซึ่งต้องsudoได้รับอนุญาตหรือไม่ กล่าวอีกนัยหนึ่งคำสั่งภายในสคริปต์ทุบตี 'สืบทอด' สิทธิ์การดำเนินการดังนั้นจะพูดหรือไม่

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


4
คุณอาจสนใจลองใช้เครื่องมือที่ออกแบบมาสำหรับงานนี้โดยเฉพาะ 3 คนทั่วไปคือ: หุ่นเชพเชฟและคนโบราณ
spuder

@spuder และสำหรับสถาปัตยกรรมระดับองค์กรขนาดใหญ่และความปลอดภัยของการจัดการการกำหนดค่าของคุณคุณสามารถใช้ CFEngine 3 (ไม่เหมาะสำหรับคนใจร้อนหรือคำสั่งแบบใช้ครั้งเดียว)
Wildcard

คำตอบ:


38

Q # 1:ฉันจะได้รับพร้อมท์สำหรับรหัสผ่าน sudo เพียงครั้งเดียวหรือฉันจะต้องป้อนรหัสผ่าน sudo ในแต่ละการเรียกใช้คำสั่งภายในสคริปต์ซึ่งต้องได้รับอนุญาตจาก sudo หรือไม่

ใช่หนึ่งครั้งตลอดระยะเวลาการทำงานของสคริปต์ของคุณ

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

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

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

ตัดตอนมาจากหน้าคน sudo

ข้อ จำกัด นี้เป็นนโยบายเฉพาะ การหมดเวลาของรหัสผ่านที่เป็นค่าเริ่มต้นสำหรับนโยบายความปลอดภัยของ sudoers คือ 5 นาที


1
คำตอบสำหรับไตรมาสที่ 1 คือ "ไม่คุณจะไม่ได้รับแจ้งอีก"
dannysauer

@dannysauer - อ่านคำถามของเขาอีกครั้ง ฉันกำลังบอกว่าใช่จะได้รับพร้อมท์สำหรับรหัสผ่านเพียงครั้งเดียว!
slm

คำถามบอกว่า "มันคือหรือ b" และเพียงแค่พูดว่า "ใช่" ไม่ได้ทำให้ชัดเจนถ้ามันเป็น "ใช่," หรือ "ใช่, b" เพียงแค่พยายามอธิบายสิ่งต่าง ๆ สำหรับผู้อ่านในอนาคต : D
dannysauer

@dannysauer - ดูการอัปเดต
slm

1
คำถามใหม่นี้จะเป็นนี้: stackoverflow.com/questions/3522341/... sudo -u $(logname) <command>ควรทำงาน.
Gauthier

17

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

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


3

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

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

หากsudo'เซสชัน' หมดอายุในระหว่างสคริปต์ผู้ใช้จะถูกถามรหัสผ่านในครั้งถัดไปที่คุณออกคำสั่ง sudo ในสคริปต์


1
บอกว่าหนึ่งในขั้นตอนของสคริปต์คือการสร้างเคอร์เนล linux ใหม่ทั้งหมดซึ่งอาจใช้เวลาสองชั่วโมง การรักษาเซสชันให้มีชีวิตอยู่อาจเป็นเรื่องท้าทายคุณจะจัดการกับเรื่องนั้นอย่างไร
Gauthier

คุณทำไม่ได้ แต่ครั้งต่อไปที่คุณโทรsudo -vมันจะขอรหัสผ่านจากผู้ใช้อีกครั้ง ไม่ใช่ปัญหาที่แย่ที่สุดในความคิดของฉัน อาจเป็นประโยชน์ทำให้ผู้ใช้ตระหนักถึงกลไกที่อาจเป็นประโยชน์
alexrussell

การผกผันของสิ่งนี้คือต้องการให้ผู้ใช้เรียกใช้สคริปต์ด้วย sudo ต่อคำตอบอื่น ๆ จากนั้นจึงsudo -u $SUDO_USERทำให้คำสั่งที่ไม่ใช่รูททั้งหมดต้องการคำสั่งที่ไม่ได้รับการยกระดับ น่าเศร้าที่มันเพิ่มรหัสเพิ่มเติม แต่เป็นวิธีเดียวที่เชื่อถือได้ในการดำเนินการสิ่งต่าง ๆ ในกระบวนการทำงานที่ยาวนาน
dragon788

ฉันเดาฉันควรชี้แจงวิธีอื่นในการทำเช่นนี้คือการเรียก sudo ครั้งแรกที่จุดเริ่มต้นของสคริปต์ที่จะนำไฟล์ชั่วคราวไป/etc/sudoers.dใช้visudo -c -f /tmp/tempsudoersเพื่อให้แน่ใจว่าไฟล์นั้นถูกต้องก่อนที่จะคัดลอกลงในสถานที่แล้วลบไฟล์นั้นเมื่อเสร็จแล้ว (ใช้กับดักที่ทางออก / ข้อผิดพลาดเพื่อให้แน่ใจว่าจะไม่ถูกละเมิดเพิ่มขึ้น) การใช้งานที่ปลอดภัยที่สุดจะช่วยให้ผู้ใช้ของคุณสามารถเรียกใช้คำสั่งเฉพาะในสคริปต์ของคุณด้วยข้อโต้แย้งที่เฉพาะเจาะจงโดยไม่ต้องใช้รหัสผ่านNOPASSWDโดยการจัดเก็บแต่ละคำสั่ง / ข้อโต้แย้งลงในอาร์เรย์เพื่อสร้างไฟล์
dragon788

ค่อนข้างช้ามาที่ @Gauthier ที่นี่ แต่ดูเหมือนว่าฉันผิดเมื่อฉันบอกว่าคุณไม่สามารถรักษาsudoเซสชันเอาไว้ได้หากงานเดี่ยวที่กำหนดใช้เวลานานกว่าการหมดเวลา ฉันเจอเทคนิคนี้เมื่อวันก่อนใน repos dotfiles ของ Mathias Bynens: while true; do sudo -n true; sleep 60; kill -0 "$$" || exit; done 2>/dev/null &- github.com/mathiasbynens/dotfiles/blob/master/.macos#L13
alexrussell
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.