PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : php textausgabe mit wget downloaden



Kesar_Neron
16.11.2006, 16:40
Hallo zusammen,

ich verzweifle hier an einem kleinen Problem. Derzeit arbeite ich an einer Art onlinedienst, der schwarze listen für squidguard (oder andere) bereitstellen soll. Nun hänge ich an dem Punkt, wo ich eine Liste mit gesperrten domains generieren möchte. DAS ist an sich kein Problem. Nur bekomme ich es komischer weise nicht hin, dass wget die ausgeb herunter läd. Vie Browser ist es ueberaupt keine Schwierigkeit.

Hier mal mein php code:



<?php
if(isset($_GET['dl_kat']))
{
if($_GET['status']== "checked")
{
$query = "SELECT eintrag FROM blacklist WHERE kategorie_id='$_GET[dl_kat]' AND status='1'";
}
if($_GET['status']== "all")
{
$query = "SELECT eintrag FROM blacklist WHERE kategorie_id='$_GET[dl_kat]'";
}

$query_katname = "SELECT name FROM kategorie WHERE id='".$_GET['dl_kat']."'";
$result_katname = mysql_query($query_katname);
$daten_katname = mysql_fetch_array($result_katname);

$result = mysql_query($query);
$anzahl = mysql_num_rows($result);

header("Content-Type: text/plain");
header("Content-Disposition: attachment; filename=blacklist_".$daten_katname['name'].".txt");

for($i=0; $i<$anzahl; $i++)
{
$daten = mysql_fetch_array($result);

echo $daten['eintrag']."\r\n";
}
}
?>


Das Skript tut folgendes: Es uebernimmt die Kategorie ID und stellt dann anhand des gewünschten Stati die benötigte Query bereit. Diese geht an die Datenbank und es wird die anzahl der Zeilen ermittelt. Dann werden noch ein paar Headereigentschaften gesetzt, damit die ausgabe richtig erkannt wird und im anschluss werden die zutreffenden Datensätze ausgegeben.

Wie oben schon geschrieben, wenn ich die Datei via Browser herunterladen möchte funktioniert alles bestens. Nur passiert absolut gar nichts, wenn ich die Url an wget weitergebe.

Hat vielleicht jemand einen tipp für mich?

Gruß

Kesar

Wolfgang
16.11.2006, 17:04
Hallo
Dass garnix passiert, glaube ich dir nicht.
wget spuckt doch normalerweise aus was es macht.
Was erscheint denn in der Konsole, wenn du wget darauf startest?

Wie sieht der Befehl für wget aus?

Gruß Wolfgang

Kesar_Neron
16.11.2006, 20:24
Hallo,

also, meine Konsole sieht nach einem einfachen downloadversuch wie folgt aus:


wget http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3&status=checked
--20:25:21-- http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3
=> `projekt_blacklist_download.php?dl_kat=3'
Auflösen des Hostnamen »www.edv-bode.de«.... [1] 23384
kesar@217-20-118-124:~$ 217.20.118.124
Verbindungsaufbau zu www.edv-bode.de[217.20.118.124]:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort... 200 OK
Länge: nicht spezifiziert [application/octetstream]

[ <=> ] 0 --.--K/s

20:25:22 (0.00 B/s) - »projekt_blacklist_download.php?dl_kat=3« gespeichert [0]


Und genau hier bleibt er ewig und drei tage hängen, oder eben bis ich mit strg+c alles abbreche.

Ich habe leider keine ahnung, woran es liegen könnte... Achso, eines noch: selbst nach 5 min Wartezeit hat die angelegte (vermeindlich) downgeloadete Datei 0 bytes.

Gruß

x-lette
16.11.2006, 20:53
PHP ist nicht grad meine Stärke, aber mir fällt da auf, daß du zwar im Skript den Header auf "Content-Type: text/plain" setzt, wget aber [application/octetstream] herunterladen will.
Da scheint die Kommunikation schief zu laufen oder der Header wird nicht korrekt gesetzt.
Werden Sonderzeichen benutzt? Oder gibt es irgendeine Art von Preface zum ausgegebenen Text?
Eventuell kann dir das Firefox-Plugin tamper-data weiterhelfen: damit kannst du die gesendeten Daten des Servers analysieren und bekommst u.a. alle Header angezeigt.
Außerdem könntest du versuchen, im Skript die Länge zu spezifizieren und mit auszugeben.

Gruß
XL
P.S.: wenn es gar nicht will, dann hilft immer noch eine Analyse mit ethereal! :)

Jabo
16.11.2006, 22:13
PHP ist nicht grad meine Stärke, aber mir fällt da auf, daß du zwar im Skript den Header auf "Content-Type: text/plain" setzt, wget aber [application/octetstream] herunterladen will.
Da scheint die Kommunikation schief zu laufen oder der Header wird nicht korrekt gesetzt.
Hallo,

dazu fällt mir gerade ein, daß header() doch überhaupt nur funktioniert, wenn noch nichts vorher gesendet wurde (weil dabei halt bereits Header anfallen und nur die gelten, die wirklich als erstes kommen)... das Beispiel scheint zwar nichts zu senden, aber man sieht auch nicht daran, ob es ein Ausschnitt von irgend was ist oder von etwas gerufen wird, das schon was gesendet hat.

Das kann man gut testen, indem man vor die Zeile "headers_sent()" packt (true, wenn schon was gesendet wurde - false wenn nicht)


if(headers_sent(){
echo "zu spät!";
}
header("Content-Type: text/plain");

Sorry, wenn das jetzt überflüssig war, aber s.o. .... man weiß nicht, in welchem Zusammenhang das Beispiel läuft.

Kesar_Neron
16.11.2006, 22:20
@x-lette: Es kann gut sein, dass sich zwischen den beiden Darstellungen etwas verändert hat. Wenn dann ist es allerdings kein Fehler, sondern einfach nur der Beweis, dass ich nicht still stitze :-)!!

@jabo: ich denke ebenfall nicht, dass es irgendwas mit der Reihenfolge meines Skripts zu tun hat. Es wird ja, wie du es schon erkannt hast, nichts ausgegeben. Was mich nur wundert ist, dass ALLES genau so funktioniert, wie ich es haben möchte, wenn ich es über den Browser aufrufe.

Ich vermute, dass wget die header einfach nicht in der Form akzeptiert, wie ich es möchte. Dann verstehe ich allerdings nicht, warum ABSOLUT keinerlei Daten ankommen... noch nichteinmal schrott wird übertragen---das ist es was, mich stört...

Gruß

Kesar

patlkli
16.11.2006, 22:47
Ich denke jetzt einfach mal, dass wget sein application/octetstream aus der Dateiendung nimmt, was zwar dumm ist, aber naja... vielleicht musst du wget irgendwie den content-type übergeben...

EDIT: Probier mal:

wget --header "Content-type: text/plain" http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3&status=checked

Grüße,
patlkli!

Kesar_Neron
16.11.2006, 23:16
Hallo zusammen

@patlkli: danke für den tipp, das wusste ich noch nicht, aber leider hat das auch nicht funktioniert. Ich werd mich wahrscheinlich einfach weiter auf die suche machen müssen. Achso, es wurde ja nach einer Beispielausgabe gefragt.
Nun, Das Ergebnis soll eine Textdatei sein, welche simple so aufgebaut sein soll:

81.19.70.1
64.124.125.10
193.125.152.10
206.50.181.10
206.173.193.10
216.40.195.10
216.200.199.10
216.34.209.10
212.143.22.10
80.190.228.10
207.38.10.100
208.184.138.100
65.39.176.100
207.150.181.100
66.150.2.100
209.132.205.100
209.202.240.100
...
...
...

Das stllt dann letztendlich eine Blacklist dar, welche von z.B. Squidguard genutzt werden kann, um den Interzugang ein wenig einzuschränken.

Gruß

Jabo
16.11.2006, 23:23
wget --header "Content-type: text/plain" http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3&status=checked
Hallo,

das brachte mich jetzt mal auf folgende Idee:



wget -S http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3&status=checked
[1] 13913
--23:15:33-- http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3
=> `projekt_blacklist_download.php?dl_kat=3.3'
Auflösen des Hostnamen »www.edv-bode.de«.... jens@trebulon-1:~> 217.20.118.124
Connecting to www.edv-bode.de|217.20.118.124|:80... verbunden.
HTTP Anforderung gesendet, warte auf Antwort...
HTTP/1.1 200 OK
Date: Thu, 16 Nov 2006 22:15:31 GMT
Server: [hier stand der Server-String]
X-Powered-By: [hier stand die PHP-Version]
Content-Disposition: attachment; filename=blacklist_Audio-Video.txt
Connection: close
Content-Type: application/octetstream
Länge: nicht spezifiziert [application/octetstream]

[ <=> ] 0 --.--K/s

23:15:34 (0.00 B/s) - `projekt_blacklist_download.php?dl_kat=3.3' saved [0]
Der Parameter "-S" gibt die Header aus, die vom Server kommen (also so wie ich die manpage verstehe *keine* von wget generierten).

Wenn man wget nicht traut, mal Lynx:


lynx --dump --head http://www.edv-bode.de/projekt_blacklist_download.php?dl_kat=3&status=checked
HTTP/1.1 200 OK
Date: Thu, 16 Nov 2006 22:23:31 GMT
Server: [hier stand der Server-String]
X-Powered-By: [hier stand die PHP-Version]
Content-Disposition: attachment; filename=blacklist_Audio-Video.txt
Connection: close
Content-Type: application/octetstream
(während übrigens "lynx --dump [....] > blist.txt" zu ner sauberen Liste in "blist.txt" führt...)

Aber: Scheinbar gehen die Header eben *nicht* rüber....

Kesar_Neron
16.11.2006, 23:28
@jabo: Das sieht doch schon mal gut aus... also bin cih mit dem content-type application/octetstream gar nicht so verkehrt....

Selbst wenn die header nicht rüber kommen wundert es mich, das wget keinerlei daten empfängt...

Aber ich denke, das hat mir schon mal weitergeholfen... danke