2

问题是

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

作为根,我制作了一个自定义环境。多变的

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 时,我假设您的意思是您在 root 的 .profile 或类似的东西中执行了此操作。-->(是的!)


编辑 2

这很有意义,但有一些麻烦。

当我做

sudo -i 'echo $A' 

我得到
-bash: echo $A: command not found。

但是,当我这样做时

su -c 'echo $A' 

它回馈

abcdef

有什么问题

sudo -i 'echo $A' 

命令?

4

3 回答 3

3

如果要将环境传递给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.

环境会以交互方式保存,也可以通过您从命令行运行的任何内容保存。

于 2012-07-31T20:05:54.613 回答
2

当您说您已将变量设置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'
于 2012-07-31T20:20:29.653 回答
0

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

man sudo

-i [命令]

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

所以我会尝试不使用 -i 选项。

于 2012-07-31T20:00:50.827 回答