2012-06-08 7 views
10

Ich habe einen Ordner namens Bilder auf meiner Linux-Box. Dieser Ordner ist mit einer Website verbunden und der Administrator der Website hat die Möglichkeit, Bilder zu dieser Website hinzuzufügen. Wenn jedoch ein Bild hinzugefügt wird, möchte ich mit einem Befehl die Größe aller Bilder in einem Verzeichnis ändern.Führen Sie einen Shell-Befehl, wenn eine Datei hinzugefügt wird

Kurz gesagt möchte ich wissen, wie ich den Server einen bestimmten Befehl ausführen lassen kann, wenn eine neue Datei an einem bestimmten Speicherort hinzugefügt wird.

+0

http://stackoverflow.com/questions/10366411/linux-triggering-shell-command-on-file-save –

Antwort

22

Ich weiß nicht, wie Leute Inhalte in diesen Ordner hochladen, aber Sie möchten vielleicht etwas niedrigeres als die Überwachung des Verzeichnisses mit inotify verwenden.

Wenn das Protokoll FTP ist und Sie Zugriff auf das Protokoll Ihres FTP-Servers haben, empfehle ich, dieses Protokoll zu verfolgen, um nach erfolgreichen Uploads zu sehen. Dieser ereignisgesteuerte Ansatz ist schneller, zuverlässiger und weniger belastend als ein Polling-Ansatz mit herkömmlichem cron und portabler und einfacher zu debuggen als etwas, das inotify verwendet.

Die Art, wie Sie damit umgehen, hängt natürlich von Ihrem FTP-Server ab. Ich habe einen laufenden vsftpd deren Protokolle enthalten Zeilen wie diese:

Fri May 25 07:36:02 2012 [pid 94378] [joe] OK LOGIN: Client "10.8.7.16" 
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK UPLOAD: Client "10.8.7.16", "/path/to/file.zip", 8395136 bytes, 845.75Kbyte/sec 
Fri May 25 07:36:12 2012 [pid 94380] [joe] OK CHMOD: Client "10.8.7.16", "/path/to/file.zip 644" 

Die UPLOAD Linie wird nur hinzugefügt, wenn vsftpd die Datei erfolgreich gespeichert wurde. Sie könnten dies in einem Shell-Skript wie folgt analysieren:

#!/bin/sh 

tail -F /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo "$line" | cut -d, -f2) 
    if [ -s "$filename" ]; then 
     # do something with $filename 
    fi 
    fi 
done 

Wenn Sie ein HTTP-Upload-Tool verwenden, sehen, ob das Werkzeug eine Textprotokolldatei hat es eingehende Dateien aufzeichnen verwendet zu. Wenn es nicht in Betracht zieht, eine Art Logger-Funktion hinzuzufügen, so wird es Protokolle erzeugen, die Sie tail können.

+0

Das ist perfekt. Ich benutze tatsächlich einen PHP/HTML-Upload-Button. Aber ich kann nur die Zugriffsdatei von Apache für die Upload-Seite scannen. – Cripto

+1

Was ich hier nicht sehe, ist das, was Sie tun, um das Skript auszulösen, das die Protokolldatei schändet. –

+1

@JasonGray, Kennen Sie die '-F' Option von' tail'? ['man tail'] (http://www.freebsd.org/cgi/man.cgi?query=tail) für Details. Das '-F' veranlasst' tail' zu warten, bis die Datei wächst, und dann an stdout zu senden. Der "Auslöser" für den

'do something'
Teil ist einfach das Hinzufügen neuer Inhalte zu der Datei. Dieses Skript wird einmal ausgeführt, möglicherweise beim Start, und wird weiterhin ausgeführt. Wie Sie es starten, hängt von Ihnen ab und hängt von Ihrem Betriebssystem oder Ihrer Distribution ab. – ghoti

3

Sie könnten inotify

Die inotify API aussehen soll einen Mechanismus zur Überwachung der Dateisystemereignisse. Inotify kann verwendet werden, um einzelne Dateien zu überwachen oder Verzeichnisse zu überwachen. Wenn ein Verzeichnis überwacht wird, gibt inotify Ereignisse für das Verzeichnis selbst und für Dateien innerhalb des Verzeichnisses zurück.

4

Wie John kommentiert die inotify API ein Ausgangspunkt ist jedoch könnte man in einigen Tools interessiert sein, die diese API verwenden, um Datei Benachrichtigung Aufgaben auszuführen:

Zum Beispiel incron die verwendet werden können cron- laufen wie Tasks, wenn Datei- oder Verzeichnisänderungen erkannt werden.

Oder inotify-tools Dies ist eine Reihe von Befehlszeilentools, die Sie verwenden könnten, um Ihre eigenen Datei Benachrichtigung Shell-Skript zu erstellen.

Wenn Sie auf den unteren Teil des Wiki pake für inotify-tools schauen, werden Sie Verweise auf noch mehr Werkzeuge und Unterstützung für höhere Programmiersprachen wie Python, Perl oder Ruby (example code) sehen.

0

Mit ghotis arbeiten

Hier ist, was ich getan habe, um den Nutzern freien Raum zu erhalten:

#!/bin/bash 

tail -F -n 1 /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK LOGIN:'; then 
    pid=$(sed 's/.*\[\([^]]*\)\].*/\1/g' <<< "$line") 
    #the operator '<<<' doesnt exist in dash so use bash 
    if [[ $pid != *"pid"* ]]; then 
     echo -e "Disk 1: Contains Games:\n" > /home/vftp/"$pid"/FreeSpace.txt; df -h /media/Disk1/ >> /home/vftp/"$pid"/FreeSpace.txt 
     echo -e "\r\n\r\nIn order to read this properly you need to use a text editor that can read *nix format files" >> /home/vftp/"$pid"/FreeSpace.txt 
    fi 
echo "checked" 
# awk '{ sub("\r$", ""); print }' /home/vftp/"$pid"/FreeSpace.txt > /home/vftp/"$pid"/FreeSpace.txt 
    fi 
done 
0

Wenn die Datei über einen HTTP-Upload hinzugefügt wird, und wenn Ihr Server Apache ist, möchten Sie vielleicht um mod_security zu überprüfen.

Sie können ein Skript für jeden Upload über HTTP POST ausführen.

0
#!/bin/bash 

tail -F -n0 /var/log/vsftpd.log | while read line; do 
    if echo "$line" | grep -q 'OK UPLOAD:'; then 
    filename=$(echo $line | cut -d, -f2 |awk '{print $1}') 
    filename="${filename%\"}" 
    filename="${filename#\"}" 
    #sleep 1s 
    if [ -s $filename ]; then 
     # do something with $filename 
     echo $filename 
    fi 
    fi 
done 
Verwandte Themen