什么';在Java中,查找任意用户的主目录的最佳方法是什么?
在类Unix系统上,如果给定任意用户(不一定是运行程序的用户)的用户名,找到其主目录的最佳方法是什么 我想做这样的事情:什么';在Java中,查找任意用户的主目录的最佳方法是什么?,java,Java,在类Unix系统上,如果给定任意用户(不一定是运行程序的用户)的用户名,找到其主目录的最佳方法是什么 我想做这样的事情: public void writeToHomeDirectory(String user){ File homeFolder = new File("~" + user); File f = new File(homeFolder, "A File"); //f.writeStuff() } 这不起作用,因为“~user”没有展开,因为这是一个sh
public void writeToHomeDirectory(String user){
File homeFolder = new File("~" + user);
File f = new File(homeFolder, "A File");
//f.writeStuff()
}
这不起作用,因为“~user”没有展开,因为这是一个shell功能。在Java中有什么方法可以做到这一点,或者唯一的方法是使用Runtime.exec()运行shell?在Java中没有简单的方法可以做到这一点。但是您可以通过读取“/etc/passwd”文件,查找
user
的条目并提取用户的主目录来完成。这基本上就是shell所做的…我想,如果没有适当的权限,系统中所有用户的信息将很难获得
由于它依赖于操作系统,因此可以使用属性user.home
,然后将属性user.name
中的用户名替换为传递到方法中的用户字符串:
String user = "..."; // found elsewhere
String home = System.getProperty("user.home");
String newUserHome = home.replace(System.getProperty("user.name"), user);
这至少保持了用户主目录在当前操作系统中的位置约定,用户主目录可能已经定制。如果用户主目录不在一个一致的位置(我无法想象这种情况会发生),那么所有的赌注都不在IMO中。您可以执行'sh'让它评估~。但这是一个奇怪的要求。很可能你无论如何都没有写访问权限,甚至可能没有读访问权限。很抱歉自己回答,但我在尝试正确使用该命令时遇到了很多麻烦,所以我将把它放在这里,以防其他人碰巧遇到与我完全相同的问题
private File getHomeDirectoryOf(String username) throws IOException, Exception{
String[] command = new String[]{"/bin/sh", "-c", "echo ~"+username + ""};
Process echo = Runtime.getRuntime().exec(command);
BufferedReader br = new BufferedReader(new InputStreamReader(echo.getInputStream()));
try{
echo.waitFor();
}
catch(InterruptedException e){
}
String path = br.readLine();
echo.destroy();
if(path.contains("~")){
System.out.println("Home directory for " + username + " cannot be found.");
throw new Exception();
}
else{
return new File(path);
}
}
这只是我的特殊问题所必需的—如果您只需要本地用户或LDAP用户,其他答案提供了更好的方法。是的,这似乎是一个很好的解决方案。我们不能在/home/directory中列出子目录并找出所有用户的主目录吗?如果用户没有存储在/home/?他们不在我们的公司网络上。Windows呢?我喜欢这个答案,但我担心它不适合我的目的-我们需要包括网络(LDAP)用户,这些用户没有在/etc/passwd中列出。我越来越倾向于使用像“echo~user”或“finger user”这样的shell命令。也许您可以改为查询LDAP?当然有可用于Java的LDAP库。不能保证该用户将是LDAP用户-只能保证它们可能是LDAP。还希望避免用户在不需要的情况下将LDAP设置放入应用程序。如果您有LDAP网络用户,您可以将他们的主目录放在您想要的任何NFS共享上,因此他们可能不在同一文件夹中。不过横向思维不错。