使用“ 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”(而不是root)运行程序时,如何传递任意变量(如中的)?

当前,如果我运行:

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...'

Answers:


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_PATHLD_PRELOAD上述定义为写?
zetah 2011年

2
@zetah:好吧,我错了,因为它适用于一般变量,而不是dymanic联控制的变量,在部分规定SECURITY NOTESsudo手册页。
enzotib

这很简单(尽管在提供的答案man sudo中没有明确说明),并且当用户尝试遵循此处指向的引用时,很容易受到所有需要遵循的分支的劝阻,从而能够解密含义。
zetah 2011年

14

您可以使用-Esudo选项保留当前环境(如果您有权这样做)

$ 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

您需要编辑sudoersby by,sudo visudo因为您可能已启用了安全策略插件,该插件会覆盖PATHby 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

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


+1,但env_keep在PATH上不起作用(从某种意义上说,在查找命令时sudo仍会使用secure_path
Zanna

0

这对我有用(~/.bashrc):

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

来源:根据OP编辑


1
这行得通,但这是一个坏主意,因为它会使运行sudo变得不安全
Zanna
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.