sudo 命令不来源 /root/.bashrc

sudo 命令不来源 /root/.bashrc

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

因此,设置PATHin.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,具体位置取决于发行版) - 测试是否为$uid0。

相关内容