Seite 2 von 3

Verfasst: Mittwoch 14. April 2004, 19:22
von Gast
so, das mti ftp ging mir jetzt so auf die eier, dass ich mal was anderes probiert habe, spricht was gegen diese methode?

es klappt mal, dass es so ausgegben wird wie geplant. mal sehen was der upload für troubles mit sich bringt:

Code: Alles auswählen

#!/usr/local/bin/python

from seiten import AdminSeite
import  urllib2

content=urllib2.urlopen('http://diplomarbeit.weberanto.net/definition.htm').read()
admin=AdminSeite(content)
print admin
mfg

rolgal

Verfasst: Mittwoch 14. April 2004, 22:30
von Gast
nochmal....

alles theoretisch kapiert. ich kann aber vom browser aus keine datei am server anlegen, weil ich einen permission denied bekomme!

wie soll ich auch rechte einer datei übergeben, die ja nicht angelegt werden kann, weil ich nicht darf :?:

mfg

rolgal

Verfasst: Mittwoch 14. April 2004, 23:24
von Dookie
Das liegt aber nicht an den Rechten der Datei, sondern an den Rechten des Verzeichnisses.
Wenn das Verzeichnis die Rechte 0755 hat dann kannst Du mit cgi darin keine Dateien oder Verzeichnisse anlegen. Leider lassen sich die Rechte vom Wurzelverzeichnis bei einigen Providern auch nicht ändern. So musst Du ein Verzeichnis anlegen mit den Rechten 0777 und darin kannst Du mit dem Script dann Dateien und Unterverzeichnisse anlegen. Bei vielen Providern geht das nur im Verzeichnis cgi-bin.

Sicherheit hat halt ihren Preis.


Gruß

Dookie

Verfasst: Mittwoch 14. April 2004, 23:52
von Gast
hi dookie!

soweit funktioniert es jetzt mal, die rechte konnte ich schon setzen, ich habe....ach egal.


Code: Alles auswählen

#!/usr/bin/env python

import cgi, ftplib, os, sys

form=cgi.FieldStorage()

content=form.getvalue('user_eingabe')

os.chdir(os.environ['DOCUMENT_ROOT'])
f=file('index6.htm','w')
f.write(content)
f.close()

ftp=ftplib.FTP('meinserver','meinuser','meinpasswort')
ftp.cwd('html/crossover/diplomarbeit')

ftp.storlines('STOR index6.htm',file('index6.htm','r'))
ftp.quit()
momentan wird das skript auf meinem lokalen server ausgeführt, d.h. er legt in /var/www/html ein fileobjekt an, das er dann per ftp überträgt. läuft es dann am richtigen server, dann legt er mir die datei zuerst auch im /html verzeichnis ab. d.h. ich habe die dann immer doppelt. geht das nicht eleganter?

Verfasst: Donnerstag 15. April 2004, 00:30
von Dookie
Hi rolgal,

hmm, warum lädst du es erst wieder mit ftp hoch, du kannst ja Dateien über ein html-Formular mit der Methode post hochladen. das landet dann irgendwo im /tmp verzeichnis von wo aus es mit dem Script an die richtige Stelle kopiert wird.
Deine Lösung kommt mir irgendwie vor, wie: "Von hinten, durch die Brust, ins Auge".

Wenn du es aber mit der ftplib machen willst/musst, kannst du dir das Zwischenspeichern in eine Datei auch sparen. Dafür gibts das Modul StringIO

Code: Alles auswählen

#!/usr/bin/env python

import cgi, ftplib
from StringIO import StringIO

form=cgi.FieldStorage()

content=form.getvalue('user_eingabe')

ftp=ftplib.FTP('meinserver','meinuser','meinpasswort')
ftp.cwd('html/crossover/diplomarbeit')
ftp.storelines('STOR index6.htm',StringIO(content))
ftp.quit()
nicht getestet, sollte aber klappen.


Gruß

Dookie

Verfasst: Donnerstag 15. April 2004, 01:01
von Gast
hi dookie!

mir ist ja das sowieso net koscha vorgekommen. wer hat mich denn zu der lösung hingeführt :D
ich habe mir das mit dem os.chdir und os.environ net aus dem hut gezaubert.

war aber trotzdem lehrreich, also ken vorwurf
du kannst ja Dateien über ein html-Formular mit der Methode post hochladen. das landet dann irgendwo im /tmp verzeichnis von wo aus es mit dem Script an die richtige Stelle kopiert wird.
und wie sieht das aus?

die nachstehende version leuchtet mir sehr ein und werde ich morgen ausprobieren

danke dir, :D

Verfasst: Donnerstag 15. April 2004, 10:01
von Gast
hi dookie!

dein bsp. funktioniert klasse, nur falls es jmd. auf die schnelle probiert, es ist dir ein 'e' zu viel entwischt bei

Code: Alles auswählen

ftp.storelines('STOR index6.htm',StringIO(content)) 
muss heissen

Code: Alles auswählen

ftp.storlines('STOR index6.htm',StringIO(content)) 
die andere version kann ich mir nur theoretisch vorstellen, denn wenn ich das vom /tmp kopiere gibt sicher auch troubles mit den rechten, sonst könnte ja jeder auf irgendein serververzeichnis kopieren, aber vielleicht habe ich dich ja missverstanden.

jedenfalls dachte ich eine praktikable lösung ist nur mit ftp möglich.

nochwas: es gibt trotzdem das skript richtig arbeitet einen fehler
[Thu Apr 15 10:54:59 2004] [error] [client 127.0.0.1] Premature end of script headers: /var/www/cgi-bin/upload.py

finde ich seltsam, lässt man ihn noch irgendwas schreiben in den browser, dann tritt diese meldung nicht auf, ich finde das einfach seltsam

mfg

rolgal

Verfasst: Donnerstag 15. April 2004, 12:47
von Dookie
Hi rolgal,

die Zeile war schlecht kopiert aus Deinem Beispiel ;)

das mit dem Fileupload via CGI-Script kenn ich von PHP aus. Sollte mit Python eigentlich auch so ähnlich gehen, da hab ich mich aber, mangels Webspace mit Pythonunterstützung noch nicht näher befasst.

Wenn Du das Script über den Browser aufrufst, erwartet dieser ein Ergebnis. Da das Script aber nichts zurückliefert (html-Seite) kommt die Fehlermeldung.

Schick als am Einfachsten eine simple html-Seite mit print an den Browser dann ist der error gegessen.


Gruß

Dookie

Verfasst: Donnerstag 15. April 2004, 13:38
von Gast
hi

gut mir ist ein 'e' zuviel entwischt. :D


falls du mal webspace mit pyhonunterstüztung zu einem sauguten preis suchst:

http://www.speicherhosting.com

ich bin mehr und mehr damit zufrieden, haben sich gesteigert.


cgi upload:
ich kann mir ja das nur so vorstellen mit dem cgi upload. ich lese das formular aus, klar ist das jetzt irgendwo in /tmp. dann muss ich aber wieder ein fileobjekt anlegen und wenn die rechte des verzeichnisses stimmen, dann kann man es wohl dorthin kopieren. wenn die grundsätzliche überlegung stimmt, sehe ich keinen vorteil darin.


mfg

rolgal

Verfasst: Donnerstag 15. April 2004, 15:11
von Dookie
Hi auch,

der Vorteil ist, daß nirgends dein ftp-passwort auftaucht im Script. Falls der Webserver mal verkonfiguriert wurde und er *.py als Text im Browser anzeigt oder es zum Download anbietet, ist auch Dein ftp-Passwort offen sichtbar. Darum ist der Upload mittels Webformular und dann kopieren aus /tmp bei php z.B. standartprozedere.


Gruß

Dookie

Verfasst: Donnerstag 15. April 2004, 15:55
von Gast
hm

aber ich muss ein fileobjekt erzeugen, oder? geht vielleicht auch mit dem modul dass du mir gezeigt hast, oder?

das mit dem passwort ist ein schlagendes argument.

mfg

rolgal

Verfasst: Donnerstag 15. April 2004, 16:12
von Gast
hi

also einfach so :D , funzte mal auf dem lokalen server:

Code: Alles auswählen

#!/usr/bin/env python

import cgi

form=cgi.FieldStorage()

content=form.getvalue('user_eingabe')

os.chdir('/var/www/html/crossover/diplomarbeit')
f=file('index8.htm','w')
f.write(content)
f.close()

dann noch irgendwas zur bestätigung, damit wir den error (premature....) nicht haben

Verfasst: Donnerstag 15. April 2004, 16:16
von Gast
ich liebe das thema:-))

beim download, habe ich noch was geändert, ist wichtig weil sonst in der textarea die unter escape genannten zeichen nicht angezeigt werden:

Code: Alles auswählen

#!/usr/local/bin/python

from seiten import AdminSeite
import urllib2, cgi

content=urllib2.urlopen('http://diplomarbeit.weberanto.net/auswertungb.htm').read()
content=cgi.escape(content,['&','&','&','&','&'])
admin=AdminSeite(content)
print admin

wahrscheinlich gibt es noch andere zeichen auf die zu achten ist, die sind mir mal aufgefallen.
das forum kann die zeichen nicht darstellen es handelt sich um codierungen fuer umlaute usw.

Verfasst: Donnerstag 15. April 2004, 16:38
von Dookie
der 2, Parameter bei cgi.escape ist aber nur ein Flag, das angibt ob Anführungszeichen auch als entities umgewandelt werden sollen.

Ansonst gibts auch noch das Modul htmlentitydefs, mit Dictionaries zur Umwandlung von entitiys von/in Unicode oder Latin1 Zeichen.

Beim Upload giebts auch die Möglichkeit eine Datei direkt von Deiner Festplatte mittels CGI upzuloaden, wie es bei vielen Photoalben der Fall ist, aber damit kann man auch Textdateien oder sonstwas hochladen.


Gruß

Dookie

Verfasst: Donnerstag 15. April 2004, 17:01
von Gast
hm,...heisst ich brauche die nicht alle angeben?

wie auch immer, ich habe noch ein problem, irgendwo bleibt der prozess wohl stecken, es funktionier auch alles aber der server gibt immer wieder folgende meldung aus,

Code: Alles auswählen

[Thu Apr 15 17:09:57 2004] [error] [client 213.47.47.46] request failed: URI too long
[Thu Apr 15 17:16:24 2004] [error] [client 213.47.195.236] request failed: URI too long
[Thu Apr 15 17:19:10 2004] [error] [client 213.47.115.135] request failed: URI too long
[Thu Apr 15 17:22:47 2004] [error] [client 213.47.245.173] request failed: URI too long
[Thu Apr 15 17:35:18 2004] [notice] caught SIGTERM, shutting down
[Thu Apr 15 17:40:48 2004] [notice] Apache-AdvancedExtranetServer/1.3.26 (Mandrake Linux/6.3.90mdk) PHP/4.2.3 configured -- resuming normal operations
[Thu Apr 15 17:40:48 2004] [notice] Accept mutex: sysvsem (Default: sysvsem)
[Thu Apr 15 17:48:31 2004] [error] [client 213.47.195.236] request failed: URI too long
[Thu Apr 15 17:48:43 2004] [error] [client 213.47.20.142] request failed: URI too long
[Thu Apr 15 17:50:57 2004] [notice] caught SIGTERM, shutting down
zwischendurch habe ich ihn mal abgestellt, dann nachdem hochfahren hat er wieder denselben kummer.

irgendwer irgendeine idee, was das soll?

mfg

rolgal

Verfasst: Donnerstag 15. April 2004, 17:08
von Gast
noch angefügt, die meldungen kommen, auch wenn ich das skript nicht aufgerufen habe, zmindest nicht sooft wie der fehler angegeben ist.

Verfasst: Donnerstag 15. April 2004, 17:59
von Dookie
Hi rolgal,

übergiebt ein Formular die Daten mittels get statt post, bei get darf die ganze URI nur 255 zeichen lang sein.


Gruß

Dookie

Verfasst: Donnerstag 15. April 2004, 18:10
von Gast
hi dookie!

du meinst:

Code: Alles auswählen

<form method='post' action='../cgi-bin/upload.py'>
        <p class='text'>usw......
wenn du das gemeint hast, das war schon auf post. trotzdem kam der fehler.


das mit escape geht auch so, habe ich völlig falsch verstanden diese funktion:

Code: Alles auswählen

content=cgi.escape(content)
so langsam wirds :D

du hast eh hunger oder:-)))

mfg

rolgal

Verfasst: Freitag 16. April 2004, 15:38
von Gast
also noch eins drauf!

heute habe ich den pc erst um 16:28 eingeschaltet:

wie soll folgendes möglich sein?

Code: Alles auswählen

[Fri Apr 16 00:18:16 2004] [error] [client 213.47.48.150] request failed: URI too long
[Fri Apr 16 00:20:18 2004] [notice] caught SIGTERM, shutting down
[Fri Apr 16 16:16:27 2004] [notice] Apache-AdvancedExtranetServer/1.3.26 (Mandrake Linux/6.3.90mdk) PHP/4.2.3 configured -- resuming normal operations
[Fri Apr 16 16:16:27 2004] [notice] Accept mutex: sysvsem (Default: sysvsem)
[Fri Apr 16 16:16:29 2004] [crit] (98)Address already in use: make_sock: could not bind to port 80
[Fri Apr 16 16:21:52 2004] [error] [client 213.47.45.132] request failed: URI too long
[Fri Apr 16 16:22:27 2004] [error] [client 213.47.188.101] request failed: URI too long
der fehler mit URI too long hat mit der übergabe aus dem textfeld zu tun.
die daten habe ich aber mit post übergeben. ich denke wohl, dass das passt, wie ich es gemacht habe.

wäre fein, wenn mir hier jmd. nochmal weiterhelfen könnte.

mfg

rolgal

Verfasst: Freitag 16. April 2004, 18:21
von Dookie
Hi rolgal,

die Zeile

Code: Alles auswählen

[Fri Apr 16 16:16:29 2004] [crit] (98)Address already in use: make_sock: could not bind to port 80 
gibt mir zu denken. läuft da noch ein Dienst auf Port 80?


Gruß

Dookie