Hier entsteht eine Sammlung von nützlichen Linuxbefehlen, haupsächlich für die Konsole. Ich selbst benutze Xubuntu 14.04 LTS, ein leichteres Ubuntu für nicht so neue PCs und Laptops. Auch mit älterer Hardware läuft das System sehr flüssig. Ich benutze gerne die Kommando-Shell, da man hier so gut wie alles mit machen kann. Durch die Kombination von vielen kleinen Programmen, Nutzung der Pipes und Umleitungen können selbst komplexe Tätigkeiten automatisiert werden. Im Menüpunkt "Shell Skripte" stelle ich dazu noch einiges vor. Jeder Beitrag versehe ich mit einer Nummer, damit man sich darauf bei Fragen beziehen kann.
(8) Der Befehl "mount"
Mit diesem Befehl lassen sich verschiedene Geräte (devices genannt) ins Dateisystem einhängen, d.h. man kann sich dann die darin enthaltenen Verzeichnisse und Dateien ansehen, je nach Rechten auch ändern oder kopieren etc.
Man kann viele verschiedene Dateisysteme einhängen, auch solche auf fremden Rechnern, Netzwerkfreigaben, Wechseldatenträger (USB, Floppy, CD). Dabei werden nicht nur Dateisysteme von Linux sondern auch so gut wie allen Betriebssystemen unterstützt.
Einige nützliche und auch von mir benutzte Möglichkeiten sind:
(a) Das Dateisystem eines anderen Linux-Rechners einhängen, z.B. betreibe ich einige Raspberry Pis in meinem Heimnetz mit verschiedenen Aufgaben wie PV-Datenlogger (siehe dazu im Bereich Fotovoltaik), Homepages, OSMC, Internet Radio. Um mal schnell etwas auf oder von einen Raspi kopieren zu können, kann man dann folgenden Befehl benutzen, um das entfernte Dateisystem zu mounten
sshfs benutzerDiese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!:/verzeichnis mountpoint
und dann mit einem Dateimanager hin- und her zu kopieren.
Als Beispiel, wenn ich meinen PV-Logger am PC einhängen will:
sshfs Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!:/ /media/mora/pvlogger
Das Programm sshfs fordert dann auf zur Eingabe des Passwortes vom Benutzer (hier root) auf dem entfernten Rechner. Natürlich muß das Verzeichnis für den Mountpoint angelegt sein und sshfs installiert sein. sshfs installiert man ganz einfach mittels:
sudo apt-get install sshfs
Zum Unmounten nimmt man folgenden Befehl
fusermount -u mountpoint
Man kann natürlich - für einzelne Kopiervorgänge - direkt den Befehl "scp" benutzen. Das würde dann so aussehen, um z.B. aus dem Homeverzeichnis eines RasPi die Datei "datei" zu kopieren:
scp Diese E-Mail-Adresse ist vor Spambots geschützt! Zur Anzeige muss JavaScript eingeschaltet sein!:/home/pi/datei .
Auch hier wird wiederum das Passwort des Benutzers auf dem entfernten Rechner, also der von Benutzer pi, erfragt.
Sollte beim ssh-Server nicht der Standardport 22 eingestellt sein, so kann man diesen beim Befehl mitgeben. Leider sind hier sshfs und scp nicht einheitlich. Bei sshfs geht das mit einem kleinen "p", also zB. -p 2201, und bei scp mit einem großen "P", also z.B. -P 2201.
(b) "mount" ist sehr vielseitig. Man kann alle möglichen Images mounten, ob .iso oder .img. Von Zeit zu Zeit ziehe ich mir von meinen RasPis ein Image, und lege diese auf meinem Desktop-PC ab. Da diese Images mittels "dd" im laufenden Betrieb erzeugt werden, sind diese nicht immer in sich konsistent, ist ja logisch. Wenn man jetzt so ein Image mountet und mit fsck auf Fehler überprüft und auch wieder korrigiert ist wieder alles in Ordnung.
Ein Plattenimage kann nun mehere Partitionen und Dateisysteme enthalten. Der Befehl "fdisk -l" kann nicht nur direkt Partitionsdaten von Festplatten oder andere Devices auflisten, sondern auch von Images. So liefert der der Befehl
fdisk -l raspi.img
folgenden Ausgabe:
Platte raspi.img: 7822 MByte, 7822376960 Byte
255 Köpfe, 63 Sektoren/Spur, 951 Zylinder, zusammen 15278080 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Festplattenidentifikation: 0x00016187
Gerät boot. Anfang Ende Blöcke Id System
raspi.img1 8192 122879 57344 c W95 FAT32 (LBA)
raspi.img2 122880 15278079 7577600 83 Linux
Wie man sieht sind im Image 2 Partitionen, raspi.img1 und raspi.img2.
Zum Mounten wird nun der Startsektor der Partition benötigt, in der Auflistung findet man diesen in der Spalte "Anfang". Wichtig ist außerdem die Sektorgröße, hier 512 byte, was auch der Normalfall ist. Daraus errechnet man die Startposition der 2. Partition aus 122880 * 512 und erhält 62914560. Und mit folgenden Befehl wird dann die 2. Partition in den Mountpunkt /mnt gehängt:
sudo mount -o loop,offset=62914560 raspi.img /mnt
Alle Änderungen, die man nun in /mnt ausführt sind automatisch in raspi.img.
Das oben erwähnte Reparieren eines Images geht natürlich nicht, wenn das Image gemountet ist. "fsck" arbeitet mit devices. Nun gibt es den Befehl "losetup" (= loop device setup), mit dem man Images auch als loop device zur Verfügung stellen kann und mittels "fsck" überprüfen und reparieren kann. Die Syntax des Befehls ähnelt dem von mount für device loop, nämlich
losetup --offset 62914560 /dev/loop2 raspi.img
#loop2 zur Verfügung stellen
fsck /dev/loop2
# Partition 2 res raspi-Image überprüfen
losetup -d /dev/loop2
# detach des Device, also wieder freigeben
(7) Bilder massenweise skalieren
Bilder im jpg Format von derzeitigen Digitalkameras haben je nach Einstellung eine Größe von mehrem MB, bei mir sind es typerweise ca 8 MB. Das ist zu groß, um z.B. eine Webseite zu zieren. In einer Slideshow oder Fotogallerie sind oftmals viele Bilder, so dass sich die Runterskalierung aller Bilder mittels Tools wie Gimp doch recht mühsam gestaltet.
Dazu benutze ich das Kommandozeilen-Tool mogrify, das Teil des packages imagemagick ist, und das ein wirklicher Tausendsassa ist. Installiert wird es mittels
sudo apt-get install imagemagick
Meine Bilder skaliere ich mit folgendem Befehl
mogrify -resize 800x -density 72 *.jpg
in eine Auflösung von 72 dpi (statt 180) und in eine Breite von 800 Pixel. Dadurch reduziert sich die Größe der Bilddatei auf 200 - 300 KB, wobei die Bilder noch scharf genug und auch flüssig geladen werden
(6) Der Befehl "history"
listet alle bisher benutzen Befehle auf, die man in einem Terminal eingegeben hat. In Verbindung mit grep findet man so also leicht nochmal einen Aufruf, von dem man die damals benutzten Parameter nicht mehr weiß.
Aufruf von
history | grep mogrify
liefert dann
1717 mogrify -resize 800x -density 72 *.JPG
1897 history | grep mogrify
Will man nun einen Befehl aus der Liste nochmals genau mit den gleichen Parametern nochmals ausführen, so braucht nur ein Ausrufezeichen (!) gefolgt von der Zeilennummer einzugeben, also zB !1717
(5) Umwandlung einer HTML Seite in eine PDF Datei
geht recht einfach mit dem Tool "wkhtmltopdf", das man sich bei wkhtmltopdf.org runterladen kann, und zwar so
wkhtmltopdf url.html pdffile.pdf
(4) Umlaute und sonstige Sonderzeichen ersetzen durch die HTML Entities
Beim Wechsel der PHP Version kam es mal vor, dass PHP die Umlaute nicht mehr richtig dargestellt hat. Mit dem folgenden kleinen Skript html2ent (von Michael Luthardt) kann man die Umlaute und das scharfe S in einer Datei ersetzen. Benutzt wird dabei der Kommandozeilen Editor "sed".
#!/bin/bash
# replace german umlauts and predefined character sequences
# with html-entities in a file given as parameter
# place it into /usr/local/bin, make it executable
# to all and add it to nautilus-actions
# Michael Luthardt 2007
# http://dr-luthardt.de/
cp $1 $1.bak # safety first
sed -i -e 's/\Ä/\Ä/g' \
-i -e 's/\ä/\ä/g' \
-i -e 's/\Ö/\Ö/g' \
-i -e 's/\ö/\ö/g' \
-i -e 's/\Ü/\Ü/g' \
-i -e 's/\ü/\ü/g' \
-i -e 's/\ß/\ß/g' \
$1
(3) Wer suchet der findet
"find" und "ls" in Verbindung (Pipe) mit grep sind die typischen Linuxkommandos zum Suchen.
Hier einige Beispiele:
(a) Das aktuelle Verzeichnis und alle Unterverzeichnisse nach Dateien durchsuchen, die "suchstr" in ihrem Dateinamen haben geht so
grep -i -r suchstr .
(b) das aktuelle Verzeichnis (der Punkt am Schluß) und alle Unterverzeichnisse nach Dateien mit Umlauten (hier als Beispiel) im Inhalt durchsuchen. Dabei werden Bilder und PDFs ausgeschlossen
grep -r -l --exclude=*.jpg --exclude=*.JPG --exclude=*.pdf [üäöÜÄÖß] .
(c) liste alle Dateien ab einer bestimmten Größe (hier 50 MB) nach Größe abwärts sortiert auf
find <verzeichnis> -type f -size +50000k| xargs ls -lahS
In Verbindung mit dem Parameter -exec kann man mit dem Befehl "find" Massenänderungen im Dateisystem vornehmen (bitte Vorsicht!).
(d) z.B. setzt folgende Codezeile die Rechte 644 in allen Dateien in allen Unterverzeichnissen
find ./* -type f -exec chmod 644 {} \;
Wenn Leerzeichen oder Sonderzeichen in den Dateinamen vorkommen sollte man besser dies hier benutzen
find ./* -type f -print0 | xargs -0 chmod 644
(2) Nervende Problemreports bei Start verschwinden lassen
Auch bei Linux kommt es mal vor, dass ein Programm oder Teile des Kernels abstürzen. Der Dienst Apport versucht dann eine Meldung an die Entwickler abzuschicken und die Logdateien des Absturzes zu löschen. Gelingt dies nicht, kommt die Meldung beim nächsten Neustart wieder hoch. Abhilfe schafft hier ein kleiner Einzeiler in der Konsole, mit dem man die Logdateien löschen kann:
sudo rm /var/crash/*
(1) sudo in Skripten das Passwort mitgeben
Bei vielen Kommandos muß man den Supermodus benutzen, also ein Kommando über "sudo kommando" ausführen. Bei der Ausführung von Skripten wird es natürlich lästig, immer wieder das Passwort eingeben zu müssen. Das kann man umgehen, indem man am Anfang des Skriptes das Passwort in einer Variablen speichert., z.B. durch Eingabe von "read pw". Im Skript kann man dann sudo mit Parameter -S benutzen, das von stdin (Standard-Eingabe = Tastatur) mittels "echo $pw" das Passwort mitbekommt.
read pw <noch n paar andere Befehle> echo $pw | sudo -S Kommando