我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用户具有相同的环境?
我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用户具有相同的环境?
Answers:
.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'
,或者明确地源.profile
用sudo sh -c '. ~/.profile; echo $PATH'
。
.profile
?你是说/root/.profile
还是/home/user/.profile
?我尝试同时添加export PATH=$PATH:/mydir
两者。没用 我没有尝试过export
,那也不起作用。
查看-E
和-i
选项。
-E
:向安全策略指示用户希望保留其现有环境变量。如果用户没有保留环境的权限,则安全策略可能会返回错误。
-i
:将目标用户的密码数据库条目指定的shell作为登录shell运行。这意味着Shell将读取特定于登录的资源文件,例如.profile或.login。如果指定了命令,则通过外壳的-c选项将其传递到外壳以执行。如果未指定命令,则执行交互式外壳程序。sudo尝试在运行外壳程序之前更改为该用户的主目录。该命令在与用户登录时会收到的环境类似的环境下运行。sudoers(5)手册中的“命令环境”部分记录了当sudoers策略为-i选项如何影响在其中运行命令的环境。正在使用。