Skip to content

Gesamtes Verzeichnis als ZIP herunterladen (Apache2)

zipscriptWer viele kleine Einzeldateien anbietet und kein GIT/rsync/FTP etc. für andere bereitstellen möchte, für den reichen Apache und CGI. Oder jeder andere Webserver mit CGI.

Dieses kleine Bash-Script kann einfach in das betreffende Verzeichnis kopiert werden und ersetzt die Standard „Index of“-Anzeige unter Apache durch meine Alternative mit Größenangaben, Volltext und ZIP-Downloadbuttons. Zusätzlich wird eine eventuell im Verzeichnis vorhandene README-Datei oberhalb des Verzeichnisbaums angezeigt.

#!/bin/bash
export Filename="$(pwd|sed -e 's,.*/,,').zip"
if test "$QUERY_STRING" == zip; then
 echo Content-type: application/zip
 echo "Content-Disposition: attachment; filename=$Filename"
 echo
 zip -9Dx index.cgi - *
elif test "$QUERY_STRING" == fullzip; then
 echo Content-type: application/zip
 echo "Content-Disposition: attachment; filename=$Filename"
 echo
 cd .. ; zip -9rx *index.cgi - "$(echo "$Filename"|sed -e s/.zip$//)"
else
 echo "Content-type: text/html; charset=utf-8"
 echo
 echo "<HTML><HEAD><TITLE>Index of: "$(pwd|sed -e 's,.*/,,')""
 echo "</TITLE></HEAD><BODY><A HREF="..">Go up</A> |"
 echo "<A HREF="./?zip">ZIP of current dir</A> |"
 echo "<A HREF="./?fullzip">ZIP of all subdirs</A><BR>"
 cat README|sed '{:q;N;s/n/<BR>/g;t q}'
 echo "<h2>Index of: "$(pwd|sed -e 's,.*/,,')"</h2><UL>"
 for N in *; do
 if [ $N != "index.cgi" ]
 then
 echo "<LI><A HREF="$N">$N</A> ($(du -hs "$N"|cut -f1))</LI>"
 fi
 done
 echo "</UL></BODY></HTML>"
fi

In die Apache-Config muss dann nur noch das hier rein:

<Directory /var/www/html>;
 DirectoryIndex index.cgi
 AddHandler cgi-script .cgi
 Options +ExecCGI
</Directory>

Man kann auch einfach +FollowSymLinks in der Apache-Config setzen und all seine Verzeichnisse automatisch mit einem Symlink auf die index.cgi füllen:

for N in $(find . -type d); do ln -s /source/index.cgi $N/index.cgi; done

Ich nutze SuExec, dort funktioniert das nicht – macht auch Sinn. Hier musste ich die Datei in jedes Verzeichnis kopieren und die Rechte setzen:

for N in $(find . -type d); do cp /source/index.cgi $N/index.cgi; done
for N in $(find . -type d); do chmod +x $N/index.cgi; done
for N in $(find . -type d); do chown user:users $N/index.cgi; done

Es macht Sinn, das Ganze in einen Cronjob zu packen, falls man häufig seine Verzeichnisse ändert.

Credits gehen an die Linux Gazette für die Grundidee. Hier in Action.

Dieser Beitrag hat 0 Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

An den Anfang scrollen