ตัวแปรสภาพแวดล้อมเมื่อทำงานด้วย 'sudo'


48

ตัวอย่างของคำถาม~/.bashrcไฟล์ของฉันมีบรรทัดนี้:

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so

เพื่อให้ Numpy (Python) สามารถค้นหาไลบรารี่ที่ต้องการใช้งานได้เนื่องจากมันสร้างด้วยคอมไพเลอร์ MKL และ Intel เวิร์กโฟลว์นี้ไม่ได้ดีที่สุด แต่เป็นอีกเรื่องหนึ่ง

คำถามของฉันคือฉันจะส่งผ่านตัวแปรที่กำหนดเองได้อย่างไร (เช่นใน~/.bashrc) เมื่อฉันรันโปรแกรมด้วย 'sudo' (แต่ไม่ใช่รูท)

ปัจจุบันถ้าฉันวิ่ง:

sudo python -c "import numpy"

ฉันได้รับข้อผิดพลาด:

ImportError: libimf.so: cannot open shared object file: No such file or directory*

คำแนะนำบางอย่างเป็นsudo -iหรือsudo -Eไม่เปลี่ยนแปลงอะไรที่นี่


แก้ไข:

ฉันไม่สามารถตอบคำถามของฉัน (คะแนนไม่เพียงพอ: D) แต่ฉันจะแสดงความคิดเห็นที่นี่ด้วยความหวังว่าจะมีมือใหม่ Linux อื่น ๆ สงสัยเกี่ยวกับกับsudoดัก

[ชั่วคราวเท่านั้น!] ใช้งานได้สำหรับฉัน ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

คำตอบ:


57

ตัวแปรสภาพแวดล้อมสามารถส่งผ่านได้อย่างง่ายดายหลังจากsudoอยู่ในรูปแบบ ENV = VALUE และจะยอมรับโดยคำสั่งที่ติดตาม ฉันไม่ทราบว่ามีข้อ จำกัด ในการใช้งานนี้หรือไม่ดังนั้นปัญหาตัวอย่างของฉันสามารถแก้ไขได้ด้วย:

sudo LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so python -c "import numpy"


จนถึงทุกวันนี้สิ่งนี้ได้ผลกับฉันใน Raspbian Jessy ของฉันสำหรับ RPi 3 ของฉัน ... หลังจากผ่านไปเกือบหนึ่งสัปดาห์ที่ทำให้ฉันงงงวยว่าทำไมสคริปต์ของฉันถึงไม่เริ่มทำงาน ขอบคุณมาก!
DarkCygnus

21

-Eตัวเลือกที่คุณพูดถึงดูเหมือนว่าจะทำงานได้ดี:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy

ขออภัยฉันไม่เข้าใจคำตอบของคุณ คุณสามารถให้ตัวอย่างกับสถานการณ์ที่ฉันโพสต์ข้างต้นได้หรือไม่ เช่นจะสามารถทำงานsudo python -c "import numpy"ด้วยLD_LIBRARY_PATHและLD_PRELOADกำหนดตามที่เขียนไว้ข้างต้น?
zetah

2
@zetah: ตกลงฉันผิดเพราะมันใช้งานได้กับตัวแปรทั่วไป แต่ไม่ใช่สำหรับการเชื่อมโยงตัวแปรควบคุม dymanic ตามที่ระบุไว้ในส่วนSECURITY NOTESของsudoหน้าคู่มือ
enzotib

มันง่ายกว่านั้น (ตามคำตอบที่ให้ไว้) แม้ว่าman sudoจะไม่ชัดเจนและเมื่อผู้ใช้พยายามติดตามการอ้างอิงที่ชี้ไปที่นั่นมันเป็นเรื่องง่ายมากที่จะท้อแท้จากทุกสาขาที่ต้องปฏิบัติตามเพื่อให้สามารถถอดรหัสได้ ความหมาย
zetah

14

คุณสามารถใช้-Eตัวเลือก sudo เพื่อรักษาสภาพแวดล้อมปัจจุบัน (ถ้าคุณมีสิทธิ์ทำเช่นนั้น)

$ man sudo
 -E, --preserve-env
             Indicates to the security policy that the user wishes to preserve
             their existing environment variables.  The security policy may
             return an error if the user does not have permission to preserve
             the environment.

8

คุณจำเป็นต้องแก้ไขsudoersโดยsudo visudoอาจเป็นคุณได้เปิดใช้ปลั๊กอินนโยบายการรักษาความปลอดภัยซึ่งแทนที่ของคุณPATHโดยsecure_pathตัวเลือก ดังนั้นเพิ่มเส้นทางไปยังรายการและคุณสามารถใช้env_keepแทนเช่น:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

ในการตรวจสอบว่าคุณPATHถูกแทนที่หรือไม่ให้เรียกใช้คำสั่งต่อไปนี้:

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

ดูเพิ่มเติม: เหตุใดตัวแปร PATH จึงแตกต่างกันเมื่อทำงานผ่าน sudo และ su ที่ Unix SE


1 แต่env_keepไม่ทำงานบนเส้นทาง (ในความรู้สึกที่sudoยังคงใช้secure_pathเมื่อมองหาคำสั่ง)
Zanna

0

สิ่งนี้ใช้ได้กับฉัน ( ~/.bashrc):

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'

ที่มา: ตามการแก้ไข OP


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