2010-11-24 14 views
0

Ich habe ein Servlet in Tomcat6 ausgeführt. Ich benutze den folgenden Code, um einen Befehl in ubuntu Runtime.getRuntime() auszuführen. Exec ("/ usr/bin/Wein cmd/c etwas.vbs"); Das Problem ist tomcat6 läuft das Programm als "tomcat6" Benutzer, der über Java-Befehl. Also die oben genannten Befehle getErrorStream gibt als "Wein: /home/randeel/.wine ist nicht im Besitz von Ihnen" Ich habe "Wein" mit dem Benutzer "randeel" installiert. Gibt es einen Workaround dafür?java - Ausführen eines Befehls in Linux

Vielen Dank, Rana.

+1

Wenn Sie "chmod a + rwx /home/randeel/.wine" funktioniert es? – PeterMmm

Antwort

2

Ja: Sie müssen den Benutzer wechseln. Versuchen

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

Beachten Sie, dass sudo nach einem Passwort fragen, wenn Sie es anders konfigurieren.

Eine andere, elegantere Lösung ist es, einen kleinen Server als randeel zu betreiben, der auf eine Netzwerkverbindung wartet. Es führt dann den Befehl aus und gibt die Ausgabe über die Netzwerkverbindung zurück. Siehe Dokumentation für java.net.Socket.

+0

hi, wenn ich diesen Befehl ausführen "sudo -l -U randeel/usr/bin/Wein cmd/c some.vbs" ich bekomme die Ausgabe als Text "/ usr/bin/Wein cmd/c some.vbs" jede Lösung dazu? Programm wurde nicht ausgeführt. Ich habe die Sudoers geändert, um nach Passwd zu fragen. – rana123

+0

Probieren Sie es zuerst über die Befehlszeile aus, bis Sie die gewünschte Ausgabe erhalten. Nur wenn das funktioniert, versuchen Sie, den Java-Code zum Laufen zu bringen. –

0

Sie haben 2 Lösungen. 1. Geben Sie mit chmod a + x entsprechende Ausführungsberechtigungen für Wein ein. 2. Wenn Sie # 1 nicht tun möchten, müssen Sie eine Befehlszeile ausführen, die zuerst den Benutzer ändert und dann die Anwendung ausführt. Befehl su USERNAME ändert den aktuellen Benutzer, erfordert jedoch die Eingabe eines Kennworts. Um das Terminal zu emulieren, das das Passwort eingibt, können Sie expect script verwenden.

Dann können Sie Befehl als anderer Benutzer ausführen. Wenn Sie diesen Weg nutzen möchten, würde ich Ihnen empfehlen, ein kurzes Shell-Skript zu schreiben, das diese beiden Aktionen ausführt und dieses Skript von Java aus ausführt.

Die # 2 ist komplizierter. Way # 1 scheint viel einfacher zu sein.

Verwandte Themen