如何让 sudo 保留我的环境变量?

akn*_*ds1 50 sudo environment-variables solaris-10 redhat-enterprise-linux

在 Solaris 5.10 上使用 sudo 1.7.4p4,在 RHEL4 u6 上使用 sudo 1.6.7p5 我看不到如何保留我的环境变量,例如 $PYTHONPATH。我已将此行添加到 sudoers,但没有任何区别:

Defaults !env_reset
Run Code Online (Sandbox Code Playgroud)

我做错了什么,还是 sudo 安装根本不尊重 env_reset 标志?

编辑:至少在 Solaris 上,我们发现这个问题取决于 shell!标准的 root shell 是 Bourne,sudo bash另一方面,如果我们在 sudo ( )下运行 bash ,!env_preset 将保留环境(包括 PATH 和 LD_LIBRARY_PATH)。我不得不说,这是相当令人困惑的行为。

use*_*559 46

小心使用,sudo 和变量存在安全问题。

man sudoers我发现你应该使用

默认值 env_reset
默认值 env_keep += "PYTHONPATH OTHERVARIABLE YETANOTHER"

在 Ubuntu 中,sudo确实保留了一些变量。sudo -i更像是以 root 身份登录然后运行命令。两者都可能不方便,前者用于sudo nano myfile将 root 拥有的文件留在您的家中,后者sudo -i nano myfile将尝试打开 /root/myfile。


sudo printenv PATH
Run Code Online (Sandbox Code Playgroud)

看看它给了什么。这里给出

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Run Code Online (Sandbox Code Playgroud)

例如。现在运行sudo visudo并添加行

Defaults        secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
Run Code Online (Sandbox Code Playgroud)

替换为您之前发现的内容。如果需要,请为其附加一条新路径。

关于图书馆:

sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command
Run Code Online (Sandbox Code Playgroud)

Linux 发行版PATH非常注意 ,在使用它之前你真的应该小心。添加像 " ." 或 之类的路径时要特别小心/home/username,它是不安全的。

添加路径的危险之一是它打开了这些路径上的文件被执行的可能性root,打开了可能被恶意软件利用的系统安全窗口。可能还有其他危险。只要确保你知道你在做什么。绕过sudo安全措施可能会使您的 Solaris 与 Windows XP 一样安全。


Rus*_*uss 9

sudoers正如其他人所说,摆弄要谨慎行事。

当您想要保留特定环境变量时,对于更简单的情况,更简单的方法是直接通过 sudo 传递您想要的环境变量(如[VAR=value]sudo cmdline 帮助所示)。

请参阅这个小示例,其中我还针对多个变量进行了演示。

$ export MY_V1=1
$ export MY_V2=2
$ printenv | grep MY_V
MY_V2=2
MY_V1=1
$ sudo MY_V1=$MY_V1 MY_V2=$MY_V2 printenv | grep MY_V
MY_V2=2
MY_V1=1
Run Code Online (Sandbox Code Playgroud)

对于问题中的原始PYTHONPATH示例,只需使用以下内容:

$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>
Run Code Online (Sandbox Code Playgroud)

为这种类型的东西创建别名很方便。像这样:

$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
Run Code Online (Sandbox Code Playgroud)