su vs sudo -s vs sudo -i vs sudo bash


89

ความแตกต่างระหว่างคำสั่งต่อไปนี้คืออะไร:

su
sudo -s
sudo -i
sudo bash

ฉันรู้ว่าsuฉันต้องรู้รหัสผ่านรูทและsudoฉันต้องอยู่ในsudoersไฟล์ แต่เมื่อดำเนินการแล้วจะมีความแตกต่างอะไรบ้าง?

ฉันรู้ว่ามีความแตกต่างระหว่างsuและsudo -sเพราะไดเรกทอรีบ้านของฉันคือ/rootหลังจากที่ผมดำเนินการsuแต่ไดเรกทอรีบ้านของฉันยังคงหลัง/home/myname sudo -sแต่ฉันสงสัยว่านี่เป็นเพียงอาการของความแตกต่างพื้นฐานที่ฉันหายไป


3
ฉันชอบที่จะใช้sudo su - วิธีนี้คุณไม่จำเป็นต้องใช้รหัสผ่านรูทและ-ทำให้แน่ใจว่าไดเรกทอรีบ้านตั้งค่าไว้ถูกต้อง
Jens Timmerman

คำตอบ:


114

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

สิ่งต่าง ๆ กับsudo:

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

  • sudoมีความยืดหยุ่นมาก คุณสามารถ จำกัด คำสั่งที่อนุญาตให้ผู้ใช้หรือกลุ่มผู้ใช้เรียกใช้ตัวอย่างเช่น ด้วยsuมันคือทั้งหมดหรือไม่มีอะไร

    โดยทั่วไปคุณสมบัตินี้ใช้เพื่อกำหนดบทบาท ตัวอย่างเช่นคุณสามารถกำหนดกลุ่ม "backups" ที่อนุญาตให้เรียกใช้dumpและtarแต่ละกลุ่มต้องการการเข้าถึงรูทเพื่อสำรองดิสก์ระบบอย่างถูกต้อง

    ฉันพูดถึงเรื่องนี้ที่นี่เพราะมันหมายความว่าคุณสามารถให้sudoสิทธิพิเศษแก่ใครบางคนโดยไม่ต้องให้sudo -sหรือsudo bashความสามารถ พวกเขามีเพียงสิทธิ์ที่จำเป็นในการทำงานของพวกเขาในขณะที่suพวกเขาได้ทำงานของระบบทั้งหมด คุณจะต้องระมัดระวังเกี่ยวกับเรื่องนี้ว่า: ถ้าคุณให้คนที่ความสามารถในการพูดsudo viเช่นที่พวกเขาสามารถเปลือกออกของและมีประสิทธิภาพการใช้พลังงานเช่นเดียวกับกับvisudo -s

  • เนื่องจากใช้รหัสผ่านของ sudoer แทนรหัสผ่าน root ให้sudoแยกสิทธิ์ระหว่าง sudoers หลายรายการ

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

ความแตกต่างที่สำคัญระหว่างsudo bashและsudo -sที่-sสั้นกว่าและช่วยให้คุณส่งคำสั่งเพื่อดำเนินการในเชลล์เริ่มต้นของผู้ใช้ในสองวิธี:

  1. คุณสามารถบอกได้ว่าsudo -s some-commandอันsome-commandไหนที่ทำงานภายใต้เปลือกของคุณ sudo $SHELL -c some-commandมันเป็นพื้นสำหรับการจดชวเลข

  2. คุณสามารถส่งคำสั่งไปยังอินพุตมาตรฐานของเชลล์ได้เช่นsudo -s < my-shell-scriptกัน คุณสามารถใช้สิ่งนี้กับheredocเพื่อส่งคำสั่งหลายคำสั่งไปยังการsudoโทรครั้งเดียวโดยไม่จำเป็นต้องพิมพ์sudoซ้ำ ๆ

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

เชลล์รันโดยsudo -sสืบทอดสภาวะแวดล้อมผู้ใช้ปัจจุบันของคุณ หากสิ่งที่คุณต้องการจริง ๆ คือสภาพแวดล้อมที่สะอาดเช่นคุณจะได้รับหลังจากเข้าสู่ระบบสิ่งที่คุณต้องการคือแทนที่จะเป็นนอกจากนี้ล่าสุดค่อนข้างจะsudo -i sudoพูดประมาณsudo -iคือการsudo -sเป็นsu -คือsuมันรีเซ็ตทั้งหมด แต่ตัวแปรสภาพแวดล้อมที่สำคัญไม่กี่และส่งคุณกลับไปยังบ้านของผู้ใช้ของคุณ หากคุณไม่ให้คำสั่งเพื่อรันภายใต้เชลล์นั้นผ่านอินพุตมาตรฐานหรือsudo -i some-commandมันจะรันเชลล์นั้นเป็นเชลล์ล็อกอินแบบโต้ตอบดังนั้นสคริปต์การเริ่มต้นเชลล์ของผู้ใช้ของคุณ (เช่น.bash_profile) จะทำงานอีกครั้ง

ทั้งหมดนี้ทำให้มากมีความปลอดภัยมากกว่าsudo -i sudo -sทำไม? เพราะหากใครบางคนสามารถปรับเปลี่ยนสภาพแวดล้อมของคุณมาก่อนsudo -sพวกเขาอาจทำให้คำสั่งที่ไม่ตั้งใจดำเนินการ กรณีที่เห็นได้ชัดที่สุดคือการปรับเปลี่ยนSHELLแต่ก็ยังสามารถเกิดขึ้นได้น้อยโดยตรงเช่นผ่านPAGERถ้าคุณบอกว่าขณะที่ภายใต้man foosudo -s

คุณอาจพูดว่า "หากพวกเขาสามารถปรับเปลี่ยนPAGERพวกเขาสามารถแก้ไขPATHได้และจากนั้นพวกเขาสามารถทดแทนsudoโปรแกรมที่ชั่วร้ายได้" แต่บางคนหวาดระแวงอย่างเพียงพอสามารถพูด/usr/bin/sudo /bin/bashเพื่อหลีกเลี่ยงกับดักนั้นได้ คุณอาจไม่หวาดระแวงจนคุณหลีกเลี่ยงกับดักในตัวแปรสภาพแวดล้อมที่อ่อนไหวอื่น ๆด้วย คุณจำEDITORตัวอย่างเช่นก่อนตรวจสอบคำสั่งVCSหรือไม่? sudo -iดังนั้น

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


2
คุณหมายถึงอะไรโดย 'shell out of vi'
crisron

11
@crisron: จากภายในviให้พิมพ์:shและกด Enter ตอนนี้คุณอยู่ในเชลล์ย่อยด้วยสิทธิ์ทั้งหมดของviกระบวนการที่เกิดเชลล์นั้น หากviทำงานด้วยสิทธิพิเศษของรูทเชลล์จะทำเช่นนั้น หรือคุณสามารถเรียกใช้สิ่งอื่นที่ไม่ใช่เชลล์ผ่าน:!cmdอ่านเอาต์พุตจากคำสั่งไปยังบัฟเฟอร์การแก้ไขผ่าน:r !cmdฯลฯ หากสิ่งเหล่านั้นถูกล็อคMakefileเป้าหมายจะเป็นเชลล์สคริปต์และ Vim มี:makeคำสั่งซึ่งช่วยให้คุณสามารถรันเชลล์ได้เอง สคริปต์จากภายในตัวแก้ไข ความเป็นไปได้สำหรับการก่อความเสียหายนั้นใหญ่โตเกินกว่าที่กล่องความคิดเห็นนี้จะถูกเก็บไว้
Warren Young

2
หากใครบางคนสามารถใส่ของปลอมในทุบตีในเส้นทางของคุณแล้วใครบางคนสามารถใส่ sudo ปลอมในเส้นทางของคุณ เพื่อให้แน่ใจว่าจริงๆคุณต้องเรียก sudo ใช้เส้นทางแบบเต็ม:/usr/bin/sudo
Lesmana

1
@lesmana: ฉันได้ระบุไว้ในการแก้ไข; โดยพื้นฐานแล้วPATHไม่ใช่ปัญหาเดียว
Warren Young

6
คำอธิบายที่ดี; ปวดหัวมากอ่านมัน
lobi

27

จากโพสต์ ubuntuforumsฉันได้ทำไปแล้ว:

พิจารณาการทดลองต่อไปนี้:

applic@ion:~% sudo su
[sudo] password for applic:
root@ion:/home/applic# env > /tmp/sudo_su_env
root@ion:/home/applic# exit
exit
applic@ion:~% sudo -s
applic .bashrc read...
root@ion:~% env >/tmp/sudo_s

นี่คือความแตกต่างที่ฉันพบ:

ด้วยsudo -s:

HOME=/home/applic
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
reads $USER's ~/.bashrc

ด้วยsudo su:

HOME=/root
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
reads /etc/environment
reads /root/.bashrc

$HOMEเห็นความแตกต่างใน การรูทและ$HOMEตั้งค่าเป็นบ้านผู้ใช้ปกติสามารถทำให้เกิดปัญหาได้ ตัวอย่างเช่นหากคุณเรียกใช้แอปแบบกราฟิกผู้ใช้ปกติ~/.Xauthorityสามารถถูกแทนที่ด้วยรูท สิ่งนี้ทำให้เกิดปัญหาผู้ใช้ปกติในภายหลังเช่นไม่สามารถเรียกใช้แอพแบบกราฟิกผ่าน cron

เพื่อสรุป:

                                     corrupted by user's 
        HOME=/root  uses root's PATH     env vars
sudo -i     Y       Y[2]                 N
sudo -s     N       Y[2]                 Y
sudo bash   N       Y[2]                 Y
sudo su     Y       N[1]                 Y
  1. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games อาจกำหนดโดย /etc/environment
  2. PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

บรรทัดล่างsudo -iคือคำสั่งที่เหมาะสมในการทำงานเมื่อคุณต้องการรูทเชลล์ที่ไม่ได้ทาสีโดยสภาพแวดล้อมของผู้ใช้


1
สภาพแวดล้อมที่ 'เสีย' นั้นขึ้นอยู่กับการกำหนดค่าของsudo(ใน/etc/sudoersและไฟล์ที่เกี่ยวข้อง) ด้วย การตั้งค่าเช่นalways_set_home, env_reset, env_keep, env_checkและenv_resetและสิ่งเหล่านี้อาจแตกต่างกันไปขึ้นอยู่กับผู้ใช้และคำสั่ง ดู'สั่งสิ่งแวดล้อมและsudoers OPTIONSส่วนของsudoers (5) manpage
Curt J. Sampson

โดยส่วนตัวแล้วฉันจะไปด้วยsudo -Hsเมื่อฉันต้องการสภาพแวดล้อมที่ไม่สะอาดโดยการตั้งค่าของฉันเพราะฉันใช้ zsh และบัญชีแอปพลิเคชันทั้งหมดที่ฉันอาจเปลี่ยนไปใช้ทุบตี สิ่งนี้ช่วยให้ตัวแปรสภาพแวดล้อมจำนวนหนึ่งผ่านการไม่ได้รับอนุญาต แต่โดยทั่วไปแล้วฉันจะพบตัวแปรที่ถูกเขียนทับโดย /etc/profile.d/*
Ed Grimm

7

su( s witch u ser หรือs ubstitute u ser) ช่วยให้คุณสลับผู้ใช้ suโดยทั่วไปจะเริ่มเชลล์อินสแตนซ์อื่นด้วยสิทธิ์ของผู้ใช้ที่ต้องการ โดยค่าเริ่มต้นมันสลับคุณเป็นrootผู้ใช้ถ้าเราต้องการสลับผู้ใช้เฉพาะเราต้องผ่านผู้ใช้ดังนี้

$ su bob  # switches to bob (requires bob's password)

su -หมายถึงตัวแปรสภาพแวดล้อมจะถูกรีเซ็ตเป็นรูทและsuหมายถึงตัวแปรสภาพแวดล้อมในฐานะผู้ใช้เก่า

ตัวอย่างเช่น: ไดเรกทอรีบ้านรากถ้าคุณใช้หรือไดเรกทอรีบ้านของผู้ใช้เก่าถ้าคุณใช้su -su

sudo ( s uper U ser ทำ ) rootเป็นอรรถประโยชน์บรรทัดคำสั่งที่ช่วยให้ผู้ใช้สามารถเรียกใช้โปรแกรมที่มีสิทธิพิเศษในการรักษาความปลอดภัยของผู้ใช้อื่นโดยค่าเริ่มต้นเป็นเช่น มันใช้ไฟล์กำหนดค่า/etc/sudoersซึ่งแสดงรายการที่ผู้ใช้มีสิทธิ์ในการกระทำที่เฉพาะเจาะจง

sudo ควรจะอ่าน/ Sudu / ไวยากรณ์sudo commandเช่นs witch u ser และทำคำสั่งนี้

  • suเทียบเท่าsudo -iและจำลองการล็อกอินเข้าสู่บัญชีรูท ไดเรกทอรีการทำงานของคุณจะเป็น/rootและมันจะอ่านรูท.profileอื่น ๆ พรอมต์จะเปลี่ยนจาก $ เป็น # เพื่อระบุว่าคุณมีสิทธิ์เข้าถึงรูต

  • sudo -s เปิดตัวเชลล์ในฐานะรูท แต่จะไม่เปลี่ยนไดเร็คทอรี่สำหรับทำงานของคุณ

  • sudo bash ที่เป็นคำสั่งในการทำงานด้วยbash sudoคำสั่งนี้ทำงาน bashเป็นผู้ใช้ขั้นสูง

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