我发现在我的OSX系统上,我有一个很奇怪的"建立。 Java将我的用户名读作" root"而不是我的实际用户名。原来我使用的代码使用System.getPropery(" user.name")调用。所以,我编写了独立剪切(我将它保存在test.java下),它打印了java system user.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 test.java ,然后将其运行(在我的帐户下,而不是root帐户)作为 java UserName ,则会打印以下内容:
user.name=root
USER=vk
我的问题是java在哪里/如何设置user.name以及为什么将它设置为root而不是我的实际UNIX名称。我不是Java专家,也不太了解System.getProperty API的内部。
第二个问题是,可以在UNIX环境中以某种方式更改此设置,以便正确读取我的用户名。
最后可能是我的环境或java配置被破坏,并且有一些应该修复的隐藏文件(属性)。
答案 0 :(得分:3)
通过关闭java可执行文件中的setuid位解决了该问题。谢谢大卫康拉德的正确提示。供参考:
ls -l /usr/bin/java
-rwsr-xr-x ... /usr/bin/java
sudo chmod -s /usr/bin/java
lrwxr-xr-x ... /usr/bin/java
之后,所有事情都得到了妥善报道。
答案 1 :(得分:2)
您正在使用sudo运行java或运行su
命令后成为root用户。 (默认情况下,MacOS默认以root身份运行您的命令,因为您的用户位于管理员组中。)
在具有root权限的su
命令之后运行时,在Linux(CentOS)上也可以获得相同的输出。
user.name=root
USER=jdiver
答案 2 :(得分:0)
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