有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

macos Java系统。getProperty问题

我发现在我的OSX系统上我有“奇怪”的设置。Java将我的用户名读取为“root”,而不是实际的用户名。我使用的代码使用的是系统。getProperty(“user.name”)调用。所以,我制作了一个独立的snipped(我将其保存在test.java下),用于打印java系统用户。name属性和我的UNIX用户名环境:

class UserName {
public static void main(String[] args) {
   String name;
   name = System.getProperty("user.name");
   System.out.println("user.name="+name);
   name = System.getenv("USER");
   System.out.println("USER="+name);
}
}

如果我把它编译成javac测试。java然后以java用户名运行它(在我的帐户下,而不是根帐户下),它打印以下内容:

user.name=root
USER=vk

我的问题是java在何处/如何设置用户。名称以及为什么将其设置为root而不是我的实际UNIX名称。我不是java专家,也不太了解系统的内部结构。getProperty API

第二个问题是,是否可以在UNIX环境中以某种方式更改此设置,以便正确读取我的用户名

最后可能是我的环境或java配置被破坏,并且有一些隐藏的文件(属性)需要修复


共 (3) 个答案

  1. # 1 楼答案

    Java将从操作系统获得user.name属性,因此,如果您不是以root身份运行或使用sudo启动Java,那么Java可执行文件必须是setuid root

    您可以通过执行以下操作进行检查:

    $ ls -l /path/to/java

    如果java是setuid root,您将看到如下内容:

    -rwsr-xr-x 1 root root 123456 Apr 1 16:59 /path/to/java

    用户执行位中的“s”表示它是一个setuid程序。您可以使用以下方法删除setuid位:

    $ sudo chmod -s /path/to/java

  2. # 2 楼答案

    通过在java可执行文件中关闭setuid位,问题得以解决。感谢David Conrad提供的正确提示。供参考:

    ls -l /usr/bin/java
    -rwsr-xr-x ... /usr/bin/java
    sudo chmod -s /usr/bin/java
    lrwxr-xr-x ... /usr/bin/java
    

    在那之后,一切都得到了正确的报告

  3. # 3 楼答案

    您正在使用sudo运行java,或者在运行su命令并成为root之后运行java。(默认情况下,MacOS可能会以root用户身份运行命令,因为您的用户在administrators组中)

    当以root权限在su命令之后运行时,在Linux(CentOS)上也可以获得相同的输出

    user.name=root
    USER=jdiver