使用“sudo”运行时的环境变量

zet*_*tah 61 command-line sudo environment-variables

作为我的问题的例子,我的~/.bashrc文件包含以下几行:

export LD_LIBRARY_PATH=/opt/intel/mkl/lib/ia32:$LD_LIBRARY_PATH
export LD_PRELOAD=/opt/intel/mkl/lib/ia32/libmkl_core.so
Run Code Online (Sandbox Code Playgroud)

这样 Numpy (Python) 就可以找到它需要运行的库,因为它是使用 MKL 和英特尔编译器构建的。这个工作流程不是最好的,但这是另一回事。

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

目前,如果我运行:

sudo python -c "import numpy"
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

ImportError: libimf.so: cannot open shared object file: No such file or directory*
Run Code Online (Sandbox Code Playgroud)

一些建议作为sudo -isudo -E不会改变这里的任何内容。


编辑:

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

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

alias sudo='sudo env PATH=$PATH VAR1=SOME_VALUE VAR2=SOME_VALUE...'
Run Code Online (Sandbox Code Playgroud)

zet*_*tah 62

环境变量可以简单地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"
Run Code Online (Sandbox Code Playgroud)


enz*_*tib 28

-E您提到的选项似乎工作得很好:

enzotib@host:~$ export DUMMY=dummy
enzotib@host:~$ sudo -E sh -c 'echo $DUMMY'
dummy
enzotib@host:~$ sudo -E env | grep DUMMY
DUMMY=dummy
Run Code Online (Sandbox Code Playgroud)

  • @zetah:好的,我错了,因为它适用于通用变量,但不适用于动态链接控制变量,如`sudo` 手册页的`SECURITY NOTES` 部分所述。 (2认同)

Eug*_*kov 18

您可以使用-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.
Run Code Online (Sandbox Code Playgroud)


ken*_*orb 12

您需要编辑您的sudoersby,sudo visudo因为您可能启用了安全策略插件,该插件会覆盖您的PATHbysecure_path选项。因此,将路径添加到列表中,您也可以env_keep改为使用,例如:

Defaults env_reset
Defaults env_keep += "PATH PYTHONPATH"
Run Code Online (Sandbox Code Playgroud)

要检查您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
Run Code Online (Sandbox Code Playgroud)

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