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

Unix 使用sudo运行命令并进入root(sudo-i)并运行该命令,unix,sudo,Unix,Sudo,问题是 运行这两个命令的具体区别是什么 作为root用户,我制作了一个自定义env。变数 export A="abcdef" 然后在根壳中 sudo -i echo $A 返回 abcdef (as expected) 但是,当我回到正常用户并运行 sudo -i echo $A 它返回空行 那么,当您运行命令sudoecho$A时,它是否使用了普通用户提供的环境变量和shell 即使我运行sudo echo$a,也有办法获得abcdef吗 谢谢 编辑1 当你说你已经把一个变量a作

问题是

运行这两个命令的具体区别是什么

作为root用户,我制作了一个自定义env。变数

export A="abcdef"
然后在根壳中

sudo -i
echo $A  
返回

abcdef (as expected)
但是,当我回到正常用户并运行

sudo -i echo $A
它返回空行

那么,当您运行命令sudoecho$A时,它是否使用了普通用户提供的环境变量和shell

即使我运行sudo echo$a,也有办法获得abcdef吗

谢谢


编辑1


当你说你已经把一个变量a作为根,我想你的意思是你是在根的.profile或者类似的东西中做的。-->(是的!)


编辑2

这很有道理 但是有一些麻烦

当我这样做的时候

sudo -i 'echo $A' 
我得到
-bash:echo$A:未找到命令

但是当我这样做的时候

su -c 'echo $A' 
它回馈

abcdef
这辆车怎么了

sudo -i 'echo $A' 

命令?

虽然我无法在我的计算机上复制结果,但指定-I选项将取消设置/删除少量变量

man sudo
-i[命令]

-i(模拟初始登录)选项运行 passwd(5)作为登录shell的目标用户条目。这意味着 将读取特定于登录的资源文件,如.profile或.login 靠贝壳。如果指定了命令,则会将该命令传递给shell以供执行 执行。否则,将执行交互式shell。sudo尝试 在运行shell之前更改到该用户的主目录。信息技术 同时初始化环境,保持显示和术语不变, 设置主页、邮件、SHELL、用户、日志名和路径,以及 Linux和AIX系统上的/etc/environment的内容所有其他 环境变量已删除。


因此,我将尝试不使用-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
设置为root时,我想您的意思是您在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'

是的,你的假设是正确的,但还是有问题。请参考编辑手册。谢谢。语法sudo-i echo'$USER'返回$USER。仅供参考,这是在非root用户上完成的。如果我尝试,sudo-I echo“$user”,那么它将返回我拥有的非root用户huser(就像上面的rnapier)先生,您不知道您的评论对一个可怜的老人有多大帮助!!:P+10