使用’sudo’运行时的环境变量

作为我的问题的例子,我的~/.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和英特尔编译器构建的。 这个工作流程不是最好的,但这是另一个故事。

我的问题是当我使用’sudo’(但不是root)运行程序时,如何传递任意变量(如~/.bashrc变量)?

目前,如果我运行:

 sudo python -c "import numpy" 

我收到一个错误:

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

一些建议如sudo -isudo -E在这里没有任何改变。


编辑:

我无法回答我的问题(不够点:D)但我会在这里发表评论,希望有其他Linux新手对sudo陷阱感到疑惑。

[只是暂时!]这对我~/.bashrc~/.bashrc ):

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

环境变量可以简单地在sudo之后以formsENV = VALUE传递,并且可以通过follow命令接受。 如果对这种用法有限制,我不知道,所以我的示例问题可以用以下方法解决:

 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" 

你提到的-E选项似乎工作正常:

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

您可以使用-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. 

您需要通过sudo visudo编辑您的sudoers ,因为您可能启用了安全策略插件,该插件会通过secure_path选项覆盖您的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 

另请参阅: 通过sudo和su运行时,为什么PATH变量不同? 在Unix SE

这对我~/.bashrc~/.bashrc ):

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

来源:根据OP编辑