Java 当超级用户

Java 当超级用户,java,linux,ubuntu,Java,Linux,Ubuntu,如果我在Ubuntu中运行echo$XDG\u CURRENT\u DESKTOP和sudo echo$XDG\u CURRENT\u DESKTOP,在这两种情况下我都会得到Unity。如果我在Java中编写System.getenv(“XDG\u CURRENT\u DESKTOP”),当我在没有超级用户权限的情况下运行程序时,它返回Unity,但当我使用sudo运行程序时,它返回null。这是怎么回事 public class GetEnv { public static

如果我在Ubuntu中运行
echo$XDG\u CURRENT\u DESKTOP
sudo echo$XDG\u CURRENT\u DESKTOP
,在这两种情况下我都会得到
Unity
。如果我在Java中编写
System.getenv(“XDG\u CURRENT\u DESKTOP”)
,当我在没有超级用户权限的情况下运行程序时,它返回
Unity
,但当我使用
sudo
运行程序时,它返回
null
。这是怎么回事

public class GetEnv {
        public static void main(String[] args) {
                System.out.println(System.getenv("XDG_CURRENT_DESKTOP"));
        }
}
这是输出:

$ echo $XDG_CURRENT_DESKTOP
$ Unity
$ sudo echo $XDG_CURRENT_DESKTOP
$ Unity
$ javac GetEnv.java
$ java GetEnv
$ Unity
$ sudo java GetEnv
$ null

因为你的
sudo
是错误的

sudo echo $XDG_CURRENT_DESKTOP
将扩展到

sudo echo Unity
在以root用户身份执行之前

如果要保留运行
sudo
的用户的设置,则需要定义应保留在sudo配置中的环境变量

Defaults:suboptimal    env_keep += "XGD_CURRENT_DESKTOP", !requiretty
suboptimal    your_host=NOPASSWD: /user/bin/java
然后您可以按如下方式运行命令:

sudo java GetEnv

它应该向您显示呼叫用户的设置。在您的情况下,
Unity

环境变量的另一个问题是没有将它们复制到超级用户的环境中(因此它们的值将为
null
):

使用
-E
标志执行此操作

sudo -E <command>
sudo-E

这很好,但我确信我的用户不会使用
-E
参数运行程序。有没有办法从Java中解决这个问题?顺便说一下,这是一个设置程序。