Inotify: Dateien überwachen

007-Tux Logo

Du kannst in Linux Systemen die Veränderungen an Dateien im Dateisystem mit inotify überwachen.

Um, sobald Dateien verändert wurden ein .tar.gz-Archiv zur Datensicherung zu erstellen oder die veränderte Datei auf einen anderen Server hochladen, oder auch an ein Filter / Beautifier zu übergeben oder auch einfach nur um auf meinem NAS eine LED anschalten ist inotify das Werkzeug auf das alle die es noch nicht kennen gewartet haben.

Ich bin schon vor einigen Jahren auf ein Problem gestoßen für das inotify die richtige Lösung gewesen wäre. Damals konnte ich nir nur eine Endlosschleife schreiben die immer wieder alle Dateien in meinen Verzeichnissen durchgegangen ist, keine schöne Lösung und endlose Festplattenzugriffe.
Diese Endlosschleife gefiel meinem damaligen Provider garnicht, da diese zu häufig auf die zu überwachenden Dateien Zugriff und die Festplatten am einschlafen hinderten und die Lebensdauer der Festplatten reduzierte.
Damals konnte ich die Schleife einfach mit einer längeren pause() zügeln, bin bald auf einen Cronjob gewechselt der noch seltener lief.

Auf meines eigenen NAS und meinen eigenen Servern bin ich jedoch nicht auf eine Schleife oder Cronjobs angewiesen! Mit einem Inotify Event kann ich die Änderungen direkt im Dateisystem abpassen und die gewünschte Anktion direkt nach der änderung starten.

apt install inotify-tools
Inotify-Events
KürzelFormat
ACCESSZugriff auf die Datei
ATTRIBMetadaten geändert
CLOSE_WRITEzum Schreiben geöffnete Datei geschlossen, sie muss nicht geändert worden sein
CLOSE_NOWRITEEine Datei wurde geschlossen nachdem sie schreibgeschützt geöffnet wurde
CREATENeue Datei angelegt
DELETEDatei gelöscht
DELETESELFÜberwachtes Verzeiuchnis gelöscht
MODIFYDatei modifiziert
MODIFYSELFÜberwachtes Verzeichnis modifiziert
MOVEDFROMDatei aus dem überwachten Verzeichnis verschoben
MOVEDTODatei in das überwachte Verzeichnis verschoben
OPENDatei geöffnet
inotifywait -mrq -e create --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
echo "neue Datei: $FILE"
done

Um zum Beispiel das WordPress Verzeichnises auf neue Dateien zu überwachen kann ich folgendes Snippet nutzen:

inotifywait -mrq -e create --format %w%f /home/customer/der_metzger/loteks_de/www/ | while read FILE;
 do
  echo "neue Datei: $FILE";
done

Dirch dieses Snippet werden alle im WordPressverzeichnis  neu erstellten Dateien ausgegeben.

In meinem Verzeichnis vor allem viele Dateien wp-content/temp-write-test-1492771373. (Die Zahl an ende ändert sich bei jedem Aufruf)
Jedoch werden auch alle Updates, Uploads, Plugin und Theme Installationen und auch all die neuen Dateien an die ich grade nicht denke.

Um herauszufinden welche Dateien „angefasst“ werden wird nur der Parameter „-e create“ auf „-e access“ geändert:

inotifywait -mrq -e access --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
echo "zugriff auf Datei: $FILE"
done

Inotify ist unter Linux ein sehr nützliches Werkzeug, auch für die Fehleranalyse. 😉

auth.log – Das Logging-Verhalten von Debian Jessie

Bei einer Debian 8 minimal Installation, bezeihungsweise einer minimalen Debian Jessie Installationen erscheint im Verzeichnis /var/log in einigen fällen kein auth.log
Das kein auth.log erstellt wird liegt an dem, in der Minimalinstallation, fehlenden Paket: rsyslog.

Sollte ein auth.log erforderlich sein kann das Paket rsyslog sehr einfach mit dem folgenden Befehl nachinstalliert werden.

apt update
apt install rsyslog

Das Paket rsyslog wird auch bei Virtuellen Servern absichtlich nicht installiert, hierdurch gibt es auf dem Virtuellen Maschinen weniger Festplattenzugriffe was alle Virtuellen Server „beschleunigt“.

Solltest du einen Virtuellen Server betreiben entferne das Logging aller Dienste die Du nicht ubedingt benötigst, das Loggin aller Dienste deren Logdaten Du und nicht auswerten musst und auch das Logging aller Dienste die Du nicht auswerten möchtest.

Jede Information die Du keine oder nur ein sehr eingeschrängt schreiben lässt kann auch nicht gestohlen werden und nicht verloren gehen.
Der freiwillige Verzicht die Daten zu schreiben entspricht nicht nur der im deutschen Datenschutz gebotenen Datensparsamkeit, die nicht geschriebenen Daten belegen natürlich auch keinen Speicherplatz auf der Festplatte und ermöglichen zusätzlich bei Virtuellen Servern das trotz geringer IO-Resourcen einen einigermaßen schnelleren Betrieb der eigenen Dienste auf dem virtuellen Server.

Server Benchmark Test from Loteks

Ab dem erleben dieser wird es interessant das Ergebnis eines Benchmarks zu haben um belastbare Zahlen zum vergleich zu haben.

Ein Benchmark? Es gibt für Linux unglaublich viele Benchmark Werkzeuge. Ich möchte kein Benchmark Werkzeugs. Ich möchte nichts großes und ich will nicht herausfinden welches Werkzeug den Parameter misst der mich interessiert.

Ich möchte ein einfachen kleinen Hack der Messen kann was mich interessiert!

Zu diesem Zweck dient dieser Artikel

Dieser Artikel ist ein wenig im Fluss und wird je nach vorliegenden Kommentaren angepasst.

Messen der CPU Geschwindigkeit: (Pi bis zur Stelle 5000 berechnen)

time echo "scale=5000; a(1)*4" | bc -l

Messen der Festplatten Schreibrate:

dd if=/dev/zero of=/test.file bs=1024 count=10240

Messen der Festplatten Leserate:

dd if=/test.file of=/dev/null

Messen der Netzwerkgeschwindigkeit:

wget -O speedtest-cli https://raw.githubusercontent.com/sivel/speedtest-cli/master/speedtest.py
chmod +x speedtest-cli
./speedtest-cli

Für alle die Virtuelle Server gemietet haben:
Ja, es ist schade das euer VServer wirklich langsam ist. Lebt damit! Ihr teilt euch die CPU, Netzwerkverbindung und die Festplattenzugriffszeiten mit anderen. Seid sozial und übertreibt es nicht mit den Festplattenzugriffen, die anderen wollen auch mal. Lebt mit den 10MByte lese und Schreibrate!
Wenn es darauf ankommt nutzt doch bitte dedizierte Server!

Bitte spielt nicht mit den Logdateien

Vor kurzem durfte ich erleben das Festplatten ohne guten grund voll belegt waren, da Administratoren auf die Idee kamen im Log Verzeichnis die Logfiles zu komprimieren.

Bitte ändert die Dateien im LogVerzeichnis nicht! Der Logrotate Dienst wird die Dateien nicht mehr finden und die Datei bleibt für immer dort liegen.

Um Logfiles zu rotieren benutzt logrotate!

Der Aufruf für das rotieren der Logfiles lautet:

logrotate -f /etc/logrotate.conf

Alle TCP/UDP Ports prüfen

Ich suchte im Netz eine Möglichkeit in einem Fremden Netzwerk die erlaubten offenen Ports zu entdecken, leider fand ich keine „out of the box“ Lösung im Internet und baute mir die hier dokumentierte Lösung.

Der Netzwerk Computer ist in der folgenden Konfiguration mit meinem Testserver verbunden.:
nmap-netzwerk für den Netzwerkscan
Auf der Laptop Seite hinterlege ich einen neuen SSH Private Key übertrage einen zugehörigen Public aus dem Server in die Datei ~/.ssh/authorized_keys:

ssh-keygen -b 4096
scp ~/.ssh/id_rsa.pub root@:
ssh root@
mkdir ~/.ssh
cat ~/id_rsa.pub >> ~/.ssh/authorized_keys
rm ~/id_rsa.pub
chmod 600 ~/.ssh/authorized_keys

Auf der zu testenden Seite legte ich mir dieses kleine Shellscript ab, das nach und nach Netcat lokal auf verschiedene Ports lauschen lässt und im Anschluss versucht die Ports von der Serverseite aus zu erreichen.:

#!/bin/bash

COMPUTER="85.214.70.215"
ME=$(/usr/bin/curl http://shortip.de/txt) 1>/dev/null 2>/dev/null

for ((PORT=1; PORT< =65535; PORT++)) do /bin/nc -l $PORT 2>/dev/null &
 ssh root@$COMPUTER -t "/bin/netcat -vv -n -z -w 3 $ME $PORT"
done

Um Netcat an UDP-Ports senden, oder auf UDP Ports lauschen zu lassen kann die Option -u mit angegeben werden.

Diese Methode dauert selbstverständlich ewig und ist nur anwendbar wen wenige Ports zu durchsuchen sind und nicht wie im Beispielscript angegeben alle 65535.

Hostkeys und Moduli für sshd erneuern

Bei einem neu eingespielten Raspberry Pi Betriebssystem Image sollten die Hostkeys und die Moduli Datei des SSH Dienstes sshd ausgetauscht werden.

Die Hostkeys dienen der Authentifizierung des Servers und, zusammen mit der Moduli Datei, der Initialisierung der Verschlüsselung. Um die Verschlüsselung nicht angreifbarer zu halten als unbedingt notwendig sollten die Moduli und Keys für jeden Computer unterschiedlich sein.

1.) löschen der alten Hostkeys und der Moduli Datei von sshd

sudo rm /etc/ssh/ssh_host_key
sudo rm /etc/ssh/ssh_host_key.pub
sudo rm /etc/ssh/ssh_host_rsa_key
sudo rm /etc/ssh/ssh_host_rsa_key.pub
sudo rm /etc/ssh/ssh_host_dsa_key
sudo rm /etc/ssh/ssh_host_dsa_key.pub
sudo rm /etc/ssh/moduli

2.) Hostkey für sshd neu generieren

sudo /usr/bin/ssh-keygen -t rsa1 -f /etc/ssh/ssh_host_key -N ""
sudo /usr/bin/ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -N ""
sudo /usr/bin/ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -N ""
sudo /usr/bin/ssh-keygen -t ed25519 -f /etc/ssh/ssh_host_ed25519_key -C "" -N ""
sudo /usr/bin/ssh-keygen -t ecdsa -f /etc/ssh/ssh_host_ecdsa_key -C "" -N ""

3.) Moduli Kandidaten für sshd generieren und wählen

# moduli kandidaten generieren

ssh-keygen -G moduli-2048.candidates -b 2048

# sichere kandidaten wählen

ssh-keygen -T moduli-2048 -f moduli-2048.candidates
cat moduli-2048 > /etc/ssh/moduli

Wenn jetzt, nach diesem Hostkey und Moduli Update eine Verbindung zu disem SSH-Server hergestellt werden soll wird die Fehlermedung „WARNING: POSSIBLE DNS SPOOFING DETECTED!“ und die Fehlermeldung „WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!“ angezeigt. Mit ssh-keygen kann der alte Hostkey aus der known_hosts Datei entfernt werden.:

ssh-keygen -R servername

FTP Geschwindigkeit von der Linux Shell aus messen

Bourne-again shell

Manchmal erscheinen FTP Server unglaublich langsam. Um einen realistischen Geschwindigkeits Test durchzuführen habe ich mir den Folgenden Weg überlegt.

1.) Testdateien erstellen

~]> dd if=/dev/urandom of=~/test1M count=1 bs=1M
1+0 Datensätze ein
1+0 Datensätze aus
1048576 Bytes (1,0 MB) kopiert, 0,170467 s, 6,2 MB/s
~]> dd if=/dev/urandom of=~/test10M count=10 bs=1M
10+0 Datensätze ein
10+0 Datensätze aus
10485760 Bytes (10 MB) kopiert, 1,15114 s, 9,1 MB/s

2.) Verbindung zum FTP Server herstellen

~]> ftp ftp.server.local
Connected to ftp.server.local.
220 FTP-Backupspace
Name (ftp.server.local:root): benutzer
331 Password required for benutzer
Password:
230 User benutzer logged in
Remote system type is UNIX.
Using binary mode to transfer files.
ftp>

3.) Die Testdateien zum Server übertragen

ftp> put test1M
local: test1M remote: test1M
200 PORT command successful
150 Opening BINARY mode data connection for test1M
226 Transfer complete
1048576 bytes sent in 0.12 secs (8661.7 kB/s)
ftp>
ftp> put test10M
local: test10M remote: test10M
200 PORT command successful
150 Opening BINARY mode data connection for test10M
226 Transfer complete
10485760 bytes sent in 1.81 secs (5655.2 kB/s)
ftp>

4.) Die Testdateien vom Server zurück übertragen

ftp> get test1M
local: test1M remote: test1M
200 PORT command successful
150 Opening BINARY mode data connection for test1M (1048576 bytes)
226 Transfer complete
1048576 bytes received in 0.11 secs (9278.0 kB/s)
ftp>
ftp> get test10M
local: test10M remote: test10M
200 PORT command successful
150 Opening BINARY mode data connection for test10M (10485760 bytes)
226 Transfer complete
10485760 bytes received in 1.13 secs (9039.9 kB/s)
ftp>

5.) Aufräumen

ftp> delete test1M
250 DELE command successful
ftp> delete test10
550 test10: No such file or directory
ftp> delete test10M
250 DELE command successful
ftp>
ftp> quit
221 Goodbye.
~]> rm test1M
~]> rm test10M

6.) Auswertung

Die Übertragung der Dateien erfolgte in meinem Beispiel mit mindestens (5655.2 kB/s) zum FTP Server und mit mindestens (9039.9 kB/s) vom Server zum Computer.

Wenn ihr einen Besseren Weg kennt die FTP Geschwindigkeit zu messen, meldet euch

Wo finde ich die Dateien der MySQL Datenbank?

Um das Datenverzeichnis einer MySQL Datenbank zu finden kann in der my.cnf Daten nachgesehen werden.

Die Datei my.cnf ist häufig im Verzeichnis /etc oder /etc/mysql zu finden. In der Datei befindet sich eine Zeile „datadir = [Verzeichnis]“, dieses [Verzeichnis] ist der Ort an dem Auf der Festplatte des Servers die Daten der MySQL Datenbank liegen.

Die folgende Zeile gibt das Verzeichnis direkt aus.:

find /etc -name my.cnf 2>/dev/null -exec cat {} \;|\
grep datadir|cut -d= -f2-

Erklärung der Zeile:

  •  find
    • sucht nach Dateien im Verzeichnis /etc mit dem Namen my.cnf
  • cat
    • gibt den Inhalt der gefundenen Datei aus
  • grep
    • gibt nur die Zeile die datadir enthält aus
  • cut
    • gibt alles nach dem Gleichheitszeichen aus

Linux: eine einfache und „schöne“ Festplattenfüllanzeige

Ich stelle euch hier mein Script zur Festplattenfüllanzeige meiner Server zur verfügung, da viele meiner Freunde das Script von mir wünschten.

Ich habe das script auf meinen Server in der .bashrc Datei hinterlegt und es zeigt nach dem Login auf den Server, auch via SSH, werden die Fülldaten aller eingebundenen Datenträger angezeigt.

Die Ausgabe des Scriptes enspricht diesem Bild

Die Farben der Rahmen wird bei einer Belegung von 80% nicht mehr grün sondern gelb und ab sowie ab 90% Festplattenfülle in Rot dargestellt.

Die Breite der Darstellung passt sich beim Aufruf automatisch der im Terminalfenster verfügbaren Breite des Fensters an.

Auf meinem CL-25B2 NAS habe dieses Script, anstelle der .bashrc Datei in der Datei /etc/profile.local hinterlegt, so das die Festplattenfüllanzeige bei jedem Login angezeigt wird, nicht nur bei einem bestimmten Benutzer.

Für Verbesserungsvorschläge bin ich immer Dankbar, diese bitte in die Kommentare 😉

#!/bin/bash

# Ausgabe eines Statusbalkens
statusbalken() {
 if [ $# != 1 ]
  then
   exit;
 fi

 used=$(df "$1"|tail -n 1|awk '{print $3}')
 total=$(df "$1"|tail -n 1|awk '{print $2}')

 e=$(printf "\033")
 end="$e[0m"
 COLUMNS=$(tput cols)
 COLUMNS=$((COLUMNS-9))

 PERCENT=$(echo "$used $total 100"|awk '{printf ("%i", $1/$2*$3 )}')
 percent=$(echo "$used $total $COLUMNS"|awk '{printf ("%i", $1/$2*$3 )}')

 COLOR="$e[1;31m"
 if [[ $PERCENT -lt 90 ]] ;then
  COLOR="$e[1;33m"
 fi
 if [[ $PERCENT -lt 80 ]] ;then
  COLOR="$e[1;32m"
 fi

 printf " Disk usage: %s\n ${COLOR}[${end}" "$1"
 for (( i=0; i< percent; i++ ))
 do
  printf "%b" "#"
 done

 for (( i=percent; i<COLUMNS; i++ ))
 do
  printf "%b" "-"
 done
 printf "${COLOR}]${end}%3d%%\n" "$PERCENT"
}

# Laufwerke ermitteln
drives=$(mount|grep -E '^\/'|awk '{print $3}')

for var in $drives
do
 statusbalken "$var"
done

Da im WordPress die Formatierung von Shellscripten immer ungewünscht „angepasst“ wird, zusätzlich hier noch ein Download-Link für das Script.: http://dl.loteks.de/drives.sh

Festplatten Seriennummern unter Linux herausfinden

Um im PC-oder NAS Gehäuse immer gleich die richtige Festplatte zum Tauschen zu finden, muss im ID bzw. die Seriennummer der Festplatte herausgefunden werden.

Da leider nicht jedes NAS auf der Shell auch alle Befehle erlaubt Beziehungsweise alle Befehle anbietet, hier eine Liste mit 4 Methoden die Seriennummer von Festplatten unter Linux auszulesen.:

udebadm

udevadm info --query=property --name=/dev/sda | grep "^ID_SERIAL_SHORT=" | sed "s/ID_SERIAL_SHORT=//g"

Unter „–name=/dev/“ wird das Laufwerk angegeben, die Ausgabe ist nur die Seriennummer.

hdparm

hdparm -i /dev/sda | sed -ne '/SerialNo/{s/.*SerialNo=\s*\(.*\)/\1/ ; p}'

Die Festplatte wurd als „-i /dev/sda“ angegeben, alternativ können hier mehrere Festplatten mit „-i /dev/sd[ab]“ angegeben werde. Die Ausgabe ist ausschließlich die Seriennummer.

smartctl

smartctl -i /dev/sda|sed -ne '/Serial\ Number\:/{s/.*Serial\ Number\:\s*\(.*\)/\1/ ; p}'

Auch bei smartctl wird mit „-i /dev/sda“ die fragliche Festplatte angegeben. Die Ausgabe ist ausschließlich die Seriennummer.

 grep, awk, sed

ls -l /dev/disk/by-id/ | grep scsi- | grep -v part | awk '{print $NF " " $(NF-2)}' | sed 's|../../||g' | sed 's/scsi-...._//g'

gibt alle Festplatten mit den zugehörigen Seriennummern und Bezeichnung aus.