gnude
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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: 11179
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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
| #!/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: 11179
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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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: 11179
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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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: 11179
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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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: 11179
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:
| #!/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)
Anmeldungsdatum: 11. Juli 2014
Beiträge: 806
|
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: 11179
Wohnort: München
|
Dann probier es mal so:
| #!/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'))
|
|