2010-11-24 3 views
0

J'ai une servlet qui s'exécute dans tomcat6. J'utilise le code suivant pour exécuter une commande dans ubuntu Runtime.getRuntime(). Exec ("/ usr/bin/wine cmd/c some.vbs"); le problème est tomcat6 exécute le programme en tant qu'utilisateur "tomcat6", la commande java ci-dessus. Donc, les commandes ci-dessus getErrorStream renvoie "wine: /home/randeel/.wine n'appartient pas à vous" J'ai installé "wine" en utilisant l'utilisateur "randeel". Y at-il une solution de contournement pour cela?java - exécute une commande dans linux

Merci, Rana.

+1

Si vous faites "chmod a + rwx /home/randeel/.wine" cela fonctionne? – PeterMmm

Répondre

2

Oui: Vous devez changer d'utilisateur. Essayez

Runtime.getRuntime().exec("sudo -U randeel /usr/bin/wine cmd /c some.vbs"); 

Notez que sudo demandera un mot de passe sauf si vous configurez autrement.

Une autre solution, plus élégante, consiste à exécuter un petit serveur randeel qui attend une connexion réseau. Il exécute ensuite la commande et renvoie la sortie via la connexion réseau. Voir la documentation pour java.net.Socket.

+0

salut, quand j'exécute cette commande "sudo -l -U randeel/usr/bin/vin cmd/c some.vbs" je reçois la sortie en tant que texte "/ usr/bin/vin cmd/c some.vbs" toute solution pour que? programme n'a pas fonctionné. J'ai changé les sudoers pour demander aucun passwd. – rana123

+0

Essayez-le à partir de la ligne de commande d'abord jusqu'à ce que vous obteniez la sortie souhaitée. Seulement quand cela fonctionne, essayez de faire fonctionner le code Java. –

0

Vous avez 2 solutions. 1. donne les permissions d'exécution appropriées à wine en utilisant chmod a + x. 2. Si vous ne voulez pas faire # 1 vous devez exécuter la ligne de commande qui change d'abord l'utilisateur, puis exécute l'application. La commande su USERNAME modifie l'utilisateur actuel mais nécessite un mot de passe. Pour émuler le terminal qui tape le mot de passe, vous pouvez utiliser le script expect.

Ensuite, vous pouvez exécuter la commande en tant qu'utilisateur différent. Si vous allez utiliser de cette façon, je vous recommande d'écrire un script shell court qui effectue ces 2 actions et exécute ce script à partir de Java.

Le numéro 2 est plus compliqué. Way # 1 semble être beaucoup plus simple.

Questions connexes