อะไรคือจุดประสงค์ของ“ ความจริง” ใน bash“ ถ้า sudo จริง แล้ว”


20

ฉันแฮ็กสคริปสคริปต์นี้พร้อมกันซึ่งทดสอบว่าผู้ใช้มีสิทธิ์พิเศษของผู้ใช้ระดับสูงหรือไม่ ในที่สุดฉันกำลังพยายามกลับคำสั่ง 'ถ้า' ที่สองเพื่อให้ฉันสามารถลบสองบรรทัดต่อไปนี้ (echo "รหัสผ่าน ok" และอื่น ๆ ในบรรทัดต่อไปนี้)

# Root user only
if [[ "$EUID" != 0 ]]; then
    sudo -k # make sure to ask for password on next sudo
    if sudo true; then
        echo "Password ok"
    else
        echo "Aborting script"
        exit 1
    fi
fi

echo "do my ops"

จุดประสงค์ของ "ความจริง" ในบรรทัดที่สี่เป็นเพียงคำสั่งที่เป็นโมฆะหรือไม่?

ฉันต้องคว่ำการทดสอบในบรรทัดที่สี่ฉันจะทำอย่างไร นี่คือสิ่งที่ฉันได้ลอง:

if sudo false; then  
if sudo true == false; then
if [!(sudo true)]; then

2
หากคุณกำลังจะลงคะแนนคำถามโปรดช่วยอธิบายสิ่งที่ฉันสามารถทำได้เพื่อปรับปรุงคำถาม? นี่ไม่ใช่ไซต์ล้นที่เหมาะสมใช่ไหม
Matt Parkins

4
ไม่แน่ใจว่า downvotes มาจากไหน คุณพยายามที่จะปฏิเสธคำสั่งหรือลบล้างคำสั่ง? คุณบอกว่าคุณต้องการกำจัดทั้งจริง / echo และ "else" ดังนั้นวัตถุประสงค์สุดท้ายของคุณคืออะไร?
Jeff Schaller


1
@ ctrl-alt-delor ลิงค์ต่อไปนี้ดูเหมือนว่าทั้งหมดที่ฉันต้องทำคือใส่เครื่องหมายอัศเจรีย์หน้า sudo แล้วฉันสามารถลบทั้งเสียงก้องและสิ่งอื่นและตอนนี้ฉันได้ทดสอบแล้วมันใช้งานได้แล้วขอบคุณ
Matt Parkins

2
ในการผ่านคุณอาจเปลี่ยนเส้นทางข้อความแสดงข้อผิดพลาดไปยังสตรีมข้อผิดพลาด:echo "Aborting script" >&2
Toby Speight

คำตอบ:


38

trueใน bash ไม่ใช่คำหลัก แต่เป็นโปรแกรมที่ออกโดยใช้รหัสทางออกที่ประสบความสำเร็จในทันที ในทำนองเดียวกันfalseเป็นโปรแกรมที่ออกด้วยรหัสออกไม่สำเร็จ

คุณสามารถลองใช้งานได้โดยการเรียกใช้โปรแกรมทั้งสองจากเครื่องเทอร์มินัลแล้วอ่าน$?ตัวแปรซึ่งมีรหัสทางออกของโปรแกรมสุดท้าย

true
echo $? # 0
false
echo $? #1

if sudo trueif sudo == trueจะไม่เทียบเท่ากับ if sudo trueกำลังเรียกใช้trueโปรแกรมโดยใช้sudoและตรวจสอบรหัสออก

ดังนั้น:

if sudo false; thenกำลังเรียกใช้โปรแกรมfalseเป็น sudo ผลตอบแทนจะเป็นเท็จเสมอ

if sudo true == falseจะเรียกใช้โปรแกรมtrueที่มีการขัดแย้ง==และการใช้false sudoเห็นได้ชัดว่าไม่ต้องการให้คุณตั้งใจ

if [!(sudo true)] เป็นไวยากรณ์ที่ไม่ถูกต้อง

สิ่งที่คุณกำลังมองหาคือ

if ! sudo true;

12
ในฐานะที่เป็นความรู้การแก้ไขเล็กน้อยเป็นประโยคแรก: ในทุบตี , trueและfalseเป็น "builtins" คำสั่งตีความโดยตรงจากเปลือก; ในระบบที่เหมือน Unix โดยทั่วไปพวกมันยังมีอยู่เป็นโปรแกรมแบบสแตนด์อโลนในระบบไฟล์ ความแตกต่างนั้นไม่สำคัญที่นี่ แต่เท่าที่ฉันรู้sudo trueจะใช้โปรแกรมสแตนด์อโลนไม่ใช่ bash builtin
IMSoP

31
PS: บทสรุปที่ฉันโปรดปรานtrueและfalseเป็นชื่อในหน้าคนของพวกเขาtrue - do nothing, successfullyและfalse - do nothing, unsuccessfully
IMSoP

3
@IMSoP มันลึก
brainplot

2
หากtrueไม่มีอยู่รหัสในคำถามจะแสดงว่าเพราะเหตุใดจึงต้องคิดค้นมันขึ้นมา! มันเป็นโปรแกรมขั้นต่ำที่สามารถล้มเหลวได้ก็ต่อเมื่อระบบที่เปิดอยู่นั้นทำงานหนักมาก ดังนั้นหนึ่งสามารถใช้มันเพื่อสร้างหากการเข้าถึงข้อมูลประจำตัวของใครตกลง
nigel222

2
ใน AT&T SYSV Unix "true" เป็นเชลล์สคริปต์ / bin / true ซึ่งประกอบไปด้วยประกาศลิขสิทธิ์ขนาดใหญ่ในความคิดเห็น ... และไม่มีอะไรอื่น
Lee Daniel Crocker

21

ฉันรู้สึกว่าคำตอบที่ยอมรับไม่ได้ตอบคำถามของคุณจริงหรือ

วัตถุประสงค์sudoของการทำเช่นนี้คือการตรวจสอบว่าคุณสามารถจริง

วิธีการตรวจสอบนี้ดำเนินการผ่านtrueโปรแกรมตามที่อธิบายไว้ในคำตอบที่ยอมรับ


1
เป็นหลักนี้ ทางเลือกอาจเป็นการตรวจสอบว่าผู้ใช้อยู่ในกลุ่ม sudoers หรือไม่ แต่การเรียกใช้sudo trueนั้นยังง่ายพออยู่แล้วแม้ว่าจะเป็นเรื่องเล็กน้อย
Sergiy Kolodyazhnyy

3
โปรดทราบว่าต้องsudoมีการติดตั้งด้วยดังนั้นการตรวจสอบจะไม่เทียบเท่ากันทั้งหมด ... คุณอาจอยู่ในกลุ่ม sudoers และยังไม่สามารถ sudo ได้ (สิ่งนี้อาจเกิดขึ้นโดยเฉพาะถ้าคุณเขียนสคริปต์เพื่อตั้งค่ารูปภาพใหม่จาก tarball รูทแบบขั้นต่ำซึ่งอาจไม่มี sudo)
Mehrdad

1
OP ต้องการเลื่อนออกหากคุณไม่สามารถ sudo และกำจัดสองบรรทัดแทนที่จะมีคนอื่นติดตาม noop
mckenzm

2
และตรงกันข้ามคุณยังสามารถสามารถsudoโดยไม่ต้องอยู่ในกลุ่ม sudoers ถ้าคุณ (ทั้งส่วนตัวหรือเป็นสมาชิกของบางส่วนอื่น ๆกลุ่ม) /etc/sudoersมีการระบุไว้ใน แต่ถึงกระนั้นsudo trueก็ไม่ผิดพลาดเพราะsudoสามารถเข้าถึงได้สำหรับคำสั่งเฉพาะเท่านั้นดังนั้นคุณอาจจะสามารถsudo trueแต่ไม่สามารถsudo something_elseหรือในทางกลับกัน ไม่มีวิธีเหล็กหุ้มเพื่อทดสอบอื่น ๆ sudoกว่าโดยพยายามที่จะเรียกใช้คำสั่งที่คุณต้องการจริงในการทำงานด้วยเป็น
Dave Sherohman

2
นอกจากนี้คุณสามารถอยู่ในsudoersกลุ่มและไม่สามารถทำได้sudoเนื่องจากsudoersกลุ่มไม่ได้อยู่ในรายการในsudoersไฟล์ กลุ่มที่มีสี่ตัวอักษรsudoในชื่อของมันไม่ได้เป็นตัวบ่งชี้ที่ถูกต้องหรือไม่ว่าผู้ใช้ในกลุ่มที่สามารถทำสิ่งใด ๆ sudoหรืออะไรที่ทุกคนใช้
jrw32982 รองรับ Monica

5

อย่างที่ฉันเห็นในสคริปต์นี้ มันเป็นเพียงการตรวจสอบว่ามีการเปิดใช้งาน sudo หรือไม่ ..

true เพียงแค่คืนค่าจริง

ดังนั้นในกรณีนี้หากพวกเขาจำเป็นต้องเรียกใช้คำสั่งใด ๆ ด้วย sudo มันจะตรวจสอบที่เริ่มต้นก่อนขอรหัสผ่านเพียงครั้งเดียว

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

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

'echo password ok' ก็แสดงให้เห็นเช่นกัน เชลล์สคริปต์จะไม่ถามรหัสผ่านอีกต่อไป


1
คำสั่งเดียวที่เรียกใช้ผ่าน sudo มีsudo trueและsudo -kและหลังอย่างชัดเจนไม่ต้องใช้รหัสผ่าน ไม่มีคำสั่งอื่น ๆ ในสคริปต์ที่ทำงานผ่าน sudo ดังนั้นแน่นอนว่าพวกเขาจะไม่ต้องการรหัสผ่านไม่ว่าการพิสูจน์ตัวตนจะสำเร็จในครั้งแรกหรือไม่
ilkkachu

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