ทำไมตัวแปร PATH แตกต่างกันเมื่อทำงานผ่าน sudo และ su


39

ใน fedora VM ของฉันเมื่อทำงานกับบัญชีผู้ใช้ของฉันฉันมี/usr/local/binในเส้นทางของฉัน:

[justin@justin-fedora12 ~]$ env | grep PATH
 PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

และเช่นเดียวกันเมื่อทำงานsu:

[justin@justin-fedora12 ~]$ su -
Password: 
[root@justin-fedora12 justin]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/justin/bin

อย่างไรก็ตามเมื่อเรียกใช้ผ่านsudoไดเรกทอรีนี้ไม่ได้อยู่ในเส้นทาง:

[root@justin-fedora12 justin]# exit
[justin@justin-fedora12 ~]$ sudo bash
[root@justin-fedora12 ~]# env | grep PATH
PATH=/usr/kerberos/sbin:/usr/kerberos/bin:/sbin:/bin:/usr/sbin:/usr/bin

ทำไมเส้นทางที่จะแตกต่างกันเมื่อใช้ผ่านsudo?



คำตอบ:


37

/etc/sudoersลองดูที่ ไฟล์เริ่มต้นใน Fedora (เช่นเดียวกับใน RHEL และ Ubuntu และที่คล้ายกัน) รวมถึงบรรทัดนี้:

Defaults    secure_path = /sbin:/bin:/usr/sbin:/usr/bin

ซึ่งทำให้มั่นใจได้ว่าเส้นทางของคุณสะอาดเมื่อใช้งานไบนารีภายใต้ sudo สิ่งนี้จะช่วยป้องกันข้อกังวลบางประการที่ระบุไว้ในคำถามนี้ นอกจากนี้ยังสะดวกถ้าคุณไม่มี/sbinและ/usr/sbinอยู่ในเส้นทางของคุณเอง


อ่าฉันเห็นว่าในไฟล์ของฉัน ดังนั้นไม่ใช่ว่าฉันต้องการ แต่ถ้าฉันเพิ่ม/usr/local/binไปยังคำสั่งนี้แล้วฉันจะเห็นมันในเส้นทางของฉันเมื่อทำงานผ่านsudoใช่ไหม?
Justin Ethier

/usr/local/binฉันแค่พยายามมันและตอนนี้ฉันเห็น ขอบคุณมากที่อธิบายเรื่องนี้!
Justin Ethier

สิ่งที่เกี่ยวกับการเพิ่มเส้นทางผู้ใช้ของคุณสำหรับสคริปต์และไบนารีดังนั้นคุณไม่ต้องเขียนเส้นทางที่แน่นอนเมื่อคุณต้องการsudoตัวอย่างสคริปต์ใน~/bin(หรือเส้นทางใดก็ตามที่คุณใช้) ฉันเพิ่งทำการเปลี่ยนแปลง - ใช้งานได้แค่คิดว่าอาจมีด้านพลิกไปหรือไม่
Emanuel Berg

@mattdm ใช่แล้ว Ubuntu ด้วยเหมือนกันที่ฉันเจอปัญหาใน Ubuntu Vivid เมื่อเล่นกับ VM เหมือนกันสำหรับDebian
kenorb

9

คำสั่งsu -จะดำเนินการโปรไฟล์ผู้ใช้รูทและใช้กับสภาพแวดล้อมของผู้ใช้นั้นรวมถึงพา ธ และอื่น ๆ ที่sudoไม่ทำเช่นนั้น

หากคุณต้องการsudoทำเช่นsu -นั้นให้ใช้ตัวเลือกsudo -i [commandที่จะใช้งานโปรไฟล์ผู้ใช้

หากคุณต้องการsu -ประพฤติเช่นsudoนั้นอย่าใช้เครื่องหมายขีดคั่น - เพียงใช้su [command]


2

คุณสามารถตรวจสอบว่าทำไม (มันแตกต่างกัน) sudo sudo -Vโดยการทำงาน

ตัวอย่างเช่นการรันบน Linux:

$ sudo sudo -V | grep PATH
Value to override user's $PATH with: /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

หมายเหตุ: ใน MacOS / BSD sudo sudo -Vเรียกใช้เพียง:

รายการด้านบนถูก จำกัด เนื่องจากปลั๊กอินนโยบายความปลอดภัยเริ่มต้นในการแจกจ่าย Linux บางรายการ


นี่คือคำอธิบายเพิ่มเติมในman sudoers:

หากsecure_pathตั้งค่าตัวเลือกค่าของมันจะถูกใช้สำหรับPATHตัวแปรสภาพแวดล้อม

secure_path- พา ธ ที่ใช้สำหรับทุกคำสั่งที่รันจาก sudo หากคุณไม่ไว้วางใจคนที่ใช้ sudo เพื่อให้มีPATHตัวแปรสภาพแวดล้อมที่มีเหตุผลคุณอาจต้องการใช้สิ่งนี้

การใช้งานอื่นคือถ้าคุณต้องการให้“ root path” แยกจาก“ เส้นทางผู้ใช้” ผู้ใช้ในกลุ่มที่ระบุโดยตัวเลือกที่จะไม่ได้รับผลกระทบจากexempt_group secure_pathตัวเลือกนี้ไม่ได้ถูกตั้งเป็นค่าเริ่มต้น

หากเป็นเช่นนั้นคุณสามารถเปลี่ยนได้โดยเรียกใช้sudo visudoและแก้ไขไฟล์การกำหนดค่าและแก้ไขsecure_path(เพิ่มพา ธ พิเศษคั่นด้วย:) หรือเพิ่มผู้ใช้ของคุณexempt_group(ดังนั้นคุณจะไม่ได้รับผลกระทบจากsecure_pathตัวเลือก)

หรือเพื่อส่งผ่านPATHชั่วคราวของผู้ใช้คุณสามารถเรียกใช้:

sudo env PATH="$PATH" my_command

และคุณสามารถตรวจสอบได้โดย:

sudo env PATH="$PATH" env | grep ^PATH

ดูเพิ่มเติม: วิธีการsudoรักษา$PATH?


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

ดังนั้นคุณสามารถใช้env_keepตัวเลือก (ไม่แนะนำสำหรับเหตุผลด้านความปลอดภัย ) เพื่อรักษาตัวแปรสภาพแวดล้อมของผู้ใช้ของคุณ:

Defaults        env_reset
Defaults        env_keep += "PATH PYTHONPATH"

1

ใน linuxes ส่วนใหญ่คุณติดตั้งโปรแกรมผ่านการจัดการแพ็คเกจและรับการอัปเดตตามปกติ หากคุณติดตั้งสิ่งที่หลีกเลี่ยงการจัดการแพ็คเกจแพคเกจจะถูกติดตั้งใน / usr / local / bin (ตัวอย่างเช่นหรือ ... / sbin หรือ / opt) และไม่ได้รับการอัพเดตปกติ

ฉันเดาว่าโปรแกรมนั้นไม่ถือว่าปลอดภัยอย่างนั้นและจะไม่ใส่ Root PATH ตามค่าเริ่มต้น


+1 - เจ๋งฉันสงสัยว่าทำไมมันไม่ได้อยู่ในเส้นทางและนั่นก็สมเหตุสมผล สำหรับสิ่งที่คุ้มค่าฉันกำลังสร้าง node.js ตั้งแต่เริ่มต้นเพื่อเล่นกับมันดังนั้นจึงสมเหตุสมผลที่จะใส่ไว้ที่นั่นและทำไมจึงsudoยกเว้นไดเรกทอรีนี้โดยค่าเริ่มต้น
Justin Ethier

@Justin Ethier: ปิดหัวข้อ แต่ดูbugzilla.redhat.com/show_bug.cgi?id=634911
mattdm

1

ฉันเพิ่งลองทำสิ่งนี้เพื่อตัวเองและฉันไม่เห็นพฤติกรรมที่คุณเห็น - เส้นทางของฉันยังคงเหมือนเดิมดังนั้นบางทีการกำหนดค่า sudo ของคุณอาจแตกต่างออกไป หากคุณตรวจสอบman sudoersคุณจะเห็นว่ามีตัวเลือกที่เรียกว่าsecure_pathรีเซ็ตPATH- ดูเหมือนว่าตัวเลือกนี้อาจถูกเปิดใช้งาน


น่าสนใจ นี่คือวันที่ Fedora 12 สำหรับสิ่งที่คุ้มค่า ...
Justin Ethier

1

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

หากที่ถูกต้องจากนั้นความแตกต่างในPATHการโกหกในแฟ้มการกำหนดค่า: /etc/profile, ~/.bash_profile, ~/.bash_login, ~/.profileจะดำเนินการ (ตามลำดับ) สำหรับเปลือกเข้าสู่ระบบในขณะที่~/.bashrcจะถูกดำเนินการสำหรับเปลือกโต้ตอบที่ไม่เข้าสู่ระบบ


0

คำถามเก่า ๆ ฉันรู้ แต่ตอนนี้ฉันสะดุดเพราะฉันกำลังตรวจสอบปัญหาที่แน่นอนนี้

ด้วยเหตุผลบางอย่างเป็นเพียงในเส้นทางเมื่อกลายเป็นรากผ่าน/usr/local/bin sudo su -เมื่อใช้sudo -iมันไม่ได้อยู่ที่นั่น แน่นอนตอนนี้ฉันรู้ว่าฉันสามารถเพิ่มลงใน / etc / sudoers ได้ แต่นั่นก็ยังไม่ได้อธิบายว่าทำไมมันถึงมีอยู่หลังจากsu -นั้น ส่วนนี้ของ PATH มาจากไหน

หลังจาก grepping และค้นหามากมายฉันพบคำตอบ:

เส้นทางเริ่มต้นที่มี '/ usr / local / bin' จะถูกฮาร์ดโค้ดใน su (1)

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

ฉันพบว่าสิ่งนี้เป็นจริงใน RHEL6 และ RHEL7 ฉันไม่ได้ตรวจสอบเวอร์ชั่นหรือการกระจายอื่น ๆ


อย่าถามฉันว่าฉันจะตรวจสอบเรื่องนี้ได้อย่างไรโอเคถ้าคุณยืนยัน: ฉันแก้ไขสำเนาsuไบนารีด้วยเลขฐานสิบหกเปลี่ยน/usr/local/binเป็นอย่างอื่นและเรียกใช้สำเนา เส้นทางของฉันตอนนี้มีสตริงที่ปรับเปลี่ยน ... เด็กดีและผู้ดูแลระบบที่ไม่ขี้เกียจเพียงแค่ดาวน์โหลดซอร์สและเช็คอินที่นั่น ;-)
ออสการ์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.