Announcement

Collapse
No announcement yet.

Runtime.exec() - 7Jahre alter Bug - wie am besten Umgehen?!

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Runtime.exec() - 7Jahre alter Bug - wie am besten Umgehen?!

    Hallo allerseits. Bin der Neue hier und hoff hiermit nen hilfreiches Forum gefunden zu haben! :-)
    <br>
    Und schon gehts los! Folgendes Szenario:
    <br>
    Ich möchte mit Runtime.exec() unter Linux den pppd starten, welcher als der Gruppe "dialout" besitzt und da ich dem pppd die Ausführungsrechte für "others" natürlich nehmen möchte, sollen nur noch User dieser Gruppe diesen steuern können... Also RechteLevel: 750
    <br>
    Nun ist mein User also in dieser Gruppe und ein starten des pppd von Console aus funktioniert wunderbar.
    Java allerdings meint, dass es den pppd durch fehlende Rechte nicht ausführen darf und wirft eine IOException auf den Versuch hin...
    <br>
    Dieser Fehler ist bekannt existiert nun wie ich les seit etwa 7Jahren:
    <a href="http://bugs.sun.com/bugdatabase/view_bug.do;:YfiG?bug_id=4052517" target="_blank">Tolle Sache...</a>
    <br>
    <br>
    Eine Möglichkeit wäre nun, wie dort auch zu lesen ist, die dem pppd die Hauptgruppe des Users zu geben: "users" in meinem Fall...
    Das kann aber wohl kaum ne Lösung sein, da dann wieder fast jeder an den pppd rankommt und dieser nunmal in "dialout" o.ä. gehört...
    <br>
    Nun steht dort ich möge den Umweg über "/bin/sh" gehen... Genau DIES versuch ich nun leider vergeblich so wie ichs gern haben möchte!
    Denn das richtige Command zum umgehen des Bugs wäre somit in meinem Falle(und auf der Console funktionierts auch so prima):
    /bin/sh -c "/usr/sbin/pppd call slylcr.tmpl"
    <br>
    Wenn ich nun aber folgendes ausführe...
    Runtime.exec("/bin/sh -c \"/usr/sbin/pppd call slylcr.tmpl\"");
    ... dann meint er:
    Starte pppd mit: /bin/sh -c "/usr/sbin/pppd call slylcr.tmpl"
    PPPD-Error: call: -c: line 0: unexpected EOF while looking for matching `"'
    PPPD-Error: call: -c: line 1: syntax error: unexpected end of file
    <br>
    folgendes dagegen...
    Runtime.exec("/bin/sh -c \"echo\"");
    ... funzt...
    Er scheint also in mit Java ausgeführt in den Hochkommas nur EIN argument zu mögen...
    <br>
    Daher würde ja zur Not folgendes dagegen funktionieren...
    Runtime.exec("/bin/sh -c \"myPPPDStartScript.sh\"");
    bzw. sogar(da ja Shellscript)
    Runtime.exec("/bin/sh myPPPDStartScript.sh");
    ... NUR leider möcht ich nicht noch sinnlos nen Shellscript für sowas hinterlegen :-/
    <br>
    So...
    Immer her mit den Ideen ;-)
    Speziell geht es um den slyLCR (<a href="http://www.slylcr.de" target="_blank">www.slylcr.de</a>)
    <br>
    PS zum Forum: Ne geeignete Methode um seine Themen niederzuschreiben wär ganz praktisch, hab mein Post hier grad 4 mal editiert, bis alles passte, da leider nichtmal Links korrekt erkannt werden :-(
    Wieso nicht wie in allen Foren BB-Tags o.ä. für Code etc. Developer sollten damit doch umgehen können ;-)
    <br>
    MfG
    Björn

  • #2
    Da hab ich nun ZEILENWEISE geschrieben und bekomm doch direkt danach lang erwartet ne Idee von meinem Java-Guru(Kumpel ;-) )
    <br>
    Der Denkfehler/Trick liegt doch direkt darin, das Umgehungscommand nicht als String sondern als StringArray zu übergeben:
    String[] command = new String[] {"/bin/sh", "-c", cfg.getBin_pppd() + " call slylcr.tmpl"};

    und schon funztS...

    MfG
    Björ

    Comment


    • #3
      Hi Björn,

      um diesen umständlichen Roundtrip über Arrays als Methodenparameter zu vermeiden, gibts unter Java 5 jetzt Varargs. Nur so als Tipp.

      Gruß ngom
      http://www.winfonet.eu

      Comment


      • #4
        Oh, das schau ich mir gleich mal an! Hab ja schon so einige gute Sachen gesehen in der 5!
        <br>
        Aber beim slyLCR bleib ich mal noch auf der 1.4 zwecks Kompatibilität, da ich bis jetzt gesehen hab, dass man sonst ein Kompatibilitäts-Flag setzen müsste und auf einiges aufpassen muss...
        <br>
        Bei einem so breiten unbekannten Einsatzgebiet, da ich ja die Systeme der Kunden nicht kenn, lohnt es sich da noch nicht...
        Bei eigenen Projekten wo ich die VM festlegen könnte, wird das aber sicher interessant!
        <br>
        Danke

        Comment


        • #5
          Ein Kommando mit bestimmter Gruppenkennung kann man mit 'sg' starten (man sg, man newgrp).

          Also probierte ich mal rum - mit der Gruppe lp statt dialout wie hier, oder scriptinggroup wie im Artikel, aus Faulheit, weil ich ohnehin Mitglied der Gruppe lp bin.

          Ich starte also Listing1 erfolgreich mit:
          <b> java Program "sg lp ./test.sh" </b>
          so daß ich keine varargs brauche.
          - klappt anstandslos.

          Dann testete ich es umgekehrt:
          <b> sg lp "java Program ./test.sh" </b>
          klappt ebenfalls anstandslos.

          Was folgern wir daraus?
          a) Viele Wege führen nach Rom.
          b) Ist der Bug überhaupt ein Bug? Ich kenne die Spezifikationen nicht so genau, und bin zu praktisch orientiert, um lange nach dem Schuldigen zu suchen.
          Ob die sg-Technik genügt, um alle derartigen Probleme zu lösen habe ich nicht abschließend durchdacht.
          <b>sg GRUPPE java FooBar </b> würde jedenfalls scheitern, wenn FooBar 2 Programme aufruft, die unterschiedlichen Gruppen gehören, für die der User Berechtigungen hat.
          c) habe ich vergessen - trage ich nach falls es mir einfällt und wichtig genug war

          Comment

          Working...
          X