ฉันจะทำให้ sudo รักษาตัวแปรสภาพแวดล้อมของฉันได้อย่างไร


47

การใช้ sudo 1.7.4p4 บน Solaris 5.10 และ sudo 1.6.7p5 บน RHEL4 u6 ฉันไม่เห็นวิธีการรักษาตัวแปรสภาพแวดล้อมของฉันเช่น $ PYTHONPATH ฉันได้เพิ่มบรรทัดนี้ใน sudoers แต่ก็ไม่ได้สร้างความแตกต่าง:

Defaults !env_reset

ฉันกำลังทำอะไรผิดหรือการติดตั้ง sudo ไม่เคารพธง env_reset หรือไม่?

แก้ไข: อย่างน้อยใน Solaris เราพบว่าปัญหานี้ขึ้นอยู่กับเชลล์! เชลล์รูทมาตรฐานคือ Bourne หากเรารัน bash ภายใต้ sudo ( sudo bash) ในทางกลับกัน! env_preset จะรักษาสภาพแวดล้อม (รวมถึง PATH และ LD_LIBRARY_PATH) นี่เป็นพฤติกรรมที่ค่อนข้างสับสนที่ฉันต้องพูด


คำตอบ:


44

ใช้อย่างระมัดระวังมีปัญหาด้านความปลอดภัยกับ sudo และตัวแปร

จากman sudoersฉันพบว่าคุณควรใช้

ค่าเริ่มต้น env_reset
ค่าเริ่มต้น env_keep + = "PYTHONPATH OTHERVARIABLE อื่น ๆ YETANOTHER"

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


วิ่ง

sudo printenv PATH

และดูว่ามันให้อะไร ที่นี่จะช่วยให้

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin

ตัวอย่างเช่น. ตอนนี้เรียกใช้sudo visudoและเพิ่มบรรทัด

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

แทนที่ด้วยสิ่งที่คุณพบมาก่อน ต่อท้ายพา ธ ใหม่หากคุณต้องการ

เกี่ยวกับห้องสมุด:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command

ลีนุกซ์ลีนุกซ์ใส่ใจเป็นอย่างมากPATHและคุณควรระวังให้ดีก่อนเล่น ระมัดระวังเป็นพิเศษเกี่ยวกับการเพิ่มเส้นทางเช่น " ." หรือ/home/usernameไม่ปลอดภัย

หนึ่งในอันตรายของการเพิ่มเส้นทางคือมันเปิดขึ้นสำหรับความเป็นไปได้ของไฟล์บนเส้นทางเหล่านี้ที่ถูกดำเนินการโดยการrootเปิดหน้าต่างในการรักษาความปลอดภัยระบบที่อาจถูกโจมตีโดยซอฟต์แวร์ที่เป็นอันตราย อาจมีอันตรายอื่น ๆ เพียงให้แน่ใจว่าคุณรู้ว่าคุณกำลังทำอะไร การข้ามsudoมาตรการความปลอดภัยอาจทำให้ Solaris ของคุณปลอดภัยเท่ากับ Windows XP


ขอบคุณสำหรับคำแนะนำ บน Solaris เป็นอย่างน้อยปรากฏว่า env_keep ใช้งานได้เพียงบางส่วนเท่านั้นเนื่องจากละเว้น PATH และ LD_LIBRARY_PATH บางที sudo ถูกสร้างขึ้นด้วยการตั้งค่าที่ทำให้ปฏิเสธที่จะรักษาตัวแปร "อันตราย" หรือไม่?
aknuds1

มันใช้งานได้กับ vairable อื่นเช่น AKNUDS คุณสามารถเรียกใช้ sudo sudo -V (ใช่ sudo สองครั้ง!) และดูสิ่งที่มันพูด นี่เป็นวิธีแก้ปัญหาข้างต้นใช้งานได้ดีกับ PYTHONPATH แต่ PATH ดูเหมือนจะพิเศษจริงๆ ปัญหาที่แท้จริงคือกับ PATH ใน Ubuntu พวกเขาสร้าง sudo โดยเจตนาทำการรีเซ็ต PATH
user39559

env_keep เก็บรักษา PYTHONPATH และ HOME สำหรับฉันดังนั้นจึงมีการกรองบางอย่างเกิดขึ้น
aknuds1

ในโซลูชันที่แก้ไขแล้วของคุณคุณกำลังแนะนำให้ฉันติดตั้ง sudo PATH อย่างหนักโดยการแก้ไข secure_path ใช่ไหม ฉันไม่คิดว่าฉันต้องการทำเช่นนั้น เราอาจใกล้คำตอบสำหรับคำถามของฉัน ฉันคิดว่า sudo ถูกสร้างขึ้นเพื่อละเว้น reset_env และละเว้นตัวแปรเช่น PATH และ LD_LIBRARY_PATH เมื่อระบุด้วย env_keep ผมคิดว่าผมสามารถทำได้โดยไม่ต้องรักษาเส้นทาง / LD_LIBRARY_PATH ภายใต้ sudo ก็ไม่มีปัญหา แต่ก็ยังคงน่าสนใจที่จะรู้ว่าทำไมมันจะไม่ทำงาน :)
aknuds1

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

8

เล่นซอกับsudoersจะต้องทำด้วยความระมัดระวังในขณะที่คนอื่นได้กล่าวว่า

วิธีที่ง่ายกว่าสำหรับกรณีที่ง่ายกว่าเมื่อมีตัวแปรสภาพแวดล้อมเฉพาะที่คุณต้องการเก็บรักษาคือการส่งผ่านตัวแปรสภาพแวดล้อมที่คุณต้องการโดยตรงผ่าน sudo (ซึ่งจะแสดง[VAR=value]ในวิธีใช้ sudo cmdline)

ดูตัวอย่างเล็ก ๆ นี้ที่ฉันได้สาธิตให้กับตัวแปรมากกว่าหนึ่งตัว

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1

สำหรับPYTHONPATHตัวอย่างดั้งเดิมของคำถามเพียงใช้สิ่งต่อไปนี้:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>

การสร้างนามแฝงสำหรับสิ่งประเภทนี้มีประโยชน์ ชอบมาก

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'

1
อาจเป็นการดีที่จะทำเช่นนั้น - alias sudopy = 'sudo PYTHONPATH = $ PYTHONPATH python' - จากนั้นใช้ sudopy some_script.py
Mac

@AbleMac คุณพูดถูก นั่นเป็นข้อผิดพลาด ... ฉันจะแก้ไข ขอบคุณ!
รัส

3

Defaults !env_resetหน้าตาของคุณโอเคสมมติว่าคุณไม่ได้โทรหา sudo ด้วย-Eตัวเลือก

คุณสามารถลองลบรายการนั้นได้อย่างสมบูรณ์

คุณยืนยันแล้วว่าคุณแก้ไขไฟล์ sudoers ที่ถูกต้องหรือไม่ ฉันเดาว่าอาจเป็น/etc/sudoersหรือ/usr/local/etc/sudoersขึ้นอยู่กับว่าติดตั้งอย่างไร คุณแก้ไขโดยใช้visudoหรือไม่

คุณทำงาน sudo อย่างไร sudo python, sudo su, sudo su -, sudo -s, สิ่งอื่นใด เพียงsudo pythonและsudo suจะรักษาสภาพแวดล้อมของคุณ

สิ่งที่ไม่env | grep PYTHONPATHพูด? หากไม่มีอะไรตรวจสอบให้แน่ใจว่า PYTHONPATH ถูกส่งออกโดยเรียกใช้export PYTHONPATHแล้วลองอีกครั้ง

สิ่งที่ไม่sudo env | grep PYTHONPATHพูด? หากพิมพ์ค่าที่คาดไว้แสดงว่ามีอย่างอื่นกำลังเขียนทับค่า PYTHONPATH ของคุณ อาจเป็น. bashrc หรือ. bash_profile หรือไฟล์การกำหนดค่าทั่วทั้งระบบ


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

1
ลองเปลี่ยนการตั้งค่าที่ไม่สำคัญเช่นeditorหรือpasspromptเพื่อดูว่าคุณมีไฟล์ที่ถูกต้องหรือไม่ หรือใช้ strace, dtrace, truss หรือคล้ายคลึงกันและดูว่าไฟล์เปิดอยู่
Mikel

env | grep PYTHONPATH ขณะที่ผู้ใช้พิมพ์ค่าที่คาดไว้ภายใต้ sudo อย่างไรก็ตามไม่มีการพิมพ์อะไรเลย การแก้ไข sudoers ฉันสามารถมั่นใจได้ว่า PYTHONPATH นั้นได้รับการเก็บรักษาไว้โดยการแก้ไข "env_keep" อย่างไรก็ตาม env_keep จะไม่เก็บ PATH หรือ LD_LIBRARY_PATH ฉันเดาว่า sudo มีข้อ จำกัด ด้านความปลอดภัยที่จะไม่รักษาตัวแปรเช่น PATH และ LD_LIBRARY_PATH หรือไม่ การตั้งค่าเวลาสร้างอาจ?
aknuds1

1
! env_reset ถูกเพิกเฉยเท่าที่ฉันสามารถบอกได้ แต่ฉันสามารถตรวจสอบอีกครั้งในวันพรุ่งนี้ ฉันค่อนข้างแน่ใจว่า env_delete ไม่ได้ถูกตั้งค่า แต่ฉันสามารถตรวจสอบได้เช่นกัน
aknuds1

1
ฉันยืนยันว่า! env_reset ถูกละเว้นและ env_delete ไม่ได้ถูกตั้งค่า
aknuds1

-1

ตามเอกสารของ Ubuntu สำหรับ LD_LIBRARY_PATH :

คุณต้องใช้ไฟล์ /etc/ld.so.conf.d/*.conf

แล้ว:

  1. เพิ่มld.soไฟล์กำหนดค่า/etc/ld.so.conf.d/ด้วยพา ธ ของคุณLD_LIBRARY_PATH

  2. อัปเดตแคชด้วย:

    sudo ldconfig -v
    

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