在类似Unix的系统上找到任意用户的主目录(不一定是运行程序的主目录)的最佳方法是什么,给定用户名?
我希望做这样的事情:
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的唯一方法?
答案 0 :(得分:1)
在Java中没有简单的方法可以做到这一点。但是你可以通过阅读“/ etc / passwd”文件来查找user
的条目并解压缩用户的主目录。这基本上就是shell的作用......
答案 1 :(得分:1)
很抱歉自我回答,但我有很多人都在努力试图让命令特别正确,所以我会把它放在这里以防万一其他人碰巧和我有完全相同的问题。
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用户,其他答案可以提供更好的方法。
答案 2 :(得分:0)
我想如果没有合适的权限,很难获得有关系统中所有用户的信息。
由于它依赖于操作系统,您可以使用属性user.home
,然后使用您传递给方法的用户String替换属性user.name
中的用户名:
String user = "..."; // found elsewhere
String home = System.getProperty("user.home");
String newUserHome = home.replace(System.getProperty("user.name"), user);
这至少保留了当前操作系统对用户主目录的位置的约定,这可能是自定义的。如果用户主目录不在一致的位置(我无法想象那种情况),那么所有的赌注都不在IMO。
答案 3 :(得分:0)
你可以执行'sh'来评估〜。但这是一个奇怪的要求。可能的情况是你无论如何都不会有写入权限,甚至可能都没有读取权限。