sudo命令没有源/root/.bashrc


27

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用户具有相同的环境?

sudo  bashrc 

Answers:


32

.bashrc是bash的配置文件,仅当以交互方式执行时。它仅在启动bash时加载,而不在运行其他程序时加载sh(即使通过name调用bash也不会sh)。而且仅当bash是交互式的时才加载,而不是在执行脚本或命令时加载-c

sudo sh -c 'echo $PATH'sudo bash -c 'echo $PATH'不调用交互式外壳,因此.bashrc不涉及。

sudo su; echo $PATH运行root的shell的交互式实例。如果那是bash,~root/.bashrc则被加载。此代码段在echo $PATH此交互式外壳程序终止后立即执行,因此,交互式外壳程序中发生的任何情况均不会影响该代码段最后打印的内容。但是,如果您echo $PATH在交互式shell的开始提示下键入sudo su,则将看到由设置的值~root/.bashrc

由于.bashrc是在每个交互式外壳程序中而不是登录外壳程序(甚至不是交互式登录外壳程序,这是bash的设计缺陷)中调用的,因此定义环境变量是错误的位置。使用.bashrc交互式bash的设置,如键绑定,别名和完成设置。在登录时加载的文件中设置环境变量:~/.pam_environment~/.profile

因此,设置PATH.profile代替.bashrc,并且或者运行一个登录shell sudo -i 'echo $PATH',或者明确地源.profilesudo sh -c '. ~/.profile; echo $PATH'


1
已经解决了许多有关壳的相关问题。...谢谢....

1
如何将其添加到.profile?你是说/root/.profile还是/home/user/.profile?我尝试同时添加export PATH=$PATH:/mydir两者。没用 我没有尝试过export,那也不起作用。
falsePockets

@falsePockets不适用于什么?您应该提出一个新问题,并确切说明您在做什么。
吉尔斯(Gillles)“所以别再邪恶了”

没用的东西与OP试图做的完全一样。我试图将目录添加到我的超级用户的PATH。我不应该问一个新问题,因为那个问题将是这个问题的重复。
falsePockets

@falsePockets但是,显然,您并没有做同样的事情才能到达超级用户帐户。既然您没有说自己在做什么,除了重复我已经回答的内容外,我无所不能。
吉尔斯(Gilles)“所以,别再邪恶了”

14

查看-E-i选项。

-E:向安全策略指示用户希望保留其现有环境变量。如果用户没有保留环境的权限,则安全策略可能会返回错误。

-i:将目标用户的密码数据库条目指定的shell作为登录shell运行。这意味着Shell将读取特定于登录的资源文件,例如.profile或.login。如果指定了命令,则通过外壳的-c选项将其传递到外壳以执行。如果未指定命令,则执行交互式外壳程序。sudo尝试在运行外壳程序之前更改为该用户的主目录。该命令在与用户登录时会收到的环境类似的环境下运行。sudoers(5)手册中的“命令环境”部分记录了当sudoers策略为-i选项如何影响在其中运行命令的环境。正在使用。


3

您可以使用sudo bash,它会bash按照bash手册页/文档中的说明读取启动文件。但是请注意,它可能无法HOME正确设置环境变量。这可以在系统范围内的bash启动文件中修复(在/etc,确切位置取决于发行版)-测试a是否$uid为0。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.