'sudo su -' vs 'sudo -i' vs 'sudo / bin / bash' - เมื่อไหร่ที่มันจะใช้งานได้หรือมันจะสำคัญหรือไม่?


254

เมื่อฉันทำบางสิ่งที่ต้องพิมพ์รูทในหลายสิบครั้งติดต่อกันฉันชอบที่จะเปลี่ยนเซสชั่นของฉันเป็นเซสชันรูท ในบทเรียนต่างๆและคำแนะนำฉันได้ใช้บนอินเทอร์เน็ตที่ฉันเห็นsudo su, sudo su -, sudo -iและsudo /bin/bashถูกนำมาใช้เพื่อเปิดเซสชั่นราก แต่ฉันไม่ชัดเจนเกี่ยวกับความแตกต่างระหว่างเหล่านี้และเมื่อไหร่หรือว่าเรื่องที่แตกต่าง

มีคนช่วยเคลียร์สิ่งนี้ให้ฉันได้ไหม


11
คุณลืมที่จะถามเกี่ยวกับและsudo -s sudo su
Radu Rădeanu




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

คำตอบ:


325

ในการอธิบายสิ่งนี้คุณต้องรู้ว่าโปรแกรมทำอะไร:

  • su- คำสั่งsuถูกใช้เพื่อสลับไปยังผู้ใช้อื่น ( s witch u ser) แต่คุณสามารถสลับไปยังผู้ใช้รูทได้โดยเรียกใช้คำสั่งโดยไม่มีพารามิเตอร์ suขอให้คุณใส่รหัสผ่านของผู้ใช้หลังจากพิมพ์รหัสผ่านที่คุณเปลี่ยนเป็นสภาพแวดล้อมของผู้ใช้
  • sudo- sudoหมายถึงเรียกใช้คำสั่งเดียวด้วยสิทธิ์ของรูท แต่ต่างจากsuจะแจ้งให้คุณใส่รหัสผ่านของผู้ใช้ปัจจุบัน ผู้ใช้นี้ต้องอยู่ในไฟล์ sudoers (หรือกลุ่มที่อยู่ในไฟล์ sudoers) ตามค่าเริ่มต้น Ubuntu จะจดจำรหัสผ่านของคุณเป็นเวลา 15 นาทีเพื่อให้คุณไม่ต้องพิมพ์รหัสผ่านทุกครั้ง
  • bash- ส่วนต่อประสานข้อความเพื่อโต้ตอบกับคอมพิวเตอร์ สิ่งสำคัญคือการเข้าใจความแตกต่างระหว่างการเข้าสู่ระบบการไม่เข้าสู่ระบบการโต้ตอบและการไม่โต้ตอบเปลือก:

ประเภทของเปลือกหอย:

  • ล็อกอินเชลล์ : ล็อกอินเชลล์ล็อกอินคุณเข้าสู่ระบบในฐานะผู้ใช้ที่ระบุจำเป็นสำหรับชื่อผู้ใช้และรหัสผ่าน เมื่อคุณกดctrl+ alt+ F1เพื่อล็อกอินเข้าสู่เทอร์มินัลเสมือนคุณจะได้รับหลังจากล็อกอินเชลล์ล็อกอินสำเร็จ
  • non-login shell : เชลล์ที่ดำเนินการโดยไม่มีการล็อกอินจำเป็นสำหรับผู้ใช้ที่เข้าสู่ระบบอยู่ในปัจจุบัน เมื่อคุณเปิดเทอร์มินัลกราฟิกใน gnome มันเป็นเชลล์ที่ไม่ใช่การเข้าสู่ระบบ
  • interactive shell : เชลล์ (ล็อกอินหรือไม่ใช่ล็อกอิน) ซึ่งคุณสามารถพิมพ์หรือโต้ตอบคำสั่งขัดจังหวะ ยกตัวอย่างเช่น terminal gnome
  • เชลล์แบบไม่มีการโต้ตอบ : เชลล์ (ย่อย) ที่อาจเรียกใช้จากกระบวนการอัตโนมัติ คุณจะไม่เห็นอินพุตหรือเอาต์พุต

ดังนั้นกรณีคือ:

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

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

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

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

  • sudo -sอ่าน$SHELLตัวแปรและดำเนินการกับเนื้อหา หาก$SHELLมี/bin/bashมันเรียกใช้sudo /bin/bash(ดูด้านบน)

ตรวจสอบ:

เพื่อตรวจสอบว่าคุณอยู่ในเปลือกเข้าสู่ระบบหรือไม่ (ทำงานเฉพาะในทุบตีเพราะshoptเป็นคำสั่ง builtin):

shopt -q login_shell && echo 'Login shell' || echo 'No login shell'

18
เพียงชี้แจง: sudoช่วยให้ผู้ได้รับอนุญาตให้รันคำสั่งเป็น superuser หรือผู้ใช้อื่น อย่างไรก็ตาม +1 สำหรับความพยายามของคุณ
Radu Rădeanu

2
@chaos ขอบคุณสำหรับคำตอบที่ยอดเยี่ยมนี้! ส่วนใหญ่จะตอบคำถามของฉันดังนั้นฉันจึงไปข้างหน้าและทำเครื่องหมายคำถามที่ตอบ แต่ฉันไม่เข้าใจว่าเมื่อใดที่ต้องการเรียกใช้เชลล์เฉพาะ ฉันใช้ Ubuntu ผ่านทางบรรทัดคำสั่งเท่านั้นและฉันพบว่าการใช้งานทั่วไปของฉันเพื่อเปิดrootเซสชันผู้ใช้ (เมื่อเทียบกับการใช้sudo) คือเมื่อฉันทำสิ่งที่ต้องใช้rootสิทธิ์จำนวนมากเช่นเมื่อติดตั้งสิ่งใหม่หรือทำการตั้งค่าใหม่ที่สำคัญ . ฉันเคยใช้sudo /bin/bashมา แต่เห็นได้ชัดว่าวิธีการนั้นมีการลงโทษที่ไม่ดีด้วยเหตุผลบางอย่างที่ฉันไม่เข้าใจ
พอล

2
ยิ่งไปกว่านั้น "ถูกต้อง" ที่จะพูดว่า su ย่อมาจาก switch user มากกว่าผู้ใช้ super เช่นเรียกใช้สคริปต์ php: su www-data /usr/share/script.php หรือเพียงแค่ www-data สำหรับเชลล์แบบโต้ตอบ แต่ su โดยไม่มีชื่อผู้ใช้จะถือว่าบัญชีรูท (ผู้ใช้ super)
Oblivian

ความโกลาหล - "shopt -q login_shell && echo 'เปลือกการเข้าสู่ระบบ' || echo 'ไม่มีคำสั่งการเข้าสู่ระบบเชลล์'" คำแนะนำแบบนี้ฉันเห็นบ่อยๆ แต่ทำไมต้องใช้เวลานานขนาดนี้? ตัวดำเนินการ && หมายถึงถ้ารหัสออก 0 จากนั้น "ทำคำสั่งถัดไป" และดับเบิลไพพ์ (||) หมายถึงอย่างอื่น (ถ้าไม่ใช่ 0) ให้ทำตามคำสั่งนี้ ดังนั้นสิ่งที่มันเป็นพื้นว่าถ้ารหัสทางออก 0 แล้ว echo "เข้าสู่ระบบเชลล์" ถ้ารหัสทางออก 1 (ล้มเหลว) จากนั้นสะท้อน "ไม่มีการเข้าสู่ระบบ" ทำไมไม่เพียงแค่ "shopt -q login_shell; echo $" $? หมายถึงโค้ดผลลัพธ์ / ออกของคำสั่งก่อนหน้า โดยส่วนใหญ่หากไม่ใช่โปรแกรมทั้งหมด 0 หมายถึงความสำเร็จหมายถึงอย่างน้อย 1 รายการ ดังนั้นถ้าเสียงก้องคือ 0 = สำเร็จ ...
Oblivian

2
@Paul: sudo -iแนะนำ อ่านที่นี่: ubuntuforums.org/showthread.php?t=1817402และที่นี่: unix.stackexchange.com/questions/98531/…
Marco Sulla

0

หากต้องการค้นหาความแตกต่างคุณสามารถแยกแยะสภาพแวดล้อมที่เกิดจากการเรียกใช้ที่แตกต่างกัน

คุณสามารถค้นหาความแตกต่าง"เล็ก"บางอย่างในตัวแปรสำคัญบางอย่าง:

  • PATH, LD_LIBRARY_PATH,LD_PRELOAD

หรือความแตกต่างบางอย่างใน ~ / การจัดการdotfiles ( ~/.config)

พิจารณาความเป็นเจ้าของของ $ HOME logfiles ( ~/.xsession.errors, ฯลฯ ... ) หรือ xauth cookies ( ~/.Xauthority) ที่คำสั่งสร้างขึ้น

ลองใช้คำสั่งเหล่านี้:


# 'su -' vs 'su'

diff <(sudo su - -c env | sort) <(sudo su -c env | sort)


# 'su -' vs 'sudo -i'

diff <(sudo su - -c env | sort) <(sudo -i env | sort)

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