Biến môi trường khi chạy với 'sudo'


48

Ví dụ cho câu hỏi của tôi, ~/.bashrctệp của tôi chứa dòng này:

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) có thể tìm thấy các thư viện cần chạy, vì nó được xây dựng với trình biên dịch MKL và Intel. Quy trình này không phải là tốt nhất, nhưng đó là một câu chuyện khác.

Câu hỏi của tôi là làm thế nào tôi có thể vượt qua các biến tùy ý (như các biến trong ~/.bashrc) khi tôi chạy chương trình với 'sudo' (nhưng không phải root)?

Hiện tại, nếu tôi chạy:

sudo python -c "import numpy"

Tôi gặp lỗi:

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

Một số gợi ý như sudo -ihoặc sudo -Ekhông thay đổi bất cứ điều gì ở đây.


Biên tập:

Tôi không thể trả lời câu hỏi của mình (không đủ điểm: D) nhưng tôi sẽ bình luận ở đây, với hy vọng rằng có những người mới Linux khác thắc mắc về sudobẫy.

[Chỉ tạm thời!] Điều này làm việc cho tôi ( ~/.bashrc):

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

Câu trả lời:


57

Các biến môi trường có thể được chuyển đơn giản sau khi sudoở dạng ENV = VALUE và thay vào đó sẽ được chấp nhận bằng lệnh theo sau. Tôi không biết nếu có những hạn chế đối với việc sử dụng này, vì vậy vấn đề ví dụ của tôi có thể được giải quyết bằng:

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"


Tuy nhiên, hôm nay điều này đã làm việc với tôi, trên Raspbian Jessy cho RPi 3 của tôi ... sau gần một tuần bị vỡ đầu tại sao kịch bản của tôi không chạy khi khởi động. Cảm ơn rất nhiều!
DarkCygnus

21

Các -Etùy chọn mà bạn đề cập đến dường như chỉ làm việc tốt:

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

Xin lỗi, nhưng tôi không hiểu câu trả lời của bạn. Bạn có thể cung cấp ví dụ về kịch bản tôi đã đăng ở trên? tức là để có thể chạy sudo python -c "import numpy"với LD_LIBRARY_PATHLD_PRELOADđịnh nghĩa như được viết ở trên?
zetah

2
@zetah: ok, tôi sai, vì nó hoạt động cho biến chung, nhưng không phải cho các biến kiểm soát liên kết dymanic, như đã nêu trong phần SECURITY NOTEScủa sudotrang hướng dẫn.
enzotib

Nó đơn giản hơn (như trong câu trả lời được cung cấp), mặc dù man sudokhông làm rõ và khi người dùng cố gắng theo dõi các tham chiếu được chỉ ra ở đó, rất dễ bị nản lòng bởi tất cả các chi nhánh cần phải theo dõi, để có thể giải mã được Ý nghĩa.
zetah

14

Bạn có thể sử dụng -Etùy chọn sudo để bảo vệ môi trường hiện tại (nếu bạn có quyền làm điều đó)

$ 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

Bạn cần phải chỉnh sửa của bạn sudoersbởi sudo visudovì có thể bạn đã kích hoạt Plugin chính sách an ninh đã được ghi đè của bạn PATHbằng cách secure_pathlựa chọn. Vì vậy, thêm đường dẫn vào danh sách và bạn cũng có thể sử dụng env_keepthay thế, ví dụ:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"

Để kiểm tra xem bạn PATHcó bị ghi đè không, hãy chạy lệnh sau:

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

Xem thêm: Tại sao các biến PATH khác nhau khi chạy qua sudo và su? tại Unix SE


+1, nhưng env_keepkhông hoạt động trên PATH (theo nghĩa sudovẫn sử dụng secure_pathkhi tìm lệnh)
Zanna

0

Điều này làm việc cho tôi ( ~/.bashrc):

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

Nguồn: Theo OP chỉnh sửa


1
Điều này hoạt động, nhưng đó là một ý tưởng tồi vì nó làm cho việc chạy sudokém an toàn hơn
Zanna
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.