denkfehler!

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Gast

hi zusammen!

warum geht folgendes skript, wenn ich es über die shell aufrufe, aber nicht wenn ich es über den browser starte?

enstehen soll ein admintool, das mir erlaubt seiten online zu editieren. erster schritt war für mich zu versuchen eine datei per ftp zu holen und in eine textarea zu laden. die htmlseite sehe ich in der shell nicht, aber er fügt korrekt den quellcode an der stelle ein wo ich will.

Code: Alles auswählen

#!/usr/local/bin/python

from seiten import AdminSeite

import ftplib
ftp=ftplib.FTP('meinserver','user','passwort')
ftp.cwd('html/crossover/diplomarbeit')
f=file('definition.htm','w')
ftp.retrbinary('RETR definition.htm',f.write)
f.close()
f=file('definition.htm','r')
content=f.read()
f.close()
admin=AdminSeite(content)
print admin
nun zur fehlermeldung, wenn ich es im browser starte:
IOError: [Errno 13] Permission denied: 'definition.htm'
args = (13, 'Permission denied')
errno = 13
filename = 'definition.htm'
strerror = 'Permission denied'

erbezieht sich dabei auf die zeile:


Code: Alles auswählen

f=file('definition.htm','w')
irgendwo habe ich sicher wiedermal einen denkfehler, aber wo?

mfg

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rolgal,

über den Browser ist der Nutzer ein anderer als wenn du das Script direkt startest.

Code: Alles auswählen

import os
print os.environ['USER']
Gibt dir den Nutzer aus, der das Script laufen lässt. dann musst Du noch dafür sorgen, daß dieser schreibzugriff auf die Datei erhält.


Gruß

Dookie
Gast

hi dookie!

natürlich gehts mit einmal nicht :D

also grundsätzlich ist klar was du meinst. ich habe das in einem kleinen testscript ausprobiert.

allerdings gibt das den user nur ueber die python shell zurück. im browser passiert nichts.
und wie soll ich das dann machen, dass ich von jedem pc aus dieses skript von dem ich anfangs gesprochen habe nutzen kann? jedesmal ermitteln, wenn das skript lauft und dann die rechte übergeben? hast du das so gemeint?

hier mal der test:

Code: Alles auswählen

#!/usr/local/bin/python


import os

print 'Content-Type: text/html'
print
print '<html> <body>'
print 'supermegageiles programm!'
print os.environ['USER']
print '</body> </html>'
danke einstweilen!

rolgal
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hi rolgal,

du könntest die rechte der zu ändernden Datei auch auf 0666 setzen.

Unter Debian heisst der User, der über ein CGI-Script Dateien anlegt www-data, den hab ich rausgefunden, indem ich von python aus eine Datei anlegen liess.

Code: Alles auswählen

#!/usr/bin/env python

import os, sys

print "Content-Type: text/html"
print
print """<html>
  <head>
    <title>Pythonpfade</title>
  </head>
  <body>
    Schreibe Datei"""
os.chdir(os.environ["DOCUMENT_ROOT"])
f = file("test.txt","w")
f.write("test\n")
f.close()
print "  </body>\n</html>"
Gruß

Dookie
Gast

hi dookie!

ich hoffe ich überstrapaziere deine geduld net :oops:

das skript von dir funktioniert schon, nur wo schreibt er diese datei hin? konnte sie nicht finden.
ich steh am schlauch,gell :oops:

die rechte der datei zu ändern, die runterlade habe ich schon probiert, ich bekomme denselben fehler.

arghhh, das muss sich doch lösen lassen.

hoffentlich gabs viele eier heute

mfg

rolgal
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Hi rolgal

führ als root doch einmal

Code: Alles auswählen

find / -name test.txt -print
aus. Sollte die Datei eigentlich finden.

Hans
Gast

hi hans!

das habe ich schon probiert, eben findet er nichts. :(

danke trotzdem!

mfg

rolgal
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Was sagt denn dein Log File? Du hast doch sicherlich (hoffentlich) apache installiert. Änder doch einmal die Ereignisprotokollierung auf debug. Dann protokolliert der Indianer einfach alles.

Hans
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Fehler, auch von cgi-pythonscripts, stehen bei mir in /var/log/apache/error.log

Folgende kleine Änderung am Script sagt Dir wo die Datei hingeschrieben wird.

Code: Alles auswählen

#!/usr/bin/env python

import os, sys

print "Content-Type: text/html"
print
print """<html>
  <head>
    <title>Pythonpfade</title>
  </head>
  <body>
    Schreibe Datei nach: <b>%s</b>""" % os.environ["DOCUMENT_ROOT"]
os.chdir(os.environ["DOCUMENT_ROOT"])
f = file("test.txt","w")
f.write("test\n")
f.close()
print "  </body>\n</html>"
Wenn Du deine Datei dann gleich von einem Script anlegen lässt, sollte es auch keine Probleme mit den schreibrechten geben.


Gruß

Dookie
Gast

tja, jetzt wirds schwierig!

sagt mir, dass er die datei nach /var/www/html schreibt.

tut er aber nicht, weil keine dort ist :cry:

noch irgendeine idee warum?

mfg

rolgal
Gast

aha, auf der shell gibts folgenden error:

Code: Alles auswählen

Traceback (most recent call last):
  File "/var/www/cgi-bin/test1.py", line 7, in -toplevel-
    print """<html>
  File "/usr/local/lib/python2.3/UserDict.py", line 19, in __getitem__
    def __getitem__(self, key): return self.data[key]
KeyError: 'DOCUMENT_ROOT'
hilft das weiter???
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

das is klar, auf der shell ist auch keine umgebungsvariable DOCUMENT_ROOT definiert. Die giebts nur bei cgi-scripts.
Wie sind die Rechte von var/www/html ?
die sollten auf 0777 stehen, sonst können scripts nichts dort hineinschreiben.


Gruß

Dookie
Gast

hi dookie!

ja, ist ja logisch mit der variablen, vor lauter verwirrt :D

jednfalls, haben die rechte am verzeichnis gefehlt, was auch logisch ist, weil eine datei oder verzeichnis immer 777 braucht um beschrieben zu werden.

jetzt mache ich mal osterpause

vielen dank noch mal

mfg

rolgal
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

rolgal hat geschrieben:weil eine datei oder verzeichnis immer 777 braucht um beschrieben zu werden.
Autsch :oops:
Bitte die Rechte nicht immer gleich mit der Gießkanne verteilen. 1. Ziffer ist für den Owner, 2. Ziffer ist für die Gruppe, 3. Ziffer für den Rest der Welt. Überlege dir, wem du die Schreibrechte einräumst, dem Owner, der Gruppe oder dem Rest der Welt? Ich glaube, dass der Owner in diesem Fall ausreichend ist. ggfs. würde ich ein Unterverzeichnis anlegen. Ich hasse es, wenn Programmverzeichnisse mit temporären Daten zugemüllt werden.

Owner ist in jedem Fall der Owner Apache Prozesses (httpd).

Hans
Gast

hi hans!

du hast natürlich recht. aber meines wissens ist das nicht so einfach, die rechte anders zu vergeben. es ist doch auch so, dass .txt dateien immer 777 vergeben werden muss, will man sie beschreiben.

irre ich?

mfg

rolgal
hans
User
Beiträge: 728
Registriert: Sonntag 22. September 2002, 08:32
Wohnort: Sauerland
Kontaktdaten:

Ja, denn wenn das so wäre, dann könnte jeder Hinz & Kunz die Textdateien manipulieren, und damit alle UNIXE gute nacht mit euerer Security 8) Fast alle Konfigurationsdateien in Linux sind Textdateien.

Zunächst einmal .txt kennen glaube ich nur DOS basierte Systeme. Der Übersichtlichkeit wegen hat sich aber die Dateiextension als Standard etabliert. Einem Unixbasiertem System ist es egal, welche Dateiextension vorhanden ist. Den Dateityp kannst du notfalls mit file /dein/dateiname ermitteln.

Beim Systemstart wird dein Apache (httpd) gestartet. Dieser wird normalerweise mit einem eigenen User (nennen wir ihn ApacheUser) und nicht mit root-rechten gestartet. Wenn du jetzt ein CGI Script ausführst und eine Datei beschreiben willst, dann geht das immer, wenn der Owner ApacheUser Schreibrechte an der Datei hat.

Untersuch einmal deine /etc/httpd/conf/httpd.conf (Pfad könnte bei die etwas anders sein). Da sind User und Group definiert, unter denen Apache gestartet wird. Bei mir ist das in beiden Fällen apache.

Hans
Gast

???

ist mir alles net neu, aber warum steht dann in jedem lehrbuch für cgi programmierung, in denen beispiele mit textdateien besprochen werden, die rechte müssen au 777???

das habe ich mal als richtig angenommen.

hast das noch nie gelesen?

mfg

rolgal
Milan
User
Beiträge: 1078
Registriert: Mittwoch 16. Oktober 2002, 20:52

Hi, da hat sich wohl das Lehrbuch vertan. Niemand ist unfehlbar. Ich glaube 755 würde auch vollkommen reichen (rwxr-x-r-x), wobei natürlich wichtig ist, für wen die 7 gilt. In dem Fall wohl für httpd... Ausprobieren kann ich es leider nicht bei mir selbst, sondern nur auf einem webserver, aber da reicht das vollkommen.

Milan
Gast

ich probiere das jetzt gleich mal aus.
:?
Dookie
Python-Forum Veteran
Beiträge: 2010
Registriert: Freitag 11. Oktober 2002, 18:00
Wohnort: Salzburg
Kontaktdaten:

Hallo nochmal,

hier scheint einiges durcheinander geraten zu sein.

Directories, in denen auch Dateien angelegt werden dürfen, müssen als Rechte 0755 haben, wenn nur der Owner Dateien, im Verzeichnis, anlegen darf, sonst 0777 wenn jeder Dateien hier anlegen darf.
Nicht ausführbare Textdateien die nur vom Owner geändert werden dürfen müssen 0644 als rechte haben, darf jeder die Textdatei ändern 0666. Ausführbare Dateien (CGI-Scripte) sollten 0755 haben.


Gruß

Dookie
Antworten