使用sudo运行命令并进入根(sudo -i)并运行命令
问题将是使用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'
命令?
虽然我无法在我的机器上复制结果,但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选项。
如果你想你的环境传给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.
环境被保留两者交互,并通过任何你在命令行中运行。
当你说你已经取得了可变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'
是的,你的假设是正确的,但仍有问题。请参阅编辑。谢谢。 – user1566629 2012-07-31 21:00:14
语法sudo -i echo'$ USER'返回$ USER。这只是非root用户完成的。 – user1566629 2012-07-31 22:10:49
如果我尝试sudo -i回显“$ USER”,那么它会返回huser,这是我拥有的非root用户(就像那里的rapier一样) – user1566629 2012-07-31 22:12:57
先生,你不知道有多少你的评论已帮助可怜的老人! :P +10 – 2013-12-11 12:59:53