vnStat: Wieviel Netzwerkverkehr hatte welches Interface

Aus verschiedenen Gründen wollt ich monitoren, wieviel MB Traffic ich bei meinem Notebook so täglich über das UMTS Modem habe.

Gestolpert bin ich da über das Programm-Paket “vnstat”. Es läuft ein kleiner Daemon im Hintergrund und addiert defaultmäßig alle 5 Minuten den Traffic, der über die konfigurierten Interfaces ging und zeichnet diesen in einer Datenbank auf.

Abgefragt ist die Sache einfach mit “vnstat”:

$ vnstat

 rx / tx / total / estimated
 eth0: Not enough data available yet.
 wlan0:
 Dec '14 2.28 MiB / 610 KiB / 2.88 MiB / 0 KiB
 yesterday 2.28 MiB / 610 KiB / 2.88 MiB
 today 0 KiB / 0 KiB / 0 KiB / -- 

 virbr0: Not enough data available yet.
 wwan0:
 Dec '14 142.02 MiB / 89.06 MiB / 231.08 MiB / 2.62 GiB
 yesterday 0 KiB / 0 KiB / 0 KiB
 today 142.02 MiB / 89.06 MiB / 231.08 MiB / 343 MiB

Hier sind also alle Interfaces meines Notebooks aufgeführt, wobei mich eigentlich “wwan0”, wohinter sich das UMTS Modem verbirgt interessiert.

Installation unter Ubuntu 14.04 war auch recht einfach:

sudo apt-get install vnstat

Linux /tmp read-only nachträglich für Arme – ohne getrenntes Dateisystem

Temporär-Verzeichnisse wie /tmp oder /var/tmp auf Linux Rechnern read-only zu haben, kann einen vor den Folgen des einen oder anderen -meist automatischen- “Skriptkiddie” Angriffs schützen.

Im Rahmen einiger dieser Angriffe werden in einem für jedermann beschreibbaren Verzeichnis -also meist /tmp- ein Skript abgelegt, dass von dort ausgeführt wird, um weiteren Schaden zu verursachen.

Wenn dieses Verzeichnis nun mit der Option “noexec” gemounted ist, ist das Ausführen von Dateien dirkt aus dem Verzeichnis immerhin schwieriger. Unmöglich ist es jedoch nicht: Man könnte immer noch den notwendigen Befehlsinterpreter starten und das Skript als Parameter übergeben. Aber es geht hier einfach nur um eine weiter Hürde, die es für wenig Aufwand gibt und um automatische Angriffe, die ohne viel manuellen Zutun von nicht höchst fachlich fähigen Leuten ausgeführt werden.

Gut, ein Dateisystem kann man mit dem Parameter “-o noexec” mounten. – Was aber, wenn nun kein getrenntes Dateisystem für /tmp (und /var/tmp) bereit steht?

Hier lässt sich die Option “mount –bind” nutzen, um ein Verzeichnis in ein anderes zu mounten.

Vorbereitung. Kopien der Verzeichnisse /tmp und /var/tmp anfertigen. z.B. so:

cp -a /tmp /tmp-real
cp -a /var/temp /var/tmp-real

Dann lassen sich die “tmp-real” Verzeichnisse auf die “tmp” Verzeichnisse mounten:

mount -v --bind /tmp-real /tmp
mount -v -o remount,noexec,nosuid /tmp

Probe aufs Exempel:

$ ls -l /tmp
total 4
-rwxrwxr-x 1 testuser user 28 May 7 22:14 test.sh
$ cat /tmp/test.sh 
#! /bin/sh

echo Jaaaaaaaa

$ /tmp/test.sh
bash: /tmp/test.sh: Permission denied

Auch als root läßt es sich nicht ausführen:

~ # id
uid=0(root) gid=0(root) groups=0(root)
~ # /tmp/test.sh
-su: /tmp/test.sh: Permission denied

Jetzt noch alles zusammen: Ein Skript, um die Verzeichnisse read-only zu mounten:

~/bin # cat mount_tmp_noexec.sh
#!/bin/sh

echo noexec  to /tmp
mount -v --bind /tmp-real /tmp && mount -v -o remount,noexec,nosuid /tmp

echo
echo noexec to /var/tmp
mount -v --bind /var/tmp-real /var/tmp && mount -v -o remount,noexec,nosuid /var/tmp

echo 
echo Now mounted:
mount

…und eines das Ganze wieder rückgängig zu machen:

~/bin # cat mount_tmp_exec.sh 
#!/bin/sh

echo Umounting /tmp from noexec
# mount --bind /tmp-real /tmp && mount -o remount,exec,suid /tmp
umount /tmp

echo
echo Umounting /var/tmp from noexec
# mount --bind /var/tmp-real /var/tmp && mount -o remount,exec,suid /var/tmp
umount /var/tmp

echo 
echo Now mounted:
mount

Für das Einspielen von Paketen ist es zu empfehlen /tmp wieder read-write zu haben, da auch die Pakete vielfach Skripte zur Pre- oder Post-Installation dort ablegen und ausführen.

Beim Umounten kann es zu Problemen kommen, wenn Prozesse noch Dateien in dem Verzeichniss geöffnet lassen. Hier mit “lsof” o.ä. nachforschen.

Zugriff verweigert oder wer hat meine Datei geöffnet: handle.exe zeigt offene Datei-Handles unter Windows

Zugriff verweigert/ Access denied beim Datei-Löschen

Letztens unter Windows 2003 Server: Da lässt sich eine Datei nicht löschen oder umbenennen. – Man bekommt immer nur ein “Zugriff verweigert” (oder in englisch “Access denied”). Nicht irgendwie noch eine Zusatzinformation, dass sie noch von einem anderen User oder Programm geöffnet ist. “Administrator” ist man ja selbstredend; daran liegt’s auch nicht.

Der “Eigenschaften”-Dialog im Windows Explorer zeigt auch nur die “Allgemein” Seite an, keine anderen Reiter sind da. cacls.exe bringt auch nur Zugriff verweigert. Seltsam.

Ein delete on reboot ist auch nicht drin, ist ja ein (Terminal-)Server. Spontaner Reboot ist eher mit Stress verbunden.

Unter Linux…

…wär das nicht passiert. Naja, bis auf die Tatsache, dass das File-Locking unter Windows und Linux völlig verschiedene Paar Schuh sind, ist unter Linux das Tool “lsof” (List Open Files) dabei. In dessen Ausgabe hätte ich schnell den schuldigen Prozess ausgemacht, der die Datei sperrt. Aber Windows bringt da leider meines Wissens nichts mit.

Da gibt’s ja noch (ex-)Sysinternals

Sysinternals.com – Die einzige Firma, die gerüchteweise mehr Knowhow über Windows hatte als Microsoft selber. Vor einiger Zeit hat MS die ja dann auch (deswegen?) geschluckt. – Wenn die jetzt noch Sernet kaufen, haben sie endlich den größten Teil des weltweiten Windows Knohows vereint. ;->

Mark Russinovich hat das schöne, kleine Tools handle.exe geschrieben, dass ganz einfach auf der Kommandozeile die File-Handles und Prozesse ausgibt, die eine Datei geöffnet haben:

C:\temp>c:\handle.exe wurst.jpg                                                                                                                
                                                                                                                                               
Handle v3.46                                                                                                                                   
Copyright (C) 1997-2011 Mark Russinovich                                                                                                       
Sysinternals - www.sysinternals.com                                                                                                            
                                                                                                                                               
gzip.exe           pid: 4711  type: File           698: C:\temp\wurst.jpg

Und weg…

Damit war der Schuldige gefunden: gzip.exe unter der PID 4711. – Kurz im Taskmanager den Prozess beendet und die böse Datei doch noch gelöscht.

for-Schleife in Kommandozeile/ cmd.exe in Windows über Liste von Ausgaben mit Hilfe von Backticks

Die Linux-Shell kann’s…

Wer kennt’s nicht? – Mal eben in der Linux-Shell die (Standard-)Ausgabe eines Kommandos zeilenweise über eine for-Schleife abarbeiten mittels der unauffälligen Backtick-Zeichen ‘`’, also dieser irgendwie “nach hinten” gekippten einfache Hochkommata?!

Also z.B. alle .JPG-Dateien in einem Verzeichnis in .jpg umbenennen (ja, danke FAT, dass Du keine Groß- und Kleinschreibung unterscheiden kannst…):

david@bree:~$ ll
insgesamt 2256
-rw-r--r-- 1 david users 151022 2010-12-24 15:20 1024_IMG_9239.JPG
-rw-r--r-- 1 david users 250506 2010-12-24 15:20 1024_IMG_9240.JPG
-rw-r--r-- 1 david users 318714 2010-12-24 15:20 1024_IMG_9241.JPG
-rw-r--r-- 1 david users 206009 2010-12-24 15:20 1024_IMG_9242.JPG
-rw-r--r-- 1 david users 266578 2010-12-24 15:20 1024_IMG_9243.JPG
-rw-r--r-- 1 david users 233510 2010-12-24 15:20 1024_IMG_9244.JPG
-rw-r--r-- 1 david users 248728 2010-12-24 15:20 1024_IMG_9245.JPG
-rw-r--r-- 1 david users 189831 2010-12-24 15:20 1024_IMG_9246.JPG
-rw-r--r-- 1 david users 211490 2010-12-24 15:20 1024_IMG_9247.JPG
-rw-r--r-- 1 david users 168863 2010-12-24 15:20 1024_IMG_9249.JPG
david@bree:~$ for f in `ls`; do mv $f `echo $f | sed 's/JPG$/jpg/g'`; done
david@bree:~$ ll
insgesamt 2256
-rw-r--r-- 1 david users 151022 2010-12-24 15:20 1024_IMG_9239.jpg
-rw-r--r-- 1 david users 250506 2010-12-24 15:20 1024_IMG_9240.jpg
-rw-r--r-- 1 david users 318714 2010-12-24 15:20 1024_IMG_9241.jpg
-rw-r--r-- 1 david users 206009 2010-12-24 15:20 1024_IMG_9242.jpg
-rw-r--r-- 1 david users 266578 2010-12-24 15:20 1024_IMG_9243.jpg
-rw-r--r-- 1 david users 233510 2010-12-24 15:20 1024_IMG_9244.jpg
-rw-r--r-- 1 david users 248728 2010-12-24 15:20 1024_IMG_9245.jpg
-rw-r--r-- 1 david users 189831 2010-12-24 15:20 1024_IMG_9246.jpg
-rw-r--r-- 1 david users 211490 2010-12-24 15:20 1024_IMG_9247.jpg
-rw-r--r-- 1 david users 168863 2010-12-24 15:20 1024_IMG_9249.jpg

Die for-Schleife loopt hier einfach mit der Variable f über die Ausgabe des ls-Kommandos und verwurstet nicht einfach den String “ls” als Eingabe. – Dank der ‘`’ Backticks, die das “ls” umschließen.
Ja, und richtig gesehen, auch im Umbenennen zum Ersetzen des Strings “JPG” durch “jpg” mit sed werden sie hier genutzt. Das aber nur nebenbei… Hier geht’s mit eigentlich nur um die for-Schleife über Ausgaben eines Kommandos.

Und jetzt auf DOS

Ok, DOS, also command.com kann es nicht, aber in der nativen Kommandozeile von Windows NT und Nachfahren, der cmd.exe gibt es eine ähnliche Möglichkeit:

for /F " usebackq delims==" %%f in (`dir /B *.JPG`) do (
 move %%f %%f.jpg
)

Und ja, ich weiß, dass a) zum Massen-Umbenennen wohl auch ein “move *.JPG *.jpg” in cmd.exe funktionieren sollte und b) mit obigem Kommando aus a.JPG ein a.JPG.jpg (und nicht a.jpg) würde. – Es geht mit aber nur um ein Beispiel… 🙂

Viel Spaß damit. Für mich war das schon öfter nützlich.