อะไรคือความแตกต่างระหว่าง "su", "sudo -s", "sudo -i", "sudo su"?


148

ฉันอ่านจากคู่มือแล้ว แต่ฉันไม่เห็นความแตกต่าง ..

su - เปลี่ยน ID ผู้ใช้หรือกลายเป็น superuser

sudo -s [command]

-s(เชลล์) ตัวเลือกที่ทำงานเปลือกที่ระบุโดยตัวแปรสภาพแวดล้อม SHELL หากมีการตั้งหรือเปลือกที่ระบุไว้ใน passwd (5) หากระบุคำสั่งคำสั่งจะถูกส่งไปยังเชลล์เพื่อดำเนินการ มิฉะนั้นเชลล์แบบโต้ตอบจะถูกดำเนินการ

sudo -i คำอธิบายหายไปในคู่มือ


7
นอกจากนี้ยังไม่ได้ใช้su userในการเข้าสู่ระบบจากเปลือกที่ไม่น่าเชื่อถือ su - userแต่ ดูunix.stackexchange.com/q/7013/8250
Lekensteyn

@Lekensteyn ว้าวเป็นตัวอย่างที่ดี ขอบคุณสำหรับ LOL :)
törzsmókus

1
จงระลึกถึงพระบัญญัติเดิมเสมอ: เจ้าจะไม่เรียกชื่อรากของมันอย่างไร้ประโยชน์!
törzsmókus

ไม่พูดsudo -iไม่ดี แต่คุณสามารถใช้มันได้อย่างแน่นอน
Kolob Canyon

ใกล้เคียงกันมาก: askubuntu.com/questions/376199/…
โพสต์เมื่อ

คำตอบ:


118

ความแตกต่างที่สำคัญระหว่างคำสั่งเหล่านี้คือวิธีที่พวกเขา จำกัด การเข้าถึงฟังก์ชันของพวกเขา

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

sudo (อืม ... ผู้ช่วยในการจำคืออะไร Super-User-DO?)แตกต่างไปจากเดิมอย่างสิ้นเชิง มันใช้ไฟล์กำหนดค่า (/ etc / sudoers) ซึ่งแสดงว่าผู้ใช้รายใดมีสิทธิ์ในการดำเนินการเฉพาะ (เรียกใช้คำสั่งเป็นรูท ฯลฯ ) เมื่อเรียกใช้มันจะขอรหัสผ่านของผู้ใช้ที่เริ่มต้น - เพื่อให้มั่นใจว่า ขั้วมันเดียวกัน "โจ" /etc/sudoersที่ระบุไว้ใน ในการเพิกถอนสิทธิ์ผู้ดูแลระบบจากบุคคลคุณเพียงแค่ต้องแก้ไขไฟล์กำหนดค่า (หรือลบผู้ใช้ออกจากกลุ่มที่มีรายชื่ออยู่ในการกำหนดค่านั้น) สิ่งนี้ส่งผลในการจัดการสิทธิพิเศษที่สะอาดกว่ามาก

ด้วยเหตุนี้rootผู้ใช้ระบบ Debian หลายคนจึงไม่ได้ตั้งรหัสผ่าน - นั่นคือไม่สามารถเข้าสู่ระบบในฐานะ root โดยตรง

นอกจากนี้/etc/sudoersอนุญาตให้ระบุตัวเลือกเพิ่มเติม - เช่นผู้ใช้ X เท่านั้นที่สามารถเรียกใช้โปรแกรม Y เป็นต้น

sudo suชุดค่าผสมที่ใช้บ่อยจะทำงานดังต่อไปนี้ก่อนsudoขอรหัสผ่านจากคุณและหากคุณได้รับอนุญาตให้เรียกใช้คำสั่งถัดไป ( su) ในฐานะผู้ใช้ขั้นสูง เนื่องจากsuมีการเรียกใช้โดยrootไม่ต้องการให้คุณป้อนรหัสผ่านของผู้ใช้เป้าหมาย ดังนั้นsudo suอนุญาตให้คุณเปิดเชลล์ในฐานะผู้ใช้รายอื่น (รวมถึงรูท) หากคุณได้รับอนุญาตให้เข้าถึง/etc/sudoersไฟล์super-user


2
ฉันไม่เคยเห็นsuว่า "เปลี่ยนผู้ใช้" แต่เป็น superuser เสมอ พฤติกรรมเริ่มต้นที่ไม่มีชื่อผู้ใช้ของผู้อื่น (แม้ว่าจะสมเหตุสมผล) จากวิกิพีเดีย : "คำสั่ง su หรือที่เรียกว่า super user [1] ในช่วงต้นปี 1974 ก็ถูกเรียกว่า" ผู้ใช้สำรอง "," ผู้ใช้หลอก "หรือ" set user "เพราะจะอนุญาตให้เปลี่ยนบัญชีที่เกี่ยวข้องกับปัจจุบัน เทอร์มินัล (หน้าต่าง) "
dr jimbob

5
@dr jimbob: ถูกต้อง แต่ฉันพบว่า "ผู้ใช้ switch" ค่อนข้างจะอธิบายได้ดีกว่าว่ามันทำอะไร - แม้ว่าในอดีตมันหมายถึง "super user" ฉันยังดีใจที่ได้พบว่าบทความวิกิพีเดียจะคล้ายกับคำตอบของฉัน - ฉันไม่เคยเห็นบทความก่อน :)
Sergey

11
ความหมายอย่างเป็นทางการของ "su" คือ "ผู้ใช้สำรอง" ดู: "man su"
Angel O'Sphere

1
@ AngelO'Sphere: น่าสนใจ manpage ของ Ubuntu ไม่ได้พูดถึง "การแทนที่" เลย manpage ที่ gnu.org ( gnu.org/software/coreutils/manual/html_node/su-invocation.html ) จะพูดว่า "su: เรียกใช้คำสั่งด้วยผู้ใช้และ ID กลุ่มแทน" ผมคิดว่า gnu.org เป็นแหล่งที่ยอมรับ :)
Sergey

1
เกี่ยวกับsudo suอะไร
Kaz Wolfe

59

sudoช่วยให้คุณสามารถรันคำสั่งในบัญชีผู้ใช้ของคุณเองด้วยสิทธิ์ของรูท suช่วยให้คุณสลับผู้ใช้เพื่อให้คุณเข้าสู่ระบบในฐานะผู้ใช้จริง

sudo -sรันเชลล์ด้วยสิทธิพิเศษรูท sudo -iยังได้รับสภาพแวดล้อมของผู้ใช้รูท

หากต้องการดูความแตกต่างระหว่างsuและsudo -sให้ทำหลังจากcd ~นั้นpwdแต่ละข้อ ในกรณีแรกคุณจะอยู่ในไดเรกทอรีหลักของรูทเพราะคุณรูท ในกรณีที่สองคุณจะอยู่ในโฮมไดเร็กตอรี่ของคุณเองเพราะคุณมีสิทธิ์ใช้งานรูท

มีการอภิปรายมากขึ้นของคำถามตรงนี้เป็นที่นี่


20
"ตัวคุณเองด้วยสิทธิ์ของรูท" ไม่ใช่สิ่งที่เกิดขึ้นจริง ๆ :) ที่จริงแล้วมันเป็นไปไม่ได้ที่จะเป็น ลองพิมพ์whoamiทั้งสองกรณี ความจริงที่ว่าcd ~ผลลัพธ์นั้นแตกต่างกันเป็นผลมาจาก sudo -s ไม่ได้ตั้งค่าตัวแปรสภาพแวดล้อม $ HOME
Sergey

1
@Sergey, whoami ที่บอกว่าเป็น 'root' เพราะคุณกำลังเรียกใช้ 'whoami' cmd ราวกับว่าคุณ sudoed ดังนั้นชั่วคราว (สำหรับระยะเวลาของคำสั่งนั้น) คุณดูเหมือนจะเป็นผู้ใช้รูท แต่คุณอาจยังไม่เต็ม การเข้าถึงรูทตามไฟล์ sudoers
Octopus

1
@ Octopus: สิ่งที่ฉันพยายามจะพูดคือใน Unix กระบวนการสามารถมีได้เพียงหนึ่ง UID และ UID นั้นเป็นตัวกำหนดสิทธิ์ของกระบวนการ คุณไม่สามารถเป็น "ตัวคุณเองด้วยสิทธิ์ของรูท" โปรแกรมจะทำงานกับ UID ของคุณหรือด้วย UID ของรูท (0)
Sergey

5
เกี่ยวกับ "คุณอาจยังไม่สามารถเข้าถึงรูททั้งหมดตามไฟล์ sudoers": sudoersไฟล์ควบคุมผู้ที่สามารถเรียกใช้คำสั่งในฐานะผู้ใช้รายอื่น แต่เกิดขึ้นก่อนที่คำสั่งจะถูกดำเนินการ อย่างไรก็ตามเมื่อคุณได้รับอนุญาตให้เริ่มต้นกระบวนการได้เช่นรูท - โพรเซสที่รันนั้นมี UID ของรูทและสามารถเข้าถึงระบบได้อย่างสมบูรณ์ไม่มีวิธีใดที่ sudo จะ จำกัด ได้ อีกครั้งคุณเป็นตัวของตัวเองหรือรูตไม่มี "half-n-half" ดังนั้นหากsudoersไฟล์อนุญาตให้คุณเรียกใช้เชลล์ในฐานะรูท - สิทธิ์ในเชลล์นั้นจะแยกไม่ออกจากรูทเชลล์ "ปกติ"
Sergey

36

คำตอบนี้เป็นคำตอบของฉันในคำตอบของคำถามนี้วางไว้ที่คำตอบมาตรฐานเพื่อให้ผู้คนสามารถค้นหาได้!

ความแตกต่างที่สำคัญระหว่างsudo -iและsudo -sคือ:

  • sudo -iช่วยให้คุณมีสภาพแวดล้อมรากเช่นคุณ~/.bashrcจะถูกละเว้น
  • sudo -sให้สภาพแวดล้อมของผู้ใช้แก่คุณดังนั้นคุณ~/.bashrcจึงได้รับการเคารพ

นี่คือตัวอย่างคุณสามารถเห็นว่าฉันมีโปรแกรมlslในของฉัน~/.bin/ไดเรกทอรีซึ่งสามารถเข้าถึงได้ผ่านทางแต่ไม่สามารถเข้าถึงได้ด้วยsudo -s sudo -iยังทราบว่าการเปลี่ยนแปลงที่พรอมต์ทุบตีเป็นพินัยกรรมที่มีsudo -iแต่ไม่ได้มีsudo -s:

dotancohen@melancholy:~$ ls .bin
lsl

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ sudo -i

root@melancholy:~# which lsl

root@melancholy:~# exit
logout

dotancohen@melancholy:~$ sudo -s
Sourced .bashrc

dotancohen@melancholy:~$ which lsl
/home/dotancohen/.bin/lsl

dotancohen@melancholy:~$ exit
exit

แม้ว่าsudo -sจะสะดวกในการให้สภาพแวดล้อมที่คุณคุ้นเคย แต่ฉันขอแนะนำให้ใช้sudo -iสองเหตุผล:

  1. การแจ้งเตือนที่มองเห็นได้ว่าคุณอยู่ในช่วง 'รูต'
  2. .bashrcสิ่งแวดล้อมรากอยู่ไกลโอกาสน้อยที่จะวางยาพิษที่มีมัลแวร์เช่นเส้นโกงใน

ฉันสังเกตเห็นว่า sudo -s ดูเหมือนจะไม่ประมวลผล / etc / profile หรืออะไรก็ตามที่ฉันมีใน / etc /profile.d/ .. ความคิดใด ๆ
meffect

@dotancohen - คุณหมายถึงอะไรโดยsudo -sจัดให้มีสภาพแวดล้อมที่ผู้ใช้คุ้นเคยกับ?
แรงบันดาลใจ

@dancancohen - คำสั่ง sudo -s มีตัวชี้นำภาพอยู่แล้วดังนั้นฉันอยากรู้ว่าทำไม sudo -i เป็นตัวเลือกที่ดีกว่า
แรงบันดาลใจ

9

su ถามรหัสผ่านของผู้ใช้ "root"

sudoถามรหัสผ่านของคุณเอง (และตรวจสอบว่าคุณได้รับอนุญาตให้เรียกใช้คำสั่งในฐานะรูทซึ่งกำหนดค่าผ่าน/etc/sudoers- โดยค่าเริ่มต้นบัญชีผู้ใช้ทั้งหมดที่อยู่ในกลุ่ม "admin" หรือ "sudo" จะได้รับอนุญาตให้ใช้ sudo)

sudo -sเปิดตัวเชลล์ในฐานะรูท แต่จะไม่เปลี่ยนไดเร็คทอรี่สำหรับทำงานของคุณ sudo -iจำลองการลงชื่อเข้าใช้ในบัญชีรูท: ไดเรกทอรีการทำงานของคุณจะเป็น/rootเช่นนั้นและรูท.profileอื่น ๆ จะได้รับการจัดทำเหมือนเข้าสู่ระบบ


1
เพื่อให้คำตอบสมบูรณ์มากขึ้น: sudo -sเกือบเท่ากับsu($ HOME แตกต่างกัน) และsudo -iเท่ากับsu -
DJCrashdummy

@DJCrashdummy - ทำไมคุณถึงพูดเกือบเท่ากับ? ต่างกันอย่างไร
แรงบันดาลใจ

2

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

ตัวอย่างเช่นถ้าฉันซ่อมระบบจาก CD สด USB ฉันมักจะติดฮาร์ดไดรฟ์และสิ่งที่จำเป็นอื่น ๆ และchrootเข้าสู่ระบบ ในกรณีเช่นนี้คำสั่งแรกของฉันโดยทั่วไป:

su - myuser  # Note the '-'. It means to act as if that user had just logged in.

ด้วยวิธีนี้ฉันไม่ได้ทำงานเป็น root แต่เป็นผู้ใช้ปกติของฉันและฉันก็ใช้sudoตามความเหมาะสม


0
  • su ถามรหัสผ่านรูทกลายเป็นรูทเปิดเชลล์การล็อกอินที่ไม่โต้ตอบ
  • su - ถามรหัสผ่านรูทกลายเป็นรูทเปิดเชลล์ล็อกอินแบบโต้ตอบ

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

วิธีปฏิบัติที่ดีที่สุดคือการใช้สองสิ่งนี้


  • sudo suถามรหัสผ่านของคุณกลายเป็นรูตหนึ่งวินาทีและรันsuในฐานะรูท `
  • sudo su -ถามรหัสผ่านของคุณกลายเป็นรูตหนึ่งวินาทีและรันsu -ในฐานะรูท

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


ความแตกต่างระหว่างการเข้าสู่ระบบและไม่ใช่การเข้าสู่ระบบเปลือกคืออะไร?
Pilot6

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