2010-11-15 4 views
3

Je suis en train de changer l'utilisateur du processus de l'enfant à un utilisateur avec des privilèges mineurs mais quand j'exécute la méthode de début de ProcessBuilder l'exécutif subprocess avec le même utilisateur du parentChanger l'environnement utilisateur avec ProcessBuilder + java

 LinkedList<String> commands = new LinkedList<String>(); 
     commands.add("vlc"); 
     ProcessBuilder builder = new ProcessBuilder(commands); 
     Map<String,String> enviroment = builder.environment(); 
     enviroment.clear();    
     enviroment.put("USER", "otheruser"); 
     enviroment.put("LOGNAME", "otheruser"); 
     enviroment.put("PWD", "/home/otheruser"); 
     enviroment.put("HOME", "/home/otheruser"); 
     enviroment.put("USERNAME", "otheruser"); 
     enviroment.put("SHELL", "/bin/false"); 
     builder.directory(new File("/home/otheruser"));    

     Process process = builder.start(); 
     process.waitFor(); 

Je travaille sous Linux (Ubuntu)

Répondre

0

Vous ne pouvez pas modifier l'utilisateur efficace tout en passant dans une autre variable d'environnement USER. Ceci est une fonctionnalité de sécurité de Linux (et Unix en général), sinon un utilisateur malveillant pourrait simplement définir la variable USER à ROOT. Les sous-processus s'exécutent toujours en tant que même utilisateur que le parent sauf si l'exécutable est marqué setuid ou si le processus fait un setuid() pour changer l'utilisateur effectif (et que setuid() est autorisé).

3

Jim a absolument raison. Mais si vous voulez toujours exécuter votre programme en tant qu'utilisateur différent, vous devez utiliser des outils dépendants de la plate-forme utilisateur.

Windows: Utiliser la commande runas, par exemple: runas/user: domain \ jamesbond regedt32.exe Malheureusement, runas demande à l'utilisateur de taper le mot de passe manuellement. L'article suivant explique comment contourner le problème: http://www.windowsnetworking.com/kbase/WindowsTips/WindowsXP/AdminTips/Miscellaneous/RunprogramsasanotheruserinWindows2000WindowsXP.html

Sinon, vous pouvez écrire votre propre utilitaire VBS et l'exécuter à partir de Java. Voir ce post pour plus de détails: http://weblogs.asp.net/hernandl/archive/2005/12/02/startprocessasuser.aspx

Unix: voir la référence de su et sudo. su est bien mais il faut aussi un mot de passe (sauf si l'utilisateur actuel est root). Pour contourner ce problème, vous pouvez créer un script expect (voir http://en.wikipedia.org/wiki/Expect). Expect est installé par défaut sur la plupart des distributions Unix.

Bonne chance!

Questions connexes