sudo สากลเป็นอย่างไร


26

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

มีการแจกแจงแบบ Unix ที่ไม่มีsudoและถ้าเป็นเช่นนั้น มีคำสั่ง "Get me superuser privilege" ที่เป็นที่ยอมรับในระดับสากลที่อยู่ในระบบทั้งหมดหรือไม่?

คำตอบ:


34

sudo ไม่สามารถถือว่าเป็นสากลได้:

  • Red Hat Enterprise Linux : sudoมีการติดตั้งตามค่าเริ่มต้นบน Red Hat Enterprise Linux และอนุพันธ์ของมัน1แต่จะติดตั้งพร้อมใช้งานใน RHEL 7 และใหม่กว่าเท่านั้น

    Red Hat Enterprise Linux 7 เพิ่มตัวเลือกใหม่ให้กับหน้าจอการติดตั้งที่คุณสร้างผู้ใช้ที่ไม่ใช่รูทคนแรกช่องทำเครื่องหมายระบุว่า "ทำให้ผู้ดูแลระบบเป็นผู้ใช้นี้" จุดประสงค์ของมันไม่ได้รับการบันทึกไว้ในหน้าของคู่มือการติดตั้งที่ แต่หนึ่งในผลกระทบของมันคือการช่วยให้ผู้ใช้ที่รันคำสั่งใด ๆ sudoผ่านทาง ทำได้โดยเพิ่มผู้ใช้นั้นในwheelกลุ่มซึ่งสามารถเรียกใช้คำสั่งใด ๆ ภายใต้การsudoกำหนดค่าแพคเกจสต็อก

    Red Hat Enterprise Linux 3 ถึง 6 ได้รับการติดตั้งเป็นsudoค่าเริ่มต้น2แต่จนถึง RHEL 7 จะมีการกำหนดค่าการจัดส่งซึ่งrootสามารถเรียกใช้คำสั่งผ่านได้เท่านั้น วิธีที่ง่ายที่สุดในการแก้ไขปัญหานี้คือการเพิ่มผู้ใช้หนึ่งรายขึ้นไปในwheelกลุ่มจากนั้นเรียกใช้visudoเป็นรูทและไม่ใส่เครื่องหมายใน%wheel ALL=(ALL)...บรรทัด

  • Debian : ณ Debian 9 sudoรวมถึงการติดตั้งน้อย

    ใน Debian 7 และ 8 คุณจะต้องเลือก " มาตรฐานระบบสาธารณูปโภค " sudoชุดแพคเกจระหว่างการติดตั้งที่จะได้รับ หากคุณติดตั้งsudoวิธีดังกล่าวตัวติดตั้งระบบปฏิบัติการจะเพิ่มผู้ใช้ที่ไม่ใช่ผู้ดูแลระบบที่คุณสร้างไว้ก่อนหน้านี้ในกระบวนการติดตั้งให้กับsudoกลุ่มซึ่งได้รับอนุญาตให้เรียกใช้คำสั่งทั้งหมด

    ใน Debian 6 และรุ่นก่อนหน้าคุณต้องติดตั้งsudoผ่านทางapt-getหลังการติดตั้งและกำหนดค่าด้วยตนเองเพื่อให้ผู้ใช้ที่ไม่ใช่รูทสามารถใช้งานได้

  • FreeBSD : sudoไม่ได้ติดตั้งโดยค่าเริ่มต้นใน FreeBSD คุณต้องสร้างมันขึ้นมาจากพอร์ต

  • NetBSD : เหมือนกับ FreeBSD

  • OpenBSD : sudoใช้ในการติดตั้งได้โดยเริ่มต้นใน OpenBSD แต่พวกเขาได้เปลี่ยนไปdoasเป็นของ5.8 ได้รับการปล่อยตัวในตุลาคม 2015 doasเรือถูกปิดการใช้งานโดยค่าเริ่มต้น

    ในการรับsudoเวอร์ชั่นปัจจุบันคุณต้องติดตั้งจากที่เก็บแพคเกจ OpenBSD ของsudoแพคเกจที่มีการกำหนดค่ามากเช่นใน RHEL ที่ 3 ถึง 6 เพื่อให้เฉพาะสามารถเรียกใช้คำสั่งผ่านมันซึ่งค่อนข้างขัดแย้งกับวัตถุประสงค์ของroot sudoหากคุณเพิ่มไม่rootใช้ระหว่างการติดตั้งมันก็เพิ่มไปยังwheelกลุ่มดังนั้นวิธีที่ง่ายที่สุดที่จะทำให้sudoเป็นประโยชน์เกี่ยวกับระบบ OpenBSD คือการบรรทัดเหล่าสายผ่าน%wheel ALL=(ALL)...visudo

  • Solaris : sudoการติดตั้งโดยเริ่มต้นใน Solaris 11 แต่ Solaris 10 pfexecและการใช้งานที่มีอายุมากกว่าที่คล้ายกัน

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

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

ฉันsudoพึ่งระบบที่ฉันจัดการเป็นการส่วนตัวหรืออย่าง Ubuntu, macOS หรือ openSuSE ซึ่งเป็นวิธีเดียวที่จะได้รับสิทธิ์รูตโดยค่าเริ่มต้น

suเป็นผู้ใกล้ชิดกับสากล "ได้รับฉัน superuser สิทธิ์ของคำสั่ง" กว่าsudoแต่แล้วคุณมีระบบเช่น Ubuntu และ MacOS ที่บัญชี root ถูกล็อคโดยค่าเริ่มต้นโดยเฉพาะเพื่อบังคับให้คุณใช้แทนsudo suดังนั้นคุณไม่สามารถเรียกsuสากลได้เช่นกัน


เชิงอรรถ :

  1. CentOS, Oracle Linux, ลินุกซ์ทางวิทยาศาสตร์ ...

  2. ใช่แม้ในการติดตั้งเพียงเล็กน้อย


9

sudoเป็นยูทิลิตี้ที่มีอยู่ในระบบปฏิบัติการ Linux เกือบทั้งหมด
อย่างไรก็ตามจะไม่รวมเป็นค่าเริ่มต้นในทุก distros distros สำคัญทั้งหมดมีการรวมเป็นค่าเริ่มต้น

การแจกแจงลินุกซ์เช่น Arch Linux, Gentoo, LFS เป็นต้นซึ่งอนุญาตให้ผู้ใช้ปรับแต่งเองได้อย่างสมบูรณ์ไม่มี sudo โดยค่าเริ่มต้น

บน Arch Linux ระบบฐานไม่ได้sudoติดตั้ง ผู้ใช้จะต้องดาวน์โหลดsudoและแก้ไขไฟล์ sudoers ด้วยตนเอง
เหมือนกันสำหรับ Gentoo และ LFS ฉันไม่รู้เรื่อง distro ที่สำคัญอื่น ๆ หากปราศจาก sudo

และไม่ฉันไม่คิดว่าจะมีอะไรที่เป็นสากลมากกว่าการsudoให้สิทธิ์ผู้ใช้ระดับสูง นั่นคือนอกเหนือจากการเข้าสู่ระบบในฐานะที่เป็นจริง


1
sudoอาจรวมอยู่ใน distros ส่วนใหญ่ แต่ไม่ใช่ทั้งหมดที่กำหนดค่าผู้ใช้ทุกคนที่สามารถเรียกใช้ได้
jsbillings

อีกจุดที่ดี ขึ้นอยู่กับสิ่งที่ไฟล์ sudoers พูด
darnir

7

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

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


6

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

โดยปกติฉันวัดสภาพแวดล้อมการปฏิบัติการที่ตั้งใจไว้การกระจาย Linux แบบกึ่งสมัยใหม่ฉันคาดว่า POSIX เชลล์พร้อมกับ GNU Utils ทั่วไป สำหรับสคริปต์ที่สามารถทำงานนอก Linux ได้ฉันคาดหวังว่าจะได้มาตรฐาน POSIX แบบเต็มเท่านั้น เห็นได้ชัดว่าสคริปต์จำนวนมากมีเฉพาะกับ Linux หรือเฉพาะกับ distro ดังนั้นจึงมัก จำกัด ขอบเขตการพกพาให้แคบลง

เพื่อระบุกรณีการเขียนสคริปต์เฉพาะของคุณ

#!/bin/sh


## Exit Point
die() {
    [ -n "$2" ] && echo "$2"
    exit $1
}


## Require SuperUser Execution, Otherwise Re-Execute
[ `id -u` -ne 0 ] && {

    command -v lsb_release > /dev/null && {
        DISTRO="`lsb_release -is`"
        [ "$DISTRO" = "Ubuntu" ] && SUPERUSER='sudo'
    }
    SUPERUSER="${SUPERUSER:-su}"

    case "$SUPERUSER" in
        su)
            su -c "$0"
            ;;
        sudo)
            sudo "$0"
            ;;
    esac
}

## Require SuperUser Execution
[ `id -u` -ne 0 ] && die 78




echo 'Script Executed by UID'
id -u




## Clean Up
die 0

สคริปต์ที่วางเป็นคำชมเชลล์ POSIX ฉันมักจะเขียน Dash ได้


แต่สคริปต์ของคุณไม่ต้องการติดตั้ง sudo เหรอ? มีวิธีใดบ้างที่เราจะสามารถเข้าถึงผู้ใช้ขั้นสูงได้โดยไม่ต้องใช้ sudo? ผ่านการเขียนสคริปต์ธรรมดาหรือไม่
darnir

@darnir: ไม่สคริปต์ที่วางไม่จำเป็นต้องsudoติดตั้ง มันต้องการการดำเนินการ superuser และสามารถใช้ได้sudoหากมี หากsudoไม่พร้อมใช้งานสคริปต์จะต้องถูกเรียกใช้ในฐานะผู้ใช้รูทหรือจะเป็นdieเช่นนั้น
JM Becker

@darnir: นอกจากนี้ยังไม่มีสิ่งใดเรียกว่า "การเขียนสคริปต์ธรรมดา" เกือบทุกอย่างยกเว้นตัวบิวด์อินทำผ่านไบนารีปกติ นั่นคือจุดรวมทั้งหมดของเชลล์เพื่อเรียกคำสั่งอื่น ๆ ไม่ว่าจะแบบโต้ตอบหรืออัตโนมัติ นี่คือลักษณะที่กำหนดซึ่งแยกเชลล์ออกจากภาษาโปรแกรมทั่วไป ดังนั้นไม่ว่าคุณจะได้รับ superuser อย่างไรก็ทำได้โดยใช้คำสั่งภายนอก ... โดยสมมติว่าคุณไม่ได้เข้ารหัสด้วยอินเตอร์เฟสเคอร์เนลแบบ raw
JM Becker

1
@ varesa: น่าสนใจ Ubuntu ตรงข้ามกับการกำหนดค่าเริ่มต้นของ sudo / su คุณสามารถตรวจสอบสิ่งที่ sudo sudo -lสิทธิ์ผู้ใช้มีพร้อมใช้งานโดยการดำเนินการ น่าเสียดายที่มันใช้ไม่ได้ในสถานการณ์นี้เนื่องจากอาจต้องมีการป้อนรหัสผ่าน เมื่อพิจารณาถึงสิ่งนี้อย่างละเอียดยิ่งขึ้นฉันคิดว่าแนวคิดทั้งหมดอาจสำเร็จได้ดีที่สุดผ่านการทดสอบแบบ distro ใช้su -cเว้นแต่ทำงานsuคนพิการ distro sudo su -cเริ่มต้นซึ่งในกรณีที่ใช้ อย่างที่คนอื่น ๆ พูดถึงมันเป็นการดีที่สุดที่จะปล่อยให้ผู้ใช้ยกระดับความสุดยอดให้กับผู้ใช้ฉันจะพิจารณาความสะดวกสบาย
JM Becker

1
@varesa: sudoผมได้ปรับปรุงสคริปต์วางเพื่อลดโอกาสของการใช้ยกเลิกการกำหนดค่า สิ่งนี้ควรดำเนินการอย่างเหมาะสมในส่วนใหญ่ของ distro โดยสันนิษฐานว่าเป็นค่าเริ่มต้นsu/ sudoการกำหนดค่า ฉันรู้ว่า Ubuntu ล้าสมัยก่อนlsb_releaseจะต้องได้รับการแก้ไข ... แต่นี่เป็นเพียงตัวอย่างเท่านั้นและสามารถขยายได้อย่างชัดเจน
JM Becker
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.