stderr und stdout auf der Bash umleiten

Wenn ein Programm auf der Linux-Konsole gestartet wird gibt es zweierlei Ausgabedatenströme. Dies sind zum einen die stdout für Ausgaben mit denen das Programm arbeitet und zum anderen stderr für Ausgaben welche einem Fehlverhalten dessen zugrunde liegen.

Diese beiden Ausgabedatenströme kann man aus diversen Gründen zusammenlegen oder in eine andere Richtung umleiten. Dies gilt für diverse Kombinationen mit folgenden Direktiven:

Umleiten von Ausgaben in stderr nach stdout

echo "Hello World" 2>&1

Mit dieser Angabe werden alle Fehlerausgaben auf stdout zugleich mit stderr auf der Konsole zusammengefasst ausgegeben. Dies ist zumeist die häufigst verwendete Variante der Ausgabeumleitung. So kann der Bediener der Konsole alle Ausgaben des Programms unmittelbar sehen.

Umleiten von Ausgaben in stdout nach stderr

echo "Hello World" 1>&2

Alle Ausgaben werden nach stderr geschrieben. Damit werden keinerlei Ausgaben auf stdout ausgegeben und so bleibt die Konsole leer. Dies kann erwünscht sein, sofern den Bediener die Ausgaben nicht interessieren oder die Ausgaben ohnehin von dem ausführenden Programm nicht berücksichtigt werden.

Umleiten von stderr und stdout in eine Datei bzw. Datenstrom

Manchmal interessieren einen die Ausgaben schlicht und ergreifend nicht, da es die Verarbeitung nicht erfordert. Also können Ausgaben jeglicher Art ignoriert werden durch:

undefinedprogram &> /dev/null

Oder automatisierte Prozesse erfordern das Loggen aller Ausgaben in einer Datei. Diese können mit dieser Bash-direction zusammengefasst in eine separater Datei weggeschrieben werden.

undefinedprogram &> combined_output.log

Umleiten von stdout in eine Datei

Die wohl am häufigsten verwendete Verwendung um alle Standardausgaben eines Programms in eine Datei zu schreiben.

echo "Hello World" > output.log

Oder die Verwendung des doppelten > Zeichens um die Ausgaben einer bestehenden Datei anzuhängen:

echo "Hello World" >> output.log

Umleiten von stderr in eine Datei

echo "Hello World" 2> error.log

Diese Art der Bash-Umleitung leitet alle Fehler der Programmausführung in eine Datei. Dies ist dann nützlich wenn nur das Fehlverhalten der Software in eine Datei ausgespeichert werden sollen.

Festplatte unter Linux formatieren und mit ext4 Dateisystem mounten

Eine neue Festplatte unter Linux einzubinden ist gar nicht so schwierig. Nachdem eine neue Festplatte einbaut wurde ist die Verwirrung für einen Linux-Newbee möglicherweise groß. Sobald die notwendigen Befehle bekannt sind, so ist das formatieren und mounten einer neuen Festplatte – sei es eine klassische HDD oder eine SSD – ziemlich einfach umzusetzen.

Dazu muss man nur folgende Schritte verstehen und umsetzen.

Welche Festplatten sind in meinem System enthalten und welche davon ist denn jetzt meine neue Platte?

Mittels nachfolgendem Befehl können die im System laufenden Festplatten auflisten. Damit lassen sich Informationen zu Speichergröße, Plattenname, Größe sowie weitere technischen Details herausfinden:

fdisk -l | grep "/dev/sd"

Die hieraus resultierenden Information dient dazu anhand der Größe den technischen Festplattennamen herauszufinden. Reichen diese Information nicht, so kann man diesen anhand folgendem Befehl eindeutiger bestimmen. Dies setzt dann allerdings sofern man weiß was denn so alles auf dem aufgeklebten Label der Festplatte drauf steht:

ls -la /dev/disk/by-id/

Neue Festplatte formatieren

Mit meinen Recherchen habe ich nun herausgefunden, dass die Platte /dev/sdb jene Festplatte ist, die ich meinem System einbinden möchte. Dazu starten wir dann das Partitionierungsprogramm um eine einzige Partition einzurichten, da ich den gesamten Speicherplatz der Platte an einer einzigen Stelle integrierten möchte.

fdisk /dev/sdb

Es öffnet sich nun das Programm fdisk, welches mittels einfacher Befehle steuern lässt. Via “m” kann man sich eine Liste der verfügbaren Befehle anzeigen lassen. 

Sofern diese Platte noch nicht formatiert ist, da diese möglicherweise zuvor in einem anderen System verwendet wurde, muss dieser Schritt noch vorgenommen werden. Ist diese nicht der Fall so kann dieser übersprungen werden. Ansonsten wird mittels “d” die vorhandene Partition(en) gelöscht. Da kann man nicht viel falsch machen sofern es die richtige Platte ist und man am Ende die gesamte Platte nutzen möchte.

Nun wird eine neue Partition mittels “n” erzeugt. Dazu müssen noch ein paar Angaben vervollständigt werden, welche einfach mit den Vorgaben bestätigt werden können. Abschließend werden diese Änderungen an der Festplatte mittels dem Command “w” bestätigt und dauerhaft im Bootrecord der Platte gespeichert.

Die neue Festplatte mounten

Nachdem nun die neue Festplatte betriebsbereit ist muss diese an einem festen Punkt eingebunden werden um darauf zugreifen zu können. Dazu legt man einen Ordner an und mountet die Platte wie folgt:

mkdir /mnt/data
mount /dev/sdb1 /mnt/data

Da diese Aktion mit dem nächsten Neustart verloren geht, muss das Mounten der Platte in der fstab festgelegt werden um dies dauerhaft zu erhalten.

Durch nachfolgenden Befehl findet man nun heraus welche UUID allen gemounteten Platten zugeordnet sind. Dadurch ist es möglich die Platte nicht mittels /dev/sdb1 zu mounten sondern über die eindeutige ID. Dies ist notwendig, da die Reihenfolge der Zuordnung sich nach einem Reboot ändern kann, insbesondere wenn man mit externen Festplatten oder USB-Sticks an dem Gerät arbeitet.

ls -la /dev/disk/by-uuid/ |grep sdb1

Hieraus erhalten wir nun die ID der Platte. In meinem Fall ist das folgende:
464013af-603b-473d-a408-a592f2aca4b6

Nun bearbeiten wir die fstab und ergänzen diese am Ende der Datei in einer separaten Zeile um einen weiteren Eintrag.

vi /etc/fstab

Dort fügen wir – in meinem Fall mit meiner oben genannten ID – folgenden Inhalt am Ende der Datei an:

UUID=4dc8a09b-889d-7a31-abf6-8b53bc66982e /mnt/data ext4 defaults 0 1

Anzeige der erfolgreich gemounteter Festplatten

Nun kann man sich die im Betriebssystem erfolgreich hinzugefügte Festplatte anzeigen lassen, die künftig auch nach einem Reboot erhalten bleibt.

root@deathstar:/~# df -h

Filesystem       Size Used Avail Use% Mounted on
/dev/mapper/root  55G  37G   16G  70% /
/dev/sdd2        253M 288K  252M   1% /boot/efi
/dev/sdc1        458G 3.4G  431G   1% /mnt/filebase
/dev/sdb1        458G  73M  435G   1% /mnt/backup

Standby Zeit der Festplatte festlegen

Abschließend lohnt es sich noch die Standby-Zeit der Platte festzulegen, sofern die Platte auf einem System läuft, das 24/7 verfügbar ist, jedoch nicht fortwährend benötigt wird und dazu auch keine SSD ist. Dazu kann mit hdparm die Spin-Down Zeit der Festplatte festlegen. Nachfolgender Befehl fährt die Festplatte nach 10 Minuten Inaktivität in den Ruhemodus:

 hdparm -S 120 /dev/sdb

Damit ist die neue Festplatte unter Linux betriebsbereit und kann ihrem gewünschten Verwendungszweck zugeführt werden.

Speedtest auf Linux konsole starten um Download- und Uploadrate zu messen

Um auf der Linux Console einen Speedtest durchzuführen um die Uploadgeschwindigkeit sowie Downloadgewschindigkeit zu testen habe ich ein gutes Tool und Programm gefunden. Dies ist auf github zu finden und kann simpel für den aktuellen Benutzer installiert und eingerichtet werden.

Dafür einfach folgende Befehle auf der Konsole ausführen:

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

Nun kann man den Speedtest durchführen. Mittels folgenden Befehl kann man diesen sofort starten und das Tool sucht automatisch den nächstgelegenen Server für einen Test der Datenverbindung:

speedtest-cli

Dieses Tool hat viele umfangreiche Testmöglichkeiten. Um nur einen geringen Überblick hierüber zu gewinnen kann man sich die Hilfe dessen anzeigen lassen:

speedtest-cli --help

Prozess unter Linux beenden

Ich habe einen Prozess auf einem Linuxsystem am laufen der sich weder mittels

kill 4711

noch durch

kill -sigterm 4711

beenden lässt. Der Befehl kill lässt sich zwar fehlerfrei und ohne konkrete Rückmeldung ausführen, jedoch läuft der beanstandete Prozess weiterhin. Mittels folgender Eingabe kann man den Fehlercode der vorherigen Befehlszeile abfragen:

echo $?

Diese wird einem dann einen Wert ungleich 0 präsentieren und somit die fehlerhafte Ausführung dessen bestätigen.

Um in einem solchen Fall einen hartnäckigen Prozess trotzdem zu beenden kann man folgenden Befehl verwenden:

kill -sigkill 4711

Oder dies kann auch mit einem kürzeren Command abgesendet werden:

kill -9 4711

Dieser Command tötet den Prozess auf der untersten Systemebene und sollte nur mit Vorsicht vorgenommen werden. Ein Datenverlust ist hierbei möglich.

Putty reagiert nicht mehr auf Tastatur-Eingaben

Das Putty-Fenster ist vermeintlich eingefroren und reagiert auf keinerlei TastaturEingaben? Bisher hast Du Dir nur damit helfen können die Verbindung zu beenden und erneut herzustellen?

Das Problem ist relativ schnell erklärt und behoben.

Gerade Entwickler die auf einer grafischen Oberfläche – restriktive Windows – unterwegs sind haben sich einen ganz bestimmten Reflex angewöhnt: Beim Bearbeiten von Textdateien regelmäßig STRG+S zu tätigen um Änderungen an selbigen in einem beliebigen Editor zu speichern.

Diese Handlung führt allerdings auf einer Putty-Konsole zu einer bestimmten Aktion, nämlich dass die Konsole in den XOFF-Modus versetzt wird. Dies bedeutet, dass keine weiteren Ausgaben mehr angezeigt werden und – auch nicht die vom Bediener selbst getätigten. So hat man vermeintlich das Gefühl Putty sei eingefroren oder der Server reagiere nicht mehr. Dies aber ist nicht der Fall.

Wie konnte das nur passieren?

Entweder war der Fokus ungewollt im Putty als man diese Aktion in einem anderen Programm absetzen wollte oder man hat fälschlicherweise im vi oder vim STRG+S gedrückt um Änderungen an einer Datei zu speichern. Dies hat sodann diesen Modus aktiviert.

Lösung

Um den XOFF Modus zu deaktiveren drückt man einfach die Tastenkombination STRG+Q.

Möchte man dies dauerhaft lösen so kann man diesen Modus pauschal deaktivieren. Ich selber habe dies nicht getan, wer aber danach auf der Suche war und mit dieser Einstellung seine Shell einrichten will braucht hierfür nur folgende beiden Zeilen in die .bashrc eintragen:

stty ixany
stty ixoff -ixon

Shortcut für Linux-Konsole um Fenster zu leeren

Ich möchte in meiner Linux Konsole alle Ausgaben in meinem aktuellen Fenster leeren. Dies geht mittels dem Befehl

clear

Unter Windows lautet der Befehl hierfür:

cls

Man kann es jedoch auch viel einfacher haben und dafür die Tastenkombination

STRG + L

verwenden ohne diesen langen Befehl einzutippen und ihn dann noch mit Enter zu bestätigen.

telnet Verbindung lässt sich nicht beenden

Wenn ich mich via telnet auf einen beliebigen Server verbinde kann ich die Verbindung nicht mehr mittles STRG+C abbrechen und auch nicht mittels STRG+Q beenden.

Dies liegt an der Natur von telnet selber. Es wird erwartet, dass man das Kommandofenster startet. Beim Start wird man schließlich nicht weiter darauf hingewiesen:

[vader@deathstar]$ telnet blog.moderlak.de 80
Trying 88.99.14.229...
Connected to blog.moderlak.de.
Escape character is '^]'.

Lösung 

Man könnte nun hingehen und die SSH Sitzung killen oder auch den Timeout der Gegenstelle abwarten. Aber das ist ja kein ordentlicher Verbindungsabbau. Um nun in den Eingabemodus zu gelangen drückt man in der telnet Konsole die Tastenkombination STRG+”+”. Es öffnet sich umgehend die Eingabekonsole:

^]
telnet> 

Hier kann man nun beliebig Befehle absetzen die auf der Gegenstelle ausgeführt werden. Zum Beispiel den Beenden-Befehl:

telnet> quit
Connection closed.

Weitere Hilfe

In der telent Eingabekonsole kann man nun auch durch die Eingabe von help die Liste an Befehlen anfordern mit denen die Gegenstelle korrespondiert :

telnet> help
Commands may be abbreviated.  Commands are:

close           close current connection
logout          forcibly logout remote user and close the connection
display         display operating parameters
mode            try to enter line or character mode ('mode ?' for more)
open            connect to a site
quit            exit telnet
send            transmit special characters ('send ?' for more)
set             set operating parameters ('set ?' for more)
unset           unset operating parameters ('unset ?' for more)
status          print status information
toggle          toggle operating parameters ('toggle ?' for more)
slc             change state of special charaters ('slc ?' for more)
z               suspend telnet
!               invoke a subshell
environ         change environment variables ('environ ?' for more)
?               print help information

telnet>

Weiterführende Literatur

git remote URL von SSH auf HTTPS ändern

Ich habe auf meinem GIT Server mehrere Authenifizierungsmöglichkeiten zur Verfügung stehen. Man kann sich auf diesem via HTTP, respektive HTTPS authentifzieren und alternativ ist dies auch über SSH möglich.

Nachdem das Repository einmal mittels HTTPS ausgecheckt wurde und man sich für jede serverbasierte Aktion andauernd mit dem Zugangspasswort authentifizieren muss, möchte ich die wiederholte Passworteingabe unterbinden. Dies kann man indem man die Repositoryquelle auf SSH umstellt.

Die bisherige HTTPS-URL hierfür lautet:

https://vader@nullgit.deathstar.universe/scm/my_project/my_repository.git

Die neue SSH-URL ist erreichbar unter:

ssh://git@nullgit.deathstar.universe:7999/my_project/my_repository.git

Man kann die Bezugsquelle des Repository ändern durch folgenden Befehl:

git remote set-url origin ssh://git@nullgit.deathstar.universe:7999/my_project/my_repository.git

Um die Einstellung zur geänderten URL zu verifizieren kann man diese mittels folgender Abfrage verifizieren:

git remote -v

Hieraus sollte folgende Ausgabe resultieren:

origin ssh://git@nullgit.deathstar.universe:7999/my_project/my_repository.git (fetch)
origin ssh://git@nullgit.deathstar.universe:7999/my_project/my_repository.git (push)

Das ganze läuft bei mir auf meinem Bitbucket-Server und lässt sich einwandfrei einrichten. Es lässt sich auf dem selben Weg auch die Quelle umkehren um auf von SSH auf HTTPS umzustellen.

git remote set-url origin https://vader@nullgit.deathstar.universe/scm/my_project/my_repository.git

Mit dieser Funktionalität kann man natürlich auch sein Repository auch auf einen anderen Quellserver umstellen. Wer sich jetzt nicht vorstellen kann wie das funktioniert der schreibt mir einfach in die Kommentare.

Weiterführende Literatur

Suche nach Inhalten in bestimmten Dateien

Durchsuche rekursiv nach Dateien in einem Verzeichnis nach Inhalten ohne Beachtung der Groß- und Kleinschreibung:

find /var/log/httpd/ -type f | xargs -d '\n' grep -iE "cron\.php"

Zunächst suchen wir mittels find all die Dateien die für eine genauere Analyse überhaupt relevant sind. Im zweiten Schritt wird mittels grep in genau diesen Dateien nach dem gewünschten Inhalten gesucht ungeachtet von Groß- und Kleinschreibung.

Darüber hinaus setze ich in xargs noch den Delimiter auf Zeilenumbruch, damit Dateinamen mit Leerzeichen oder anderweitigen Zeichen welche maskiert werden wollen auch in der suche mit grep berücksichtigt werden.

Linux: Suche in eingeschränkten Suchergebnis

Ich bin auf der Suche nach bestimmten Inhalten einer Datei. Jedoch sind diese Dateien in einem Verzeichnis mit Unterverzeichnissen enthalten in welcher noch viele weitere Dateien enthalten sind. Diese möchte ich jedoch aus Zeit- und Performancegründen nicht durchsuchen.

Um im ersten Schritt die betroffenen Dateien zu ermitteln nehme ich mir den Linux Befehl find zuhilfe:

vader@deathstar:~# find /var/log/apache2/ -iname "*access*.log"

Um nun in den Inhalten der Dateien zu suchen hilft mir der Befehl grep: 

vader@deathstar:~# grep "bing" /var/log/apache2/access.log

Um diese beiden Befehle nun zu verknüpfen und aus allen in find resultierenden Dateien zu finden steht das Programm xargs zur Verfügung:

vader@deathstar:~# find /var/log/apache2/ -iname "*access*.log" | xargs grep "bing"