ubuntuusers.de

www-data ausführen von Shell und Perl erlauben

Status: Gelöst | Ubuntu-Version: Ubuntu 16.04 (Xenial Xerus)
Antworten |

gnude

Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Hallo es geht noch um dieses Problem: https://forum.ubuntuusers.de/topic/pythonscript-aus-shellscript-aufrufen/ ich möchte das jetzt mit der Brechstande lösen, und meine Idee... wie kann ich www-data erlauben wie jeder anderer user oder root irgendwelche Programme auszuführen? Wenn ich jetzt mittels "su www-data" wechseln möchte sagt er, das www-data nicht aktiv ist.

Bitte keine Sicherheitsdiskussion, das System ist nicht im Internet sondern ein lokales Intranet. Ich brauche nur eine Lösung für das Problem...

jb-alvarado

Anmeldungsdatum:
28. November 2012

Beiträge: 345

Hallo,

grundsätzlich kann der User www-data schon Programme und Script ausführen, außer wenn diese Daten manipulieren möchten die anderen Benutzern gehören. Hier gäbe es dann zwei Möglichkeiten:

Du arbeitest mit visudo, oder du lässt deine Webapp unter einem Nutzer laufen, der die entsprechenden Rechte hat.

Zum herausfinden woran es genau hängt kannst du auch das Script als User www-data ausführen:

sudo -u www-data bash -c './script.sh' 

Vielleicht reicht es auch, das Script etwas zu modifizieren.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Ich habe jetzt diese Fehlermeldung:

root@ubuntuserver:/var/www/html/intranet/hochgeladenes# su www-data -s /bin/bash /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv
import: unable to open X server `' @ error/import.c/ImportImageCommand/364.
/var/www/html/intranet/hochgeladenes/test3.sh: Zeile 4: Syntaxfehler beim unerwarteten Wort »(«
/var/www/html/intranet/hochgeladenes/test3.sh: Zeile 4: `for line in fileinput.input():'
root@ubuntuserver:/var/www/html/intranet/hochgeladenes# 

Hilft das irgendwie weiter? Vielleicht ist die Berechtigung für ein nachgeladenes Modul nicht hoch genug?

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

Für mich sieht das so aus als ob er versuchen würde Python-Code mit der Bash auszuführen - zeig mal den Inhalt von /var/www/html/intranet/hochgeladenes/test3.sh

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input():
    *leading, rest = line.split(maxsplit=3)
    text, *ending = rest.rsplit(maxsplit=4)
    print(';'.join((*leading, text, *ending)))

So sieht die Datei aus...

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

Wenn du die Datei direkt mit der Bash ausführst, wird der Shebang nicht beachtet (und dem Skript würde ich eher die Endung .py statt .sh verpassen, damit klar ist, dass es kein Bash-Script ist) - wenn müsste der Aufruf so aussehen:

su www-data -s /usr/bin/python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv
# oder z.B. auch
su www-data -s /bin/bash -c "python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv"

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

su www-data -s /bin/bash -c "python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv > /var/www/html/intranet/hochgeladenes/ergebnis3.csv"

Per Hand aufgerufen funktioniert. Aber aus dem Script heraus wenn die PHP Datei es aufruft geht es nicht.

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

www-data darf ja nicht so einfach su nutzen - wie genau sieht der Aufruf auf und was schreibt der Webserver ins Log?

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

weiss ich grade nicht. aber ich muss ja nur irgendwie das script ausgeführt bekommen. das übergenordnete shell script läuft. aber mir gelingt es nicht das python script zu starten und die ausgabe in eine datei umzuleiten. wir können auch (ich kann leider kein python) die eingabe und ausgabe datei hart in das script coden. Die ändern sich nicht. Wenn das hilft?

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Im Moment rufe ich es so auf:

/bin/bash -c "python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv > /var/www/html/intranet/hochgeladenes/ergebnis3.csv"

aber das klappt nicht. die Datei ergebnis3.csv ist 0 byte gross.

Bearbeitet von sebix:

Bitte verwende in Zukunft Codeblöcke, um die Übersicht im Forum zu verbessern!

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

Probier es mal mit absolutem Pfad für den Python-Interpreter, ich weiß nicht, wie der PATH bei www-data aussieht:

/bin/bash -c "/usr/bin/python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv > /var/www/html/intranet/hochgeladenes/ergebnis3.csv"

Ansonsten ist ein Blick ins Log des Webservers essentiell, sonst ist das immer nur heiteres Fehlerraten.

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Ich habe das Script um ein "set -x" ergänzt und diese Ausgabe ist in der error.log vom apache2:

[Wed Aug 30 13:28:22.020153 2017] [:error] [pid 2719] [client 11.3.129.24:62639] PHP Notice:  Undefined index: sabrodatei in /var/www/html/intranet/upload.php on line 14, referer: http://test.de/intranet/index.php
+ pdftotext -raw /var/www/html/intranet/hochgeladenes/upload.pdf
+ sed -ne /Einzelpreis\ MwSt/,/Rechnungsbetrag\ EUR/p /var/www/html/intranet/hochgeladenes/upload.txt
+ sed /^$/d /var/www/html/intranet/hochgeladenes/upload.csv
+ tac /var/www/html/intranet/hochgeladenes/ergebnis.csv
+ /var/www/html/intranet/hochgeladenes/test2invert.sh
+ /bin/bash -c /usr/bin/python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv > /var/www/html/intranet/hochgeladenes/ergebnis3.csv
Traceback (most recent call last):
  File "/var/www/html/intranet/hochgeladenes/test3.sh", line 4, in <module>
    for line in fileinput.input():
  File "/usr/lib/python3.5/fileinput.py", line 248, in __next__
    line = self._readline()
  File "/usr/lib/python3.5/fileinput.py", line 362, in _readline
    return self._readline()
  File "/usr/lib/python3.5/encodings/ascii.py", line 26, in decode
    return codecs.ascii_decode(input, self.errors)[0]
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 119: ordinal not in range(128)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

Dann hat der Webserver vermutlich unglückliche LOCALE-Einstellungen, wenn er das Python-Skript aufruft - du kannst das Encoding fest vorgeben, z.B. für utf-8:

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input(openhook=fileinput.hook_encoded("utf-8")):
    *leading, rest = line.split(maxsplit=3)
    text, *ending = rest.rsplit(maxsplit=4)
    print(';'.join((*leading, text, *ending)))

gnude

(Themenstarter)
Avatar von gnude

Anmeldungsdatum:
11. Juli 2014

Beiträge: 843

Das Script hat jetzt beim aufruf 2 Zeilen geschrieben, und ist dann abgebrochen. Daher .... es kommen endlich Daten an, und hier leigt der Fehler in der Decodierung.

Fehlermeldung laut log-Datei:

+ /bin/bash -c /usr/bin/python3 /var/www/html/intranet/hochgeladenes/test3.sh /var/www/html/intranet/hochgeladenes/ergebnis2invert.csv > /var/www/html/intranet/hochgeladenes/ergebnis3.csv
Traceback (most recent call last):
  File "/var/www/html/intranet/hochgeladenes/test3.sh", line 7, in <module>
    print(';'.join((*leading, text, *ending)))
UnicodeEncodeError: 'ascii' codec can't encode character '\xf6' in position 20: ordinal not in range(128)

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11275

Wohnort: München

Dann probier es mal so:

1
2
3
4
5
6
7
#!/usr/bin/env python3
import fileinput

for line in fileinput.input(openhook=fileinput.hook_encoded("utf-8")):
    *leading, rest = line.split(maxsplit=3)
    text, *ending = rest.rsplit(maxsplit=4)
    print(';'.join((*leading, text, *ending)).encode('utf-8'))
Antworten |