Andreas Flückiger: Perlscript mit Benutzerrechten 711 starten

Hallo!

Ist es möglich, ein Perlscript mit Benutzerrechten 711 zu starten?
z.B. mit #!su -c "/usr/bin/perl" username

Gruss
Andreas

  1. Hallo Andreas

    Ist es möglich, ein Perlscript mit Benutzerrechten 711 zu starten?

    Ich kenn mich zwar nicht so aus in diesen Dingen, aber meinem Verstaendnis nach muss eine Datei, die ausgefuehrt werden soll, auch eingelesen werden. Und wenn ein Prozess, der nicht der Datei-Owner selber ist, keine Leserechte hat, passiert eben nichts in der Hinsicht.

    viele Gruesse
      Stefan Muenz

    1. Hallo Stefan

      Ich kenn mich zwar nicht so aus in diesen Dingen, aber meinem Verstaendnis nach muss eine Datei, die ausgefuehrt werden soll, auch eingelesen werden. Und wenn ein Prozess, der nicht der Datei-Owner selber ist, keine Leserechte hat, passiert eben nichts in der Hinsicht.

      Das ist eben mein Problem. Daher dachte ich an eine Lösung, die den Perl-Interpreter unter meinem User aufruft.
      #!su -c "/usr/bin/perl %" username
      würde soetwas machen. Leider funktioniert das nicht, weil der Scriptname beim %-Zeichen als Parameter übergeben werden müsste und weil nach der Eingabe des Befehls nach dem Passwort gefragt würde. Das Passwort kann ich auch nicht per Parameter übergeben.
      Ich hoffe, es findet noch jemand eine Lösung.

      Gruss
      Andreas

      1. #!su -c "/usr/bin/perl %" username
        würde soetwas machen. Leider funktioniert das nicht, weil der Scriptname beim %-Zeichen als Parameter übergeben werden müsste und weil nach der Eingabe des Befehls nach dem Passwort gefragt würde. Das Passwort kann ich auch nicht per Parameter übergeben.

        Genau - so geht es nicht, weil "su" nicht von einer umleitbaren Quelle wie stdin liest (sonst könnte man das Passwort mit "echo" hineinpipen), sondern von einer Dialogstation.

        Ich hoffe, es findet noch jemand eine Lösung.

        Was Du im Prinzip willst, ist die Ausführung eines Programms unter *seiner* Benutzerkennung, nicht unter der des Aufrufers.
        Das geht unter UNIX mit dem s-Bit - wenn es denn ein Programm wäre, das Du ausführen willst. Ist es aber leider nicht, sondern ein Skript, das von einem Programm interpretiert wird.

        Von hinten durch die Brust ins Auge: Es würde funktionieren, wenn Du Dir einen eigenen Perl-Interpreter installierst und diesem das user-s-Bit gibst.
        Eleganter wäre es, das Problem über eine entsprechende Konfiguration des Webservers zu lösen.

        1. Von hinten durch die Brust ins Auge: Es würde funktionieren, wenn Du Dir einen eigenen Perl-Interpreter installierst und diesem das user-s-Bit gibst.
          Eleganter wäre es, das Problem über eine entsprechende Konfiguration des Webservers zu lösen.

          Hi,

          da gibts doch cgiwrap, das genau das tut?! http://www.cc.ukans.edu/~acs/docs/other/cgiwrap.shtml

          ciao,
          rob.

          1. Eleganter wäre es, das Problem über eine entsprechende Konfiguration des Webservers zu lösen.
            da gibts doch cgiwrap, das genau das tut?! http://www.cc.ukans.edu/~acs/docs/other/cgiwrap.shtml

            Hm, wer das installieren darf (und zwar unter root-Berechtigung und mit root-s-Bit - die personifizierte potentielle Sicherheitlücke sozusagen), für den wäre es durchaus eine Möglichkeit.
            Der "private" Perl-Interpreter ist viel ungefährlicher.

        2. Genau - so geht es nicht, weil "su" nicht von einer umleitbaren Quelle wie stdin liest (sonst könnte man das Passwort mit "echo" hineinpipen), sondern von einer Dialogstation.

          Könnte man vielleicht ein kompiliertes Perl/C Programm mit etwa folgendem Code erstellen?

          open(SU,"su -c "/usr/bin/perl $ARGV[2]" $ARGV[0]");
          print SU $ARGV[1];
          close(SU);

          Und dann in der ersten Zeile der Perl-Programme folgendes schreiben?

          #!NameDesObigenScripts username password

          Eleganter wäre es, das Problem über eine entsprechende Konfiguration des Webservers zu lösen.

          Es ist leider nicht mein Server, daher dürfte das weniger in Frage kommen.

          1. Könnte man vielleicht ein kompiliertes Perl/C Programm mit etwa folgendem Code erstellen?
            open(SU,"su -c "/usr/bin/perl $ARGV[2]" $ARGV[0]");
            print SU $ARGV[1];
            close(SU);

            Wie schon gesagt: Würde "su" von stdin lesen, dann ginge das. (Sogar direkt in Perl, ohne kompiliertes Programm.)

    2. Ich kenn mich zwar nicht so aus in diesen Dingen, aber meinem Verstaendnis nach muss eine Datei, die ausgefuehrt werden soll, auch eingelesen werden. Und wenn ein Prozess, der nicht der Datei-Owner selber ist, keine Leserechte hat, passiert eben nichts in der Hinsicht.

      Genau. Es kommt aber darauf an, wer liest.

      Wenn es z. B. ein gebundenes C-Programm ist, dann liest der Programmlader (eine Systemkomponente), und dem würde "711" reichen.

      Ist es aber ein Perl-Skript, dann liest der Perl-Interpreter (ein normales Benutzerprogramm), und dann reicht "711" (besser: "511") nur, wenn der Prozeß unter der Benutzerkennung des Besitzers der Datei abläuft. Das ist aber normalerweise kaum der Fall.