web-dev-qa-db-fra.com

Comment trouver le répertoire personnel d'un utilisateur sous Linux ou Unix?

Comment trouver le répertoire personnel d'un utilisateur arbitraire depuis Grails? Sous Linux, c'est souvent/home/user. Cependant, sur certains OS, comme OpenSolaris par exemple, le chemin est/export/home/user.

45
anon

Pour les systèmes de type UNIX, vous souhaiterez peut-être exécuter "echo ~username" À l'aide du shell (utilisez donc Runtime.exec() pour exécuter {"/bin/sh", "-c", "echo ~username"}).

44
Joachim Sauer

Normalement, vous utilisez l'instruction

String userHome = System.getProperty( "user.home" );

pour obtenir le répertoire personnel de l'utilisateur sur n'importe quelle plate-forme. Voir la documentation de la méthode pour getProperty pour voir ce que vous pouvez obtenir d'autre.

Il peut y avoir des problèmes d'accès que vous voudrez peut-être éviter en utilisant this solution de contournement (en utilisant un fichier de politique de sécurité)

69
Daniel Hiller

Essayez ceci sur Java:

System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
7
Boubakr

Pour un utilisateur arbitraire, en tant que serveur Web:

private String getUserHome(String userName) throws IOException{
    return new BufferedReader(new InputStreamReader(Runtime.getRuntime().exec(new String[]{"sh", "-c", "echo ~" + userName}).getInputStream())).readLine();
}
5
paf0

Si vous essayez de le faire pour un nom d'utilisateur que vous ne pouvez pas coder en dur, cela peut être difficile. Sûr echo ~rbronosky vous indiquerait le chemin vers mon répertoire d'origine /home/rbronosky, mais que faire si rbronosky est dans une variable? Si tu fais name=rbronosky; echo ~$name vous recevez ~rbronosky

Voici un cas réel et la solution:

Vous disposez d'un script que l'utilisateur doit exécuter via Sudo . Le script doit accéder au dossier de départ de l'utilisateur. Vous ne pouvez pas référencer ~/.ssh sinon il se développera en /root/.ssh. Au lieu de cela, vous faites:

# Up near the top of your script add
export HOME=$(bash <<< "echo ~$Sudo_USER")
# Then you can use $HOME like you would expect
cat rsa_key.pub >> $HOME/.ssh/authorized_keys

La beauté de cela est que si le script n'est pas exécuté en tant que Sudo alors $ Sudo_USER est vide, c'est donc fondamentalement la même chose que de faire "echo ~" . Cela fonctionne toujours comme prévu.

Si tu utilises set -o nounset, que vous devriez utiliser, vous voulez faire l'exportation avant cela.

3
Bruno Bronosky

Vous pouvez utiliser la variable d'environnement $HOME pour ça.

3
Torsten Marek

Si vous voulez trouver le répertoire personnel d'un utilisateur spécifique, je ne pense pas que vous puissiez le faire directement.

Lorsque j'ai eu besoin de le faire auparavant depuis Java j'ai dû écrire du code natif JNI qui a encapsulé la famille d'appels UNIX getpwXXX().

3
Alnitak

Je suppose que vous souhaitez trouver le répertoire personnel d'un utilisateur différent. De toute évidence, obtenir la propriété "user.home" serait le moyen le plus simple d'obtenir le répertoire de base de l'utilisateur actuel.

Pour obtenir un répertoire personnel d’utilisateur arbitraire, il faut un peu de finesse avec la ligne de commande:

String[] command = {"/bin/sh", "-c", "echo ~root"}; //substitute desired username
Process outsideProcess = rt.exec(command);
outsideProcess.waitFor();
String tempResult;
StringBuilder sb = new StringBuilder();
while((tempResult = br.readLine()) != null) sb.append(tempResult);
br.close();
return sb.toString().trim();

Maintenant, techniquement, nous devrions avoir un thread en attente sur stdout et stderr pour que les tampons ne se remplissent pas et ne bloquent pas le processus, mais j'espère bien que le tampon pourrait au moins contenir un seul nom d'utilisateur. En outre, vous voudrez peut-être vérifier le résultat pour voir s'il commence par ~ root (ou quel que soit le nom d'utilisateur que vous avez utilisé) juste pour vous assurer que l'utilisateur existe et qu'il est évalué correctement.

J'espère que ça t'as aidé. Votez pour cette réponse si c'est le cas car je suis nouveau dans la contribution à SO et je pourrais utiliser les points.

2
Jared

Pour rechercher le répertoire de base de l'utilisateur FOO sur un système UNIX, utilisez ~FOO. Pour l'utilisateur actuel, utilisez ~.

1
Yuliy

eval echo ~ $ Sudo_USER

pourrait fonctionner.

1
Ole Wolf

Trouvez un Java wrapper pour les fonctions getpwuid/getpwnam(3), ils demandent au système des informations utilisateur par uid ou par nom de connexion et vous récupérez toutes les informations, y compris le répertoire de base par défaut.

1
Keltia

Pouvez-vous analyser/etc/passwd?

par exemple.:

 cat /etc/passwd | awk -F: '{printf "User %s Home %s\n",  $1, $6}'
0
Mark

Le préfixe userdir (par exemple, '/ home' ou '/ export/home') peut être un élément de configuration. Ensuite, l'application peut ajouter le nom d'utilisateur arbitraire à ce chemin.

Avertissement: cela n'interagit pas intelligemment avec le système d'exploitation, donc vous n'auriez pas de chance s'il s'agissait d'un système Windows avec des répertoires utilisateur sur différents lecteurs, ou sur Unix avec une disposition de répertoire personnel comme/home/f/foo,/home/b/bar.

0
Jeff