มีเหตุผลที่ดีในการใช้งาน sudo su หรือไม่?


78

ในการเปิดรูทเชลล์บนเครื่องที่ปิดใช้งานบัญชีรูทคุณสามารถเรียกใช้หนึ่งใน:

  • sudo -i: เรียกใช้เปลือกเข้าสู่ระบบแบบโต้ตอบ (อ่าน/root/.bashrcและ/root/.profile)
  • sudo -s: เรียกใช้เปลือกโต้ตอบที่ไม่ใช่การเข้าสู่ระบบ (อ่าน/root/.bashrc)

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

ความแตกต่างเพียงอย่างเดียวดูเหมือนจะ (เปรียบเทียบsudo -iด้านซ้ายและsudo su -ด้านขวา):

สกรีนช็อตของ meld การเปรียบเทียบ 'sudo -i' และ 'sudo su -'

และเปรียบเทียบsudo -s(ซ้าย) และsudo su(ขวา):

สกรีนช็อตของ meld เปรียบเทียบ 'sudo -s' และ 'sudo su'

ความแตกต่างหลัก (ละเว้นSUDO_fooตัวแปรและLS_COLORS) ดูเหมือนจะเป็นXDG_fooตัวแปรระบบในsudo suรุ่น

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


8
ฉันไม่เคยเข้าใจระบบแฟนซีคนที่เป็นเหมือนที่ป้องกันผู้ใช้จากมาตรฐานubuntu su -พวกเขาสร้างปัญหาและตอนนี้มีการอภิปรายกันอย่างไม่รู้จบเกี่ยวกับวิธีแก้ปัญหา
jimmij

16
@jimmij คุณไม่จำเป็นต้องรู้รหัสผ่านรูทด้วยsu -? คุณไม่คิดว่าการวางช่องโหว่ความปลอดภัยในสภาพแวดล้อมที่มีผู้ใช้หลายคนมากกว่าหนึ่งคนต้องมีการเข้าถึงรูท?
Erathiel

4
@Christopher ปัญหาไม่ใช่หนึ่งในผู้ใช้ที่มีสิทธิ์ sudo หรือรหัสผ่านรูทเพื่อแฮ็คระบบ ปัญหาเกี่ยวกับความปลอดภัยของรหัสผ่าน เมื่อคุณเปลี่ยนรหัสผ่านรูทคุณจะต้องแจ้งให้ผู้ใช้ทุกคนที่ต้องการทราบรหัสผ่านซึ่งอาจเป็นเรื่องยาก ด้วย sudo คุณไม่มีปัญหานี้
Huygens

4
เครื่องมือ diff ต่างกันอย่างไร
Josh The Geek

5
@jimmij Ubuntu จะป้องกันการใช้งานsu -อย่างไร ใช่คุณต้องตั้งค่ารหัสผ่านรูท แต่นั่นไม่สำคัญ
Phizes

คำตอบ:


62

ตามที่คุณระบุไว้ในคำถามความแตกต่างที่สำคัญคือสภาพแวดล้อม

sudo su - เมื่อเทียบกับ sudo -i

ในกรณีที่sudo su -มันเป็นเปลือกเข้าสู่ระบบเพื่อให้/etc/profile, .profileและ.bashrcจะดำเนินการและคุณจะพบว่าตัวเองในไดเรกทอรีบ้านรากกับสภาพแวดล้อมของราก

sudo -iเกือบจะเป็นเช่นเดียวกับ(จำลองการเข้าสู่ระบบเริ่มต้น) ตัวเลือกที่ทำงานเปลือกที่ระบุโดยรายการฐานข้อมูลรหัสผ่านของผู้ใช้เป้าหมายเป็นเปลือกเข้าสู่ระบบ ซึ่งหมายความว่าการเข้าสู่ระบบเฉพาะไฟล์ทรัพยากรเช่น, หรือจะอ่านและดำเนินการโดยเปลือกsudo su --i.profile.bashrc.login

sudo su เมื่อเทียบกับ sudo -s

sudo suเรียกด้วยคำสั่งsudo suBash ถูกเรียกว่าเป็นเชลล์ที่ไม่ได้ล็อกอินแบบโต้ตอบ ดังนั้นรันเท่านั้นbash .bashrcคุณจะเห็นว่าหลังจากเปลี่ยนเป็นรูทแล้วคุณยังอยู่ในไดเรกทอรีเดิม:

user@host:~$ sudo su
root@host:/home/user#

sudo -sอ่าน$SHELLตัวแปรและดำเนินการกับเนื้อหา หาก$SHELLมี/bin/bashมันเรียกใช้sudo /bin/bashซึ่งหมายความว่า/bin/bashจะเริ่มต้นเป็นเปลือกที่ไม่ได้เข้าสู่ระบบดังนั้นจุดไฟล์ทั้งหมดจะไม่ถูกดำเนินการ แต่bashตัวเองอ่าน bashrcของผู้ใช้ที่โทร สภาพแวดล้อมของคุณยังคงเหมือนเดิม บ้านของคุณจะไม่เป็นบ้านของคนรูท ดังนั้นคุณจะรูต แต่ในสภาพแวดล้อมของผู้ใช้ที่โทรมา

ข้อสรุป

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

ส่วนที่เพิ่มเข้าไป

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

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

สิ่งที่เรามีตอนนี้กำลังsudoเป็นที่นิยมมากขึ้นเรื่อย ๆ มันรวมอยู่ในการกระจาย linux เกือบทุกที่รู้จักกันดี suเครื่องมือเดิมเพื่อสลับไปยังบัญชีผู้ใช้อื่น สำหรับโรงเรียนเก่า * ระวังเก๋าสิ่งดังกล่าวเช่นsudoอาจดูเหมือนไม่มีความจำเป็น มันเพิ่มความซับซ้อนและพฤติกรรมที่เป็นไปได้มากขึ้นกับกลไกที่เรารู้จักจากระบบปฏิบัติการตระกูล Microsoft และขัดกับปรัชญาของความเรียบง่ายของระบบ * nix

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

ดังนั้นผมคิดว่ามันจะเป็นสิ่งที่ดีที่สุดที่จะใช้sudoของกลไกภายใน ( -s, -i) แทนที่จะอาศัยเป็นเครื่องมือเก่า ๆ suเช่น


4
อ๊ะก่อนปี 2004 มีเหตุผลอะไรที่ต้องวิ่งหนีจริงsudo su? ตอนนั้นฉันใช้ distros ที่ไม่มีบัญชี sudo และรูทแอคทีฟดังนั้นฉันไม่รู้ นั่นอาจอธิบายถึงความชุกของ sudo su meme ในโลก Ubuntu
terdon

8
ฉันไม่เคยรู้เกี่ยวกับsudo -iหรือsudo -sก่อนหน้านี้ - ฉันใช้ยูนิกซ์หลายประเภทมาตั้งแต่ปี 1991 และสำหรับฉันsudo su -ก็เป็นเพียงนิสัยที่ฝังแน่นในตอนนี้
ปุย

2
เป็นsudo -sเช่นเดียวsudo $SHELLแล้ว?
ซามูเอลเอ็ดวินวอร์ด

3
(เห็นด้วยกับ @chaos) เหตุผลในการใช้sudo su -คือ 1) มันใช้งานได้และคุณรู้ว่ามันทำอะไรและ 2) คุณไม่จำเป็นต้องจำตัวเลือกอื่นให้กับsudo(เมื่อคุณรู้แล้วsu -) และ 3) คุณไม่ได้ ' ไม่จำเป็นต้องจำรุ่นที่sudoคุณใช้งานอยู่ในขณะนี้ เหตุใดจึงจำเรื่องไม่สำคัญอีกชิ้นหนึ่งเมื่อสิ่งที่คุณทำงานได้ดีอยู่แล้ว มีอะไรที่su -iดีไปกว่าการหลีกเลี่ยงรายการบันทึกหรือไม่? ฉันไม่ได้ใช้sudo su -มากพอที่จะกังวลเกี่ยวกับเรื่องนั้น
jrw32982

3
ฉันเพิ่งเห็นการปรับปรุงดีมาก! สำหรับบันทึกให้ฉันรัฐนั้นฉันก็ตัดฟัน * ระวังของฉันในระบบที่มีไม่มีและกำลังใช้มากในการsudo suมันเป็นการรวมกันของสองอย่างที่ทำให้ฉันเป็นโรค
terdon

16

หากต้องการตอบคำถามของคุณโดยตรง: ไม่ไม่มีเหตุผลที่ดีในการทำเช่นนี้ นอกจากนี้ sudo su จะสร้างรายการบันทึกสองรายการเมื่อมีรายการเพียงพอ

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

อย่างไรก็ตามเพื่อให้รายการของคุณsudo -sและsudo -iฉันต้องการที่จะเพิ่มทางเลือกหนึ่งมากขึ้นซึ่งเป็นชนิดของการเปลี่ยนเป็น sudo -sE รักษาสภาพแวดล้อมของคุณรวมถึงไดเรกทอรีบ้าน สิ่งนี้มีความเสี่ยงหากโฮมไดเร็กตอรี่ของคุณไม่ปลอดภัย (บน NFS) แต่ในสภาพแวดล้อมที่มีผู้ใช้รูทจำนวนมากมันช่วยให้คุณไม่ต้องเห็นด้วยกับเนื้อหาของไฟล์รูท My มีความเชี่ยวชาญหลายอย่างสำหรับรูทดังนั้นฉันจึงไม่ได้รับสภาพแวดล้อมแบบเดียวกับรูท แต่อย่างน้อยฉันก็จะได้รับสภาพแวดล้อมที่ต้องการอย่างแน่นอนsu -msudo -sE.bashrc.bashrc


4
หากมันยังคงรักษาสภาพแวดล้อมของคุณรวมถึง$HOMEนั่นหมายความว่าไฟล์ใหม่ทั้งหมดที่สร้างขึ้นภายใต้โฮมโฟลเดอร์นั้นเป็นของรูทไม่ใช่ของคุณ ฉันเคยมีสิ่งนี้ทำให้การวินิจฉัยข้อผิดพลาดการอนุญาตยากมาก
Eris

sudo -sEจากนั้นก็echo $HOMEมอบให้/rootกับ CentOS 7 ทุบตี 4.2 -sEดูเหมือนจะไม่เก็บไดเรกทอรีบ้านตามที่คุณระบุ
jeremysprofile
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.