![如何让 sudo 保留我的环境变量?](https://linux22.com/image/1261872/%E5%A6%82%E4%BD%95%E8%AE%A9%20sudo%20%E4%BF%9D%E7%95%99%E6%88%91%E7%9A%84%E7%8E%AF%E5%A2%83%E5%8F%98%E9%87%8F%EF%BC%9F.png)
在 Solaris 5.10 上使用 sudo 1.7.4p4 并在 RHEL4 u6 上使用 sudo 1.6.7p5 时,我看不出如何保存我的环境变量,例如 $PYTHONPATH。我已将此行添加到 sudoers,但没有任何区别:
Defaults !env_reset
是我做错了什么,还是 sudo 安装根本不尊重 env_reset 标志?
编辑:至少在 Solaris 上,我们发现这个问题取决于 shell!标准 root shell 是 Bourne,sudo bash
另一方面,如果我们在 sudo () 下运行 bash,!env_preset 将保留环境(包括 PATH 和 LD_LIBRARY_PATH)。我不得不说,这是一种相当令人困惑的行为。
答案1
谨慎使用,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
看看它给出了什么。这里给出了
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
例如。现在运行sudo visudo
并添加行
Defaults secure_path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/X11R6/bin
用你之前找到的内容替换。如果需要,可以向其附加一条新路径。
关于图书馆:
sudo LD_LIBRARY_PATH=/usr/lib/path/to/a/safe/library your command
Linux 发行版对 非常谨慎PATH
,您在使用它之前确实应该小心谨慎。特别要小心添加“ .
”或 之类的路径/home/username
,这是不安全的。
添加路径的危险之一是,它为这些路径上的文件被执行打开了可能性root
,从而打开了系统安全窗口,恶意软件可能会利用这些窗口。还可能存在其他危险。只需确保您知道自己在做什么。绕过sudo
安全措施可能会使您的 Solaris 变得像 Windows XP 一样安全。
答案2
正如其他人所说的那样,摆弄它sudoers
必须谨慎进行。
当您想要保留特定的环境变量时,对于更简单的情况,一种更简单的方法是直接通过 sudo 传递您想要的环境变量(如[VAR=value]
sudo 命令行帮助中所示)。
请参见这个小例子,其中我还针对多个变量进行了演示。
$ 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
PYTHONPATH
对于问题中的原始示例,只需使用以下内容:
$ sudo PYTHONPATH=$PYTHONPATH python some_script.py
<script_output_here>
为这种类型的东西创建别名很方便。像这样:
$ alias sudopy='sudo PYTHONPATH=$PYTHONPATH python'
答案3
你的Defaults !env_reset
情况看起来还不错,假设你没有使用该-E
选项调用 sudo。
您可以尝试完全删除该条目。
您是否已确认您正在编辑正确的 sudoers 文件?我猜可能是/etc/sudoers
或/usr/local/etc/sudoers
取决于它的安装方式。您是否使用 编辑了它visudo
?
您如何运行 sudo? ,,,,sudo python
还有其他吗?只有和才能保留您的环境。sudo su
sudo su -
sudo -s
sudo python
sudo su
说什么env | grep PYTHONPATH
?如果没有,请确保通过运行导出 PYTHONPATH export PYTHONPATH
,然后重试。
它说了什么sudo env | grep PYTHONPATH
?如果它打印了预期的值,那么其他东西正在覆盖您的 PYTHONPATH 值。可能是 root 的 .bashrc 或 .bash_profile 或系统范围的配置文件。
答案4
sudo su
source ~/.bashrc
cd /home/my_nosudo_user