问题是
运行这两个命令到底有什么区别。
作为一个根,我做了一个自定义环境。变量
export A="abcdef"
然后在root shell中
sudo -i
echo $A
返回
abcdef (as expected)
然而,当我回到普通用户并运行
时sudo -i echo $A
它返回空白行。
所以当你运行命令sudo echo $ A时,它是否使用普通用户的环境变量和shell?
即使我运行sudo echo $ A,有没有办法获得abcdef?
由于
编辑1
当你说你以变量A为根时,我认为你的意思是你在root的.profile或类似的东西中做了这个。 - > (是!)
编辑2
这很有道理 但有点麻烦。
当我这样做时
sudo -i 'echo $A'
我得到了 -bash:echo $ A:找不到命令。
但是当我这样做时
su -c 'echo $A'
它回馈
abcdef
有什么问题
sudo -i 'echo $A'
命令?
答案 0 :(得分:2)
如果您想将环境传递给sudo
,请使用sudo -E
:
-E The -E (preserve environment) option indicates to the
security policy that the user wishes to preserve their
existing environment variables. The security policy may
return an error if the -E option is specified and the user
does not have permission to preserve the environment.
环境以交互方式和通过命令行运行的任何内容保存。
答案 1 :(得分:2)
当你说你以变量A
为根时,我认为你的意思是你在root的.profile或类似的东西中这样做了。我认为你的意思是普通用户没有设置A
。在这种情况下,以下情况适用:
运行命令sudo -i echo $A
时,首先由本地shell解释,$A
被替换。这导致sudo -i echo
,这是实际执行的。
你的意思是:
sudo -i 'echo $A'
将echo $A
传递给sudo shell。
~ rnapier$ sudo -i echo $USER
rnapier
~ rnapier$ sudo -i 'echo $USER'
root
试试这个语法:
sudo -i echo '$USER'
答案 2 :(得分:0)
虽然我无法在我的机器上复制结果,man page for sudo指定-i选项将取消/删除少量变量。
man sudo
-i [command]
-i(模拟初始登录)选项运行在中指定的shell passwd(5)将目标用户的条目作为登录shell。这意味着 将读取特定于登录的资源文件,例如.profile或.login 由壳。如果指定了命令,则将其传递给shell 执行。否则,执行交互式shell。 sudo尝试 在运行shell之前更改到该用户的主目录。它 也初始化环境,使DISPLAY和TERM保持不变, 设置HOME,MAIL,SHELL,USER,LOGNAME和PATH,以及 Linux和AIX系统上/ etc / environment的内容。 所有其他 环境变量已被删除。
所以我会尝试不使用-i选项。