java - 当 super 用户时 System.getenv() 返回 null

标签 java linux ubuntu

如果我在 Ubuntu 中运行 echo $XDG_CURRENT_DESKTOPsudo echo $XDG_CURRENT_DESKTOP,在这两种情况下我都会得到 Unity。如果我在Java中编写System.getenv("XDG_CURRENT_DESKTOP"),当我在没有 super 用户权限的情况下运行程序时,它会返回Unity,但它会返回null 当我使用 sudo 运行它时。这是怎么回事?

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

关于java - 当 super 用户时 System.getenv() 返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29510845/

相关文章:

java - 在几次 next() 调用后从 ResultSet 获取 RowCount

java - 查询以获取 Elasticsearch 中 id 列表的结果

c - JNA 简单函数调用适用于 Linux (x64),但不适用于 Windows (x86)

python - 设计多进程守护进程

ruby-on-rails - 使用 Chef Cookbook ec 部署 Ruby on Rails 应用程序

java - 如何添加方法并拦截来自不同类的私有(private)字段

java - tomcat 5.5升级到tomcat 7.0需要重新编译所有JSP文件吗

java - 负载测试多线程系统与使用单独进程的系统 - 为什么线程版本要快得多?

python - 使用 python 压缩所有子目录

linux - 无法将存储库克隆到 linux 上的 jenkins