2013-04-14 13 views
5

Ich benutze die extractTo Methode der PHP PharData Klasse, um den Inhalt einer Phar-Datei zu untersuchen und in einige stabile Ergebnisse zu laufen. Ich habe die Grenzen meiner Detektivarbeit auf Byte-Ebene erreicht und hoffte, dass jemand hier in der Lage sein würde, mir dabei zu helfen, das herauszufinden.Welches Dateiformat enthält PharData :: extractTo um Dateien zu extrahieren?

Einzelheiten folgen, aber im Allgemeinen: Wenn ich meine Archivdateien mit PharData::extractTo extrahieren, die Dateien, die ich appeart raus ein bzip varient sein, aber der bzip2 Befehl ihnen nicht gefällt. Ist das normal phar Verhalten, oder ist es ein Problem mit dem spezifischen Archiv? (oder die PHP/OS-Kombination, die ich verwende). Gibt es eine Möglichkeit, einfache Textdateien aus einem Phar-Archiv zu holen - oder sollte reiner Text der Standard sein und ich betrachte das seltsame Systemverhalten?

Genauer gesagt, wenn ich den Befehl ausführen

$phar = new Phar('n98-magerun.phar'); 
$phar->extractTo('/tmp/n98-magerun'); 

Auf meinem O 10.6.8, Intel-basierten Mac in PHP 5.3.6 der eingebauten verwenden, das Archiv erfolgreich in das Verzeichnis/tmp/n98-magerun extrahiert Mappe.

enter image description here

Das Archiv I can be found here Extrahieren sind.

Wenn ich eine der in BBEdit extrahierten Textdateien öffne, sehe ich den richtigen Inhalt.

enter image description here

jedoch, wenn ich andere Tools wie Quicklook, vi oder cat, sehe ich Binärdaten. Ich bemerkte dies beim Versuch, ack/grep durch den Inhalt der Dateien und ich bekam nicht die Ergebnisse, die ich erwartet hatte.

enter image description here

Wenn ich den file Befehl auf die Datei verwenden, wird es berichtet, dass es eine bzip Datei.

$ file MIT-LICENSE.txt 
MIT-LICENSE.txt: bzip2 compressed data, block size = 400k 

und die Datei mit einem Hex-Editor Prüfung bestätigt die Datei mit einem BZ Header beginnt

enter image description here

jedoch

$ bzip2 -d MIT-LICENSE.txt 
bzip2: Can't guess original name for MIT-LICENSE.txt -- using MIT-LICENSE.txt.out 

bzip2: Compressed file ends unexpectedly; 
    perhaps it is corrupted? *Possible* reason follows. 
bzip2: No such file or directory 
    Input file = MIT-LICENSE.txt, output file = MIT-LICENSE.txt.out 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 

bzip2: Deleting output file MIT-LICENSE.txt.out, if it exists. 
die Datei mit bzip2 Ergebnissen in dem folgenden Fehler zu dekomprimieren Versuch

und ich kann bzcat die Datei erfolgreich, obwohl es in der Mitte barfs dle der Datei mit diesem

bzcat: Compressed file ends unexpectedly; 
    perhaps it is corrupted? *Possible* reason follows. 
bzcat: Undefined error: 0 
    Input file = MIT-LICENSE.txt, output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 
+0

Haben Sie den Kommentar unter http://php.net/manual/en/phardata.extractto.php gesehen? Es sagt über 'pax' Archivformat auf älteren Mac-Systemen. –

+0

Ich habe das gesehen, aber ich bin mir nicht sicher, ob ich dem Beispiel (wenn überhaupt) folge. Es scheint so zu sein, dass einige ältere Mac OS-Versionen von PHP Pax-artige Phar-Archive generieren, aber 'extractTo' unterstützt nur das Auslagern der ustar-Variante. Da ich das Archiv nicht erzeuge und das Archiv korrekt extrahiert, bin ich mir nicht sicher, ob es relevant ist. (womit ich meine, ich bin mir eigentlich nicht sicher: Ich habe noch nie Phar-Sachen gehackt) –

+0

Sorry, ich habe mich geirrt - nach dem ersten Lesen habe ich es als einige Systeme verstanden (und Mac OS, das du erwähnt hast) verwenden) extrahiert Phar in Pax-Archive ... –

Antwort

1

Es ist eine bzip2 Datei, sondern um sie zu entpacken, müssen Sie die --stdout (oder -c) Option verwenden (siehe unten).

Der Grund müssen Sie die Option --stdout, ist die Datei nicht mit einer .bz2 Verlängerung beenden, die bunzip2 die resultierenden Dateinamen zu bestimmen erlauben würde, zu dekomprimieren.

$ bunzip2 --stdout MIT-LICENSE.txt 2>/dev/null 
Copyright (c) 2012 netz98 new media GmbH 

http://www.netz98.de 

Permission is hereby granted, free of charge, to any person obtaining 
a copy of this software and associated documentation files (the 
"Software"), to deal in the Software without restriction, including 
without limitation the rights to use, copy, modify, merge, publish, 
distribute, sublicense, and/or sell copies of the Software, and to 
permit persons to whom the Software is furnished to do so, subject to 
the following conditions: 

The above copyright notice and this permission notice shall be 
included in all copies or substantial portions of the Software. 

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE 

Ich habe keine Ahnung, warum bunzip2 die folgenden Standardfehler outputing:

bzip2: Compressed file ends unexpectedly; 
     perhaps it is corrupted? *Possible* reason follows. 
bzip2: Success 
     Input file = MIT-LICENSE.txt, output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 

Als file Befehl meldet die Datei mit einer Blockgröße von 400k eine gültige bzip2-Datei ist:

$ file MIT-LICENSE.txt 
MIT-LICENSE.txt: bzip2 compressed data, block size = 400k 

Ich habe versucht, die -4 Option zu bunzip2 hinzuzufügen, aber es klagt immer noch:

$ bunzip2 -d -4 -vvvvv -c MIT-LICENSE.txt >/dev/null 
    MIT-LICENSE.txt: 
    [1: huff+mtf rt+rld {0x2010d4b9, 0x2010d4b9}] 
    combined CRCs: stored = 0x2010d4b9, computed = 0x2010d4b9 
    [1: huff+mtf 
bunzip2: Compressed file ends unexpectedly; 
     perhaps it is corrupted? *Possible* reason follows. 
bunzip2: Success 
     Input file = MIT-LICENSE.txt, output file = (stdout) 

It is possible that the compressed file(s) have become corrupted. 
You can use the -tvv option to test integrity of such files. 

You can use the `bzip2recover' program to attempt to recover 
data from undamaged sections of corrupted files. 

so meine Vermutung ist das Programm, das diese bzip2-Dateien erstellt, ist die Ursache für dieses Problem.

+0

+1 für die Detektivarbeit und wahrscheinlich eine eventuelle beste Antwort. Ich habe PHP's 'phar'-Code gegraben und unzählige Probleme gefunden, die, obwohl ich sie nicht als Ursache für diese seltsamen' bz'-Dateien bezeichnen kann, mich auf eine schäbige Implementierung als Täter hindeuten. –

0

Mit extractTo werden die Dateien im selben Format wie im Archiv gespeichert! Dies kann einer der folgenden sein: kein, gzip, bzip2

Während Sie sicher sie in diesem Format speichern und dann versuchen, es irgendwie zu extrahieren, schlage ich folgende: umrechnen phar in einen unkomprimierten phar und Extrakt, Archiv!

Hier ist, wie:

<?php 
$phar = new Phar('Someclass.phar'); 
$phar2 = $phar->convertToExecutable (Phar::TAR,Phar::NONE); //convert to an uncompressed tar archive 
$phar2->extractTo('/some/path/'); // extract all files 

Diese Sie alle Dateien unkomprimiert geben!