2012-07-31 330 views
1

问题将是使用sudo运行命令并进入根(sudo -i)并运行命令

运行这两个命令的区别究竟是什么。

作为根,我做了一个自定义env。可变

export A="abcdef" 

然后在根shell

sudo -i 
echo $A 

回报

abcdef (as expected) 

然而,当我回到正常用户和运行

sudo -i echo $A 

返回空行。

所以当你运行sudo echo $ A命令时,它是否使用普通用户的环境变量和shell?

有没有办法让abcdef即使我运行sudo echo $ A?

感谢


编辑1

当你说你已经做出了变量A为根,我假设你的意思是你在根目录的.profile或类似的东西,这样做。 - >


EDIT 2

这是非常合情合理的 但遇到了一些麻烦(是的!)。

当我做

sudo -i 'echo $A' 

我得到
-bash:回声$ A:没有找到命令。

然而,当我做

su -c 'echo $A' 

它还给

abcdef 

什么是错的

sudo -i 'echo $A' 

命令?

回答

0

虽然我无法在我的机器上复制结果,但man page for sudo指定-i选项将取消设置/删除一些变量。

man sudo 

-i [命令]

的-i(模拟初始登录)选项运行在目标用户的 的passwd(5)项作为登录shell指定的壳。这意味着, 特定登录的资源文件,如.profile或.login文件将由外壳读取 。如果指定了一个命令,则将其传递到外壳以执行 。否则,执行交互式shell。 sudo尝试 在运行shell之前更改为该用户的主目录。它 还初始化环境,让DISPLAY和TERM不变, 设置HOME,MAIL,SHELL,USER,LOGNAME,和路径,以及 在Linux和AIX系统的/ etc /环境的内容。 所有其他 环境变量被删除。

所以我会尝试没有-i选项。

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. 

环境被保留两者交互,并通过任何你在命令行中运行。

+0

先生,你不知道有多少你的评论已帮助可怜的老人! :P +10 – 2013-12-11 12:59:53

2

当你说你已经取得了可变A为根,我假设你的意思是你在根目录的.profile或类似的东西,这样做。我假设你的意思是普通用户没有设置A。在这种情况下,以下情况适用:

当您运行命令sudo -i echo $A时,首先由本地shell解释并用$A代替。这导致sudo -i echo,这是实际执行。

你是什么意思是这样的:

sudo -i 'echo $A' 

这传递echo $A到sudo的外壳。

~ rnapier$ sudo -i echo $USER 
rnapier 
~ rnapier$ sudo -i 'echo $USER' 
root 

试试这个语法:

sudo -i echo '$USER' 
+0

是的,你的假设是正确的,但仍有问题。请参阅编辑。谢谢。 – user1566629 2012-07-31 21:00:14

+0

语法sudo -i echo'$ USER'返回$ USER。这只是非root用户完成的。 – user1566629 2012-07-31 22:10:49

+0

如果我尝试sudo -i回显“$ USER”,那么它会返回huser,这是我拥有的非root用户(就像那里的rapier一样) – user1566629 2012-07-31 22:12:57