PATH
我在 /root/.bashrc 文件中添加了变量的自定义路径
当我这样做时sudo su; echo $PATH
,它会显示条目“/path/to/custom/bins”。
但我确实这样做sudo sh -c 'echo $PATH'
,这表明,
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
.bashrc 文件中添加的文件夹路径不可见。
sudo命令不是和root用户有同样的环境吗?
答案1
.bashrc
是bash的一个配置文件,只有在交互执行时才有效。它仅在您启动 bash 时加载,而不是在您运行其他程序sh
(例如通过 name 调用 bash sh
)时加载。而且它仅在 bash 交互时加载,而不是在执行脚本或带有-c
.
sudo sh -c 'echo $PATH'
或者sudo bash -c 'echo $PATH'
不调用交互式 shell,因此.bashrc
不涉及。
sudo su; echo $PATH
运行 root shell 的交互式实例。如果是 bash,则已~root/.bashrc
加载。一旦交互式 shell 终止,此代码片段就会执行echo $PATH
,因此交互式 shell 中发生的任何事情都不会影响代码片段最后打印的内容。但是,如果您echo $PATH
在由 启动的交互式 shell 的提示符下键入sudo su
,您将看到由 设定的值~root/.bashrc
。
由于 是.bashrc
在每个交互式 shell 中调用的,而不是由登录 shell 调用的(甚至不是由交互式登录 shell 调用的,这是 bash 中的设计缺陷),因此定义环境变量的位置是错误的。用于.bashrc
交互式 bash 设置,例如键绑定、别名和完成设置。在登录时加载的文件中设置环境变量:~/.pam_environment
或~/.profile
。
因此,设置PATH
in.profile
而不是.bashrc
,然后使用 运行登录 shell sudo -i 'echo $PATH'
,或者.profile
使用显式获取源sudo sh -c '. ~/.profile; echo $PATH'
。
答案2
查看-E
和-i
选项。以下是相应的摘录man sudo
:
-E
:向安全策略表明用户希望保留其现有的环境变量。如果用户没有保护环境的权限,安全策略可能会返回错误。
-i
:运行由目标用户的密码数据库条目指定的 shell 作为登录 shell。这意味着shell 将读取特定于登录的资源文件(例如.profile
或 ) 。.login
如果指定了命令,则会通过 shell 的-c
选项将其传递到 shell 执行。如果未指定命令,则执行交互式 shell。sudo
在运行 shell 之前尝试更改到该用户的主目录。该命令在类似于用户登录时收到的环境中运行。命令环境sudoers(5)
手册中的部分记录了该选项如何影响使用策略-i
时运行命令的环境。sudoers
答案3
您可以sudo bash
,它会读取手册页/文档bash
中记录的启动文件。bash
但请注意,它可能无法HOME
正确设置环境变量。这可以在系统范围的bash
启动文件中修复(在 中/etc
,具体位置取决于发行版) - 测试是否为$uid
0。