Verwendung von 7z auf FreeBSD ohne Installation
SR
- php
Guten Morgen zusammen,
ich möchte gerne die Kommandozeilenversion von 7z (http://7-zip.org/download.html bzw. http://www.freshports.org/archivers/p7zip/) OHNE INSTALLATION auf FreeBSD verwenden, da ich beim Provider nur einen simplen FTP-Zugang habe und dort 7z per PHP (http://www.php.net/manual/de/function.exec.php, http://www.php.net/manual/de/function.system.php, http://www.php.net/manual/de/function.passthru.php) ansprechen möchte, weil die Kompressionsrate doch deutlich über der der normalen ZIP-Funktionalitäten von PHP liegt. (Phpinfo()/"System": FreeBSD 8.3-RELEASE-p4)
Sämtliche Versuche, Dateien aus den 7z-Paketen auf dem Webspace abzulegen und mittels PHP anzusprechen, sind bisher gescheitert.
Weder bestehende Foreneinträge noch das Internet konnte mir Hilfestellung geben, daher die Frage an dieser Stelle:
Welche Datei(en) aus den 7z-Paketen muss ich per FTP auf dem Webspace ablegen, um mit PHP Dateien 7z-ippen zu können?
Vielen Dank für die Unterstützung.
Hallo,
Welche Datei(en) aus den 7z-Paketen muss ich per FTP auf dem Webspace ablegen, um mit PHP Dateien 7z-ippen zu können?
Eine für FreeBSD 8.3 statisch kompilierte Binary. Das ist eine ausführbare Datei.
Die Download-Seite von 7z bietet so etwas nicht an. Das ist auch unüblich. Die Linux- und BSD-Distributionen bieten in ihren Paketverwaltungen entsprechende Quell- oder Binärpakete an. Für FreeBSD wird auf den p7zip-Port verwiesen. Du könntest dir dieses Paket herunterladen und auf den Webserver entpacken, aber ich vermute, dass es nicht läuft, weil die Binary nicht statisch gelinkt ist, sondern verschiedene Libraries in einschlägigen Pfaden benötigt.
Ich würde versuchen, den Quellcode selbst auf einem FreeBSD zu kompilieren, sodass eine statische Binary entsteht. Ob es der Webserver letztlich zulässt, dass die Datei aus deinem Verzeichnis ausgeführt wird, weiß ich nicht. Ich wüsste zumindest nicht, dass PHP entsprechende Sicherheitsbeschränkungen hätte. Vielleicht können sich andere dazu äußern.
Mathias
sondern verschiedene Libraries in einschlägigen Pfaden benötigt.
7z für Windows gibt es aber als standalone-Datei, die angeblich keine weiteren Libraries benötigt.
Hallo
sondern verschiedene Libraries in einschlägigen Pfaden benötigt.
7z für Windows gibt es aber als standalone-Datei, die angeblich keine weiteren Libraries benötigt.
Die wird dir auf FreeBSD genau garnichts nutzen. FreeBSD ist ein Unix und braucht schon ein dafür und nicht für Windows kompiliertes Binary.
Tschö, Auge
7z für Windows gibt es aber als standalone-Datei, die angeblich keine weiteren Libraries benötigt.
Das will ich nicht in Abrede gestellt haben. Nur ist Windows nicht FreeBSD. Ich habe ja vorgeschlagen, den FreeBSD-Port auszuprobieren. Ich habe p7zip auf MacOS kompiliert und es kommen u.a. das Binaries 7zr heraus, welche laut Man-Page standalone ist. Sieht also gut aus. Das FreeBSD-Package (Binärpaket) enthält diese ebenfalls: http://ftp.freebsd.org/pub/FreeBSD/ports/packages/archivers/p7zip-9.20.1_2.tbz. Da liegt in /bin ein Shellscript, das auf /libexec/7zr verweist.
Mathias
Hallo Mathias,
vielen lieben Dank für Deine Hilfe. Leider bin ich zu doof. Habe die Datei 7zr hochgeladen, spreche sie mit den Kommandos an, bekomme kein brauchbares Ergebnis.
Hier mein PHP-Quelltext:
<pre><?php
$sCommand = '7zr a test.7z index.php';
$sReturn = NULL;
$aReturn = NULL;
$iReturn = NULL;
$sReturn = exec($sCommand, $aReturn, $iReturn);
var_dump($sReturn);
var_dump($aReturn);
var_dump($iReturn);
print '---------------------------------' . "\r\n";
$sReturn = NULL;
$aReturn = NULL;
$iReturn = NULL;
$sReturn = system($sCommand, $aReturn);
var_dump($sReturn);
var_dump($aReturn);
var_dump($iReturn);
print '---------------------------------' . "\r\n";
$sReturn = NULL;
$aReturn = NULL;
$iReturn = NULL;
$sReturn = passthru($sCommand, $aReturn);
var_dump($sReturn);
var_dump($aReturn);
var_dump($iReturn);
print '---------------------------------' . "\r\n";
$sReturn = NULL;
$aReturn = NULL;
$iReturn = NULL;
$sReturn = shell_exec($sCommand);
var_dump($sReturn);
var_dump($aReturn);
var_dump($iReturn);
print '---------------------------------' . "\r\n";
?></pre>
und hier meine Ausgabe:
string(0) ""
array(0) {
}
int(126)
---------------------------------
string(0) ""
int(126)
NULL
---------------------------------
NULL
int(126)
NULL
---------------------------------
NULL
NULL
NULL
---------------------------------
Habe alle Befehlsvarianten und auch den Upload des gesamten Pakets ausprobiert - alles ohne Ergebnis.
Vielleicht hast Du ja Erbarmen und kannst mir noch weiterhelfen. Kenne mich nur mit Windows aus - Linux und Konsorten ist nicht meine Welt.
Vielen Dank nochmal auf jeden Fall für jeden Fall.
allo,
vielen lieben Dank für Deine Hilfe. Leider bin ich zu doof. Habe die Datei 7zr hochgeladen, spreche sie mit den Kommandos an, bekomme kein brauchbares Ergebnis.
aber einen Status, einen "return code".
$sCommand = '7zr a test.7z index.php';
$sReturn = NULL;
$aReturn = NULL;
$iReturn = NULL;$sReturn = exec($sCommand, $aReturn, $iReturn);
var_dump($sReturn);
var_dump($aReturn);
var_dump($iReturn);
>
> und hier meine Ausgabe:
>
> string(0) ""
> array(0) {
> }
> int(126)
ja, und was erkennen wir daraus? Der exec-Aufruf liefert den Fehler- oder Statuscode 126. Normalerweise kann ein Programm die Exit Codes beliebig wählen, es gibt aber einige Codes, die [reserviert sind](http://www.tldp.org/LDP/abs/html/exitcodes.html). So bedeutet 126 also:
"Command invoked cannot execute"
Das, was du dem Betriebssystem als Kommando anbietest, kann nicht ausgeführt werden. Möglicherweise hat die ausführbare Datei kein x-Bit gesetzt, ist also nicht als executable gekennzeichnet.
Kannst du die Datei-Berechtigungen anzeigen lassen, beispielsweise mit
`echo sprintf('%o', fileperms('7zr'));`{:.language-php}
So long,
Martin
--
Man sollte keinen Senf von sich geben, wenn man nicht auch das Würstchen dazu liefern kann.
Selfcode: fo:) ch:{ rl:| br:< n4:( ie:| mo:| va:) de:] zu:) fl:{ ss:) ls:µ js:(
Hallo Martin,
vielen Dank auch Dir für die Hilfe. Ja, die Rechte, an die hatte ich nicht gedacht. Leider hat auch das Korrigieren dieser auf 0777 nichts gebracht.
$sCommand = '7zr a test.7z index.php';
Der Pfad muss wahrscheinlich vollständig (absolut) sein.
/wo/auch/immer/dein/document/root/ist/7zr
Mathias
Hallo,
$sCommand = '7zr a test.7z index.php';
Der Pfad muss wahrscheinlich vollständig (absolut) sein.
an einen falschen Pfad dachte ich auch schon, aber dann würde ich eher Exit Code 127 erwarten.
Aber wir wissen auch nicht, wie SR seine 7zr erzeugt hat. Vielleicht hat er dabei noch etwas übersehen oder falsch gemacht, vielleicht braucht das Executable anders als geplant doch noch irgendeine dynamische Bibliothek, die auf dem Produktivsystem nicht verfügbar ist.
Ciao,
Martin
Hallo nochmal,
Aber wir wissen auch nicht, wie SR seine 7zr erzeugt hat. Vielleicht hat er dabei noch etwas übersehen oder falsch gemacht, vielleicht braucht das Executable anders als geplant doch noch irgendeine dynamische Bibliothek, die auf dem Produktivsystem nicht verfügbar ist.
Ich habe keine 7zr erzeugt, sondern die aus diesem Paket verwendet:
http://ftp.freebsd.org/pub/FreeBSD/ports/packages/archivers/p7zip-9.20.1_2.tbz. Da liegt in /bin ein Shellscript, das auf /libexec/7zr verweist.
So, wie es Mathias geraten hat.
Ergebnis immer noch dasselbe.
Danke trotzdem für Eure Hilfe
$sCommand = '7zr a test.7z index.php';
Der Pfad muss wahrscheinlich vollständig (absolut) sein.
/wo/auch/immer/dein/document/root/ist/7zr
Mathias
Hallo Mathias,
ich weiß nicht, warum, aber Dein Tip mit dem absoluten Pfad hat geholfen.
Jetzt klappts!
Vielen Dank an alle für die freundliche Hilfsbereitschaft.