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.
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"}
).
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é)
Essayez ceci sur Java:
System.out.println("OS: " + System.getProperty("os.name") + ", USER DIRECTORY: " + System.getProperty("user.home"));
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();
}
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.
Vous pouvez utiliser la variable d'environnement $HOME
pour ça.
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()
.
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.
Pour rechercher le répertoire de base de l'utilisateur FOO sur un système UNIX, utilisez ~FOO
. Pour l'utilisateur actuel, utilisez ~
.
eval echo ~ $ Sudo_USER
pourrait fonctionner.
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.
Pouvez-vous analyser/etc/passwd?
par exemple.:
cat /etc/passwd | awk -F: '{printf "User %s Home %s\n", $1, $6}'
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.