denkfehler!

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

Samstag 10. April 2004, 08:59

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:

Samstag 10. April 2004, 10:16

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

Sonntag 11. April 2004, 00:54

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:

Sonntag 11. April 2004, 01:40

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

Sonntag 11. April 2004, 10:06

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:

Sonntag 11. April 2004, 11:31

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

Sonntag 11. April 2004, 12:04

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:

Sonntag 11. April 2004, 12:34

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:

Sonntag 11. April 2004, 12:49

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

Sonntag 11. April 2004, 14:01

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

Sonntag 11. April 2004, 14:05

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:

Sonntag 11. April 2004, 15:20

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

Sonntag 11. April 2004, 15:39

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:

Montag 12. April 2004, 09:14

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

Montag 12. April 2004, 11:07

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
Antworten