用sudo运行命令并进入root(sudo -i)并运行命令

时间:2012-07-31 18:40:23

标签: unix sudo

问题是

运行这两个命令到底有什么区别。

作为一个根,我做了一个自定义环境。变量

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' 

命令?

3 个答案:

答案 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选项。