2010-08-02 7 views
0

Quelle est la meilleure façon de trouver le répertoire de base d'un utilisateur arbitraire (pas nécessairement celui qui exécute le programme) sur un système de type Unix, compte tenu de leur nom d'utilisateur?Quelle est la meilleure façon de trouver le répertoire de base d'un utilisateur arbitraire en Java?

Je cherche à faire quelque chose comme ceci:

public void writeToHomeDirectory(String user){ 
    File homeFolder = new File("~" + user); 

    File f = new File(homeFolder, "A File"); 
    //f.writeStuff() 
} 

Cela ne fonctionne pas comme le « ~ utilisateur » ne se développe pas comme ceci est une caractéristique de la coquille. Y at-il un moyen de le faire en Java, ou est le seul moyen d'implémenter un shell avec Runtime.exec()?

Répondre

0

Désolé de répondre moi-même, mais j'ai eu beaucoup de mal à essayer d'obtenir la commande en particulier juste, donc je vais mettre ceci ici au cas où quelqu'un d'autre arrive à avoir exactement le même problème que moi.

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); 
    } 
} 

Cela était seulement nécessaire pour mon problème particulier - si vous avez besoin que les utilisateurs locaux ou seuls les utilisateurs LDAP, les autres réponses donnent de bien meilleures façons de le faire.

1

Il n'y a pas de moyen facile de le faire en Java. Mais vous pouvez le faire en lisant le fichier "/ etc/passwd", en recherchant l'entrée user et en extrayant le répertoire personnel de l'utilisateur. C'est essentiellement ce que le shell fait ...

+0

Oui, cela semble être une bonne solution. Ne pouvons-nous pas lister les sous-répertoires dans/home/directory et trouver les répertoires personnels de tous les utilisateurs? –

+1

Que faire si les utilisateurs ne sont pas stockés dans/home /? Ils ne sont pas sur notre réseau d'entreprise. Qu'en est-il de Windows? –

+0

J'aime cette réponse, mais je crains que cela ne marche pas pour mes objectifs - nous devons inclure les utilisateurs du réseau (LDAP), qui ne sont pas listés dans/etc/passwd. Je me penche de plus en plus vers l'utilisation d'une commande shell comme "echo ~ user" ou "finger user". – Scott

0

J'imagine que les informations sur tous les utilisateurs du système seront difficiles à obtenir sans les bons privilèges.

Depuis son système d'exploitation à charge, vous pouvez utiliser la propriété user.home puis remplacer le nom d'utilisateur, de la propriété user.name avec la chaîne utilisateur que vous avez passé dans la méthode:

String user = "..."; // found elsewhere 
    String home = System.getProperty("user.home"); 
    String newUserHome = home.replace(System.getProperty("user.name"), user); 

Ce au moins garde la convention de la place du système d'exploitation actuel pour les répertoires personnels des utilisateurs, qui pourraient avoir été personnalisés. Si les répertoires personnels de l'utilisateur ne sont pas dans un emplacement cohérent (et je ne peux pas imaginer que ce soit toujours le cas), alors tous les paris sont hors OMI.

+0

Si vous avez des utilisateurs du réseau LDAP, vous pouvez placer leurs répertoires personnels sur n'importe quel partage NFS de votre choix, afin qu'ils ne se trouvent pas dans le même dossier. Belle pensée latérale, cependant. – Scott

0

Vous pouvez exec 'sh' pour qu'il évalue le ~. mais c'est une exigence étrange. Les chances sont que vous n'aurez pas accès en écriture de toute façon, peut-être même pas l'accès en lecture.

Questions connexes