Gesamtes Verzeichnis als ZIP herunterladen (Apache2)
Wer 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