Linux

adduser BENUTZER [OPTIONEN]

Es wird mit jedem Benutzer automatisch eine Gruppe mit dem gleichlautenden Namen angelegt. Gibt man wie im obigen Beispiel keine Optionen an, so nutzt adduser die Voreinstellungen, welche in der Datei /etc/adduser.conf hinterlegt sind

addgroup [OPTIONEN] GRUPPE

Beispiel: adduser otto

Fügt den Benutzer xyz zur bestehenden Gruppe www-data hinzu:

adduser xyz www-data

Übertragung des Eigentümers:Gruppe auf das Verzeichnis xyz:

chown -R www-data:www:data /var/www/html/xyz

Benutzer else in die Gruppe sudo aufnehmen (alle anderen Gruppenzugehörigkeiten von else bleiben erhalten): usermod -aG sudo else

OptionBeschreibung
--gecos ""überspringt die Abfragen für optional vollen Namen, Telefonnummer usw. (Optionsparameter leer, nur Anführungszeichen)
--conf DATEIverwendet anstatt /etc/adduser.conf die Datei DATEI als Konfigurationsdatei
--home /Pfad/zum/VerzeichnisDas Homeverzeichnis wird in „Pfad/zum/Verzeichnis“ angelegt anstatt im Verzeichnis, welches in der Konfigurationsdatei hinterlegt ist. Existiert das Verzeichnis nicht, so wird es angelegt, die Dateien aus /etc/skel werden auch dorthin kopiert.
--no-create-homees wird kein Homeverzeichnis für den Nutzer angelegt
--ingroup GRUPPEDer Nutzer wird zur Gruppe GRUPPE anstatt zur in der Konfigurationsdatei voreingestellten Gruppe hinzugefügt.
--disabled-loginBei der Einrichtung des Nutzers wird nicht nach einem Passwort gefragt, und der Account als inaktiv gekennzeichnet. Der Nutzer kann sich nicht am System anmelden.
--disabled-passwordBei der Einrichtung des Nutzers wird nicht nach dem Passwort gefragt. Der Nutzer kann sich nicht am System anmelden, bis ein Passwort mit Hilfe des Befehls passwd gesetzt wird. Dies ist dann z.B. sinnvoll, wenn man als Systemadministrator das Passwort des Nutzers nicht kennen möchte.
--shell SHELLEs wird nicht die in der Konfigurationsdatei hinterlegte Shell als Login-Shell angelegt, sondern die in der Option angegebene. Dabei muss immer der volle Pfad mit angegeben werden also z.B. --shell /bin/zsh. Gibt man --shell /bin/false an, so wird keine Login-Shell anlegt, was auch bedingt, dass sich dieser Nutzer nicht per SSH mit dem Rechner verbinden kann.
--uid IDGibt dem neuen Benutzer die gewünschte ID, falls diese nicht schon verwendet wird.

Arch-Linux-Bios einrichten

Bei diesem Beispiel wird der Datenträger mit fdisk in eine Root-, eine Swap- und eine Home-Partition eingeteilt. Die Root-Partition erhält das Boot-Flag und die Partitionierung wird in einer Dos-Partitionstabelle angelegt.

Der Datenträger /dev/sda soll für die Einrichtung mit Arch-Linux komplett neu partitioniert werden.
Da der PC ein BIOS besitzt wird eine DOS-Partitionstabelle (MBR) benötigt.
Die erste Partition soll für root (/) mit 40G und aktivierten Bootflags,
die zweite Partition für swap mit 4G und der Rest der Platte für /home partitioniert werden.
# fdisk /dev/sda
Willkommen bei fdisk (util-linux 2.35.2). Änderungen werden vorerst nur im Speicher vorgenommen, bis Sie sich entscheiden, sie zu schreiben. Seien Sie vorsichtig, bevor Sie den Schreibbefehl anwenden.

Befehl (m für Hilfe): o
Eine neue DOS-Festplattenbezeichnung 0x75b8e874 wurde erstellt.

Befehl (m für Hilfe): n (n= neue Partition erstellen)

Partition type p primary e extended Wählen (Vorgabe p): [Return]

Partitionsnummer (1-4, Vorgabe 1): [Return]

Erster Sektor (2048-1953458175, Vorgabe 2048): [Return]
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (2048-1953458175, Vorgabe 1953458175): +40G
Eine neue Partition 1 des Typs »Linux« und der Größe 40 GiB wurde erstellt.

Befehl (m für Hilfe): a
Partition 1 ausgewählt Die Bootfähig-Markierung auf Partition 1 ist nun aktiviert.

Befehl (m für Hilfe): n Partitionstyp p Primär (1 primär, 0 erweitert, 3 frei) e Erweitert (Container für logische Partitionen) Wählen (Vorgabe p): [Return]

Partitionsnummer (2-4, Vorgabe 2): [Return]
Erster Sektor (83888128-1953458175, Vorgabe 83888128): [Return]
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (83888128-1953458175, Vorgabe 1953458175): +4G
Eine neue Partition 2 des Typs »Linux« und der Größe 4 GiB wurde erstellt.

Befehl (m für Hilfe): t Partitionsnummer (1,2, Vorgabe 2): [Return]
Hexadezimalcode (geben Sie L ein, um alle Codes aufzulisten): 82 Partitionstyp von »Linux« nach »Linux swap / Solaris« geändert.

Befehl (m für Hilfe): n Partitionstyp p Primär (2 primär, 0 erweitert, 2 frei) e Erweitert (Container für logische Partitionen) Wählen (Vorgabe p): [Return]

Standardantwort p wird verwendet. Partitionsnummer (3,4, Vorgabe 3): [Return]
Erster Sektor (92276736-1953458175, Vorgabe 92276736): [Return]
Letzter Sektor, +/-Sektoren oder +/-Größe{K,M,G,T,P} (92276736-1953458175, Vorgabe 1953458175): [Return]
Eine neue Partition 3 des Typs »Linux« und der Größe 887,5 GiB wurde erstellt.

Befehl (m für Hilfe): p Festplatte /dev/sda: 931,49 GiB, 1000170586112 Bytes, 1953458176 Sektoren Festplattenmodell: Elements 25A2 Einheiten: Sektoren von 1 * 512 = 512 Bytes Sektorgröße (logisch/physikalisch): 512 Bytes / 512 Bytes E/A-Größe (minimal/optimal): 512 Bytes / 512 Bytes Festplattenbezeichnungstyp: dos Festplattenbezeichner: 0x09bf51e9

Gerät Boot Anfang Ende Sektoren Größe Kn Typ
/dev/sda1 * 2048 83888127 83886080 40G 83 Linux
/dev/sda2 83888128 92276735 8388608 4G 82 Linux Swap
/ Solaris /dev/sda3 92276736 1953458175 1861181440 887,5G 83 Linux

Befehl (m für Hilfe): w

Partitionstabelle sichern

Mit dem Befehl # sfdisk -d /dev/sda > sda.dump

kann die Partitionstabelle gesichert und mit dem Befehl # sfdisk /dev/sda < sda.dump rückgesichert werden.

NANO

einige Tastenkürzel
Tasten
(beide Spalten sind gleichwertig)
Aktion
Strg + GF1Vollständige Liste der Tastenkürzel (M („Meta“) mit Alt oder Alt + ⇧ aufrufbar.) Hilfe anzeigen
Strg + XF2Datei schließen
Strg + OF3Datei speichern
Strg + WF6Suche
Alt + WF16Weitersuchen
Alt + RStrg + Alt Gr + ßSuchen/Ersetzen

Alt + ⇧ + StrgAlt + 6Zeile (oder Markierung) in Zwischenablage kopieren
Strg + KF9Zeile (oder Markierung) ausschneiden und in Zwischenablage kopieren
Strg + UF10Inhalt der Zwischenablage einfügen
Alt + AStrg + 6Markierung beginnen/ Markierung aufheben
Strg + APos1Zum Zeilenanfang gehen
Strg + EEndeZum Zeilenende gehen
Alt + Alt Gr + <Alt + Alt Gr + ßZum Dateianfang gehen
Alt + ⇧ + 7Alt + ⇧ + ßZum Dateiende gehen
Alt + GStrg + ⇧ + –Zu einer bestimmten Zeile springen

Alt + D
Dateistatistiken anzeigen
Strg + C
Aktuelle Cursorposition anzeigen
Alt + C
Aktuelle Cursorposition ständig anzeigen ein/aus
Alt + X
Hilfezeilen anzeigen ein/aus
Alt + O
Leerzeile unterhalb der Titelzeile ein/aus
Alt + Y
Syntaxhervorhebung ein/aus

Copy & Paste mit NANO

Einen Text markieren:
Hierfür navigiert ihr zuerst mit dem Cursor an die Stelle an welcher die Markierung beginnen soll. Dann drückt ihr

[ALT]+[a]

damit der Markiermodus gestartet wird.
Dann mit den Cursor-Pfeiltasten, den gewünschten Text auswählen.

Möchtet ihr mit der Maus arbeiten, so müsst ihr noch zusätzlich folgende Tastenkombination betätigen:

[Alt]+[m]

Jetzt könnt ihr mit einem Doppelklick den Startpunkt der Markierung auswählen, zieht dann einfach mit der Maus über den gewünschten Text und markiert mit einem einfachen Klick den Endpunkt.

Einen Text kopieren: 
Die Kopierfunktion startet man mit folgender Tasten-Kombination:

[Alt]+[6]

Einen Text einfügen:
Achtung – jetzt kein Alt sondern STRG!

[STRG]+[u]

Label im Terminal bearbeiten
Hinweis:

Möchte man das Dateisystem-Label ändern, muss die betreffende Partition ausgehängt werden (z.B. über „Laufwerksverwaltung → Entsprechendes Speichergerät → Datenträger aushängen“).

Die Laufwerksbezeichnung (z.B. /dev/sda1) muss der tatsächlichen Bezeichnung angepasst werden.

DateisystemBenötigtes PaketLabel setzen [2]Label anzeigen
alleutil-linux
lsblk -n -o label /dev/sda1
ext2/ext3/ext4e2fsprogssudo e2label /dev/sda1 NEUES_LABEL
sudo tune2fs -L NEUES_LABEL /dev/sda1
sudo e2label /dev/sda1
sudo tune2fs -l /dev/sda1
ReiserFSreiserfsprogssudo reiserfstune -l NEUES_LABEL /dev/sda1sudo debugreiserfs
JFSjfsutilssudo jfs_tune -L NEUES_LABEL /dev/sda1sudo jfs_tune -l
XFSxfsprogsxfs_admin -L NEUES_LABEL /dev/sda1xfs_admin -l
FATdosfstoolssudo fatlabel /dev/sdb1 NEUES_LABELsudo fatlabel /dev/sdb1
FATmtoolssudo mlabel -i /dev/sdb1 ::NEUES_LABELsudo mlabel -i /dev/sdb1 -s ::
FATmtools und Skript (siehe unten)sudo ./set_msdos_label.sh /dev/sdb1 NEUES_LABEL
NTFSntfs-3g (ab Ubuntu 11.10)sudo ntfslabel /dev/sdb1 NEUES_LABELsudo ntfslabel /dev/sdb1
Swaputil-linuxsudo swaplabel -L NEUES_LABEL /dev/sda1sudo swaplabel /dev/sda1

Inhaltsverzeichnis

  • 1 was ist sed uns was kann sed
    • 1.1 Für was benötigen wir sed heute ?
  • 2 das Funktionsprinzip
    • 2.1 was beinhaltet sed und was kann man damit machen
    • 2.2 wie kann man damit Probleme lösen
  • 3 der Aufruf und die Optionen von sed
    • 3.1 die Optionen
    • 3.2 der Aufruf
      • 3.2.1 sed-Programm als Script
      • 3.2.2 Übergabe von Shell-Variablen an Sed-Programme
      • 3.2.3 Nutzung von sed in Here-Dokuments’s
  • 4 die Befehle
    • 4.1 Adressierung der Befehle
      • 4.1.1 Beispiele für Adressierung
      • 4.1.2 ein paar Regeln zu Regulären Ausdrücken in sed
    • 4.2 der s-Befehl
      • 4.2.1 die Bedeutung der Flags
      • 4.2.2 kleine Befehlsbeispiele zum Suchen und Ersetzten
    • 4.3 Befehlsübersicht
  • 5 kleine sed Programme am praktischen Beispiel erklärt
    • 5.1 Beispiel 1
    • 5.2 Beispiel 2
    • 5.3 Beispiel 3
    • 5.4 Beispiel 4
    • 5.5 Beispiel 5
    • 5.6 Beispiel 6
    • 5.7 Beispiel 7 (für Fortgeschrittene)
      • 5.7.1 Analyse der Struktur
      • 5.7.2 Schauen wir uns zuerst die s-Befehle an
      • 5.7.3 Analyse der Adressen
      • 5.7.4 Da ist noch ein kleiner Trick im Script versteckt
      • 5.7.5 Das Ergebnis des gesamten sed-Programms
  • 6 weiterführende Links

1. Was ist sed und was kann sed ?

sed (Stream-EDitor) ist ein universelles Textbearbeitungstool und auf jedem UNIX- und Linux-System zu finden. Ein Texteditor im gewöhnlichen Sinn, ist ein Programm mit dem wir mittels Tastatur einen Text erstellen oder ändern können, und genau das ist sed nicht.


Der Stream-Editor liest die Standardeingabe, (oder wenn angegeben eine oder mehrere Dateien) ein, ändert diesen Text nach einem „programmiertem Rezept“ welches wir ihm beim Aufruf mitgeben ab, und gibt den so geänderten Text auf der Standardausgabe (oder umgeleitet auch als Datei) wieder aus. Es handelt sich also um einen universell programmierbaren Text-Bearbeitungs-Filter, mit dem wir nicht interaktiv arbeiten, sondern dem wir beim Programmaufruf Regeln mitgeben, nach denen ein Text zu ändern ist.


sed wurde 1973/74 von Lee E. McMahon entwickelt. Es ist eine interpretierende Scriptsprache mit sehr begrenzten Funktionsmöglichkeiten und speziell für die Bearbeitung von Text ausgelegt. Sie baut direkt auf Regulären Ausdrücken auf und umfasst nur wenige Befehle. Alle Befehle und Schlüsselworte bestehen nur aus einem einzigem Zeichen, entweder Buchstabe oder Sonderzeichen. Nahe Verwandte von sed sind der Zeileneditor ed (der zwar noch auf den meisten Systemen installiert ist, aber doch stark in die Jahre gekommen ist und kaum noch Verwendung findet) und der klassische UNIX Standard-Editor vi.


sed erlaubt eine sehr kompakte Programmierung. Für einen Ungübten sehen kleine Programme auf den ersten Blick oftmals wie eine zufällige Folge von Buchstaben und Sonderzeichen aus, Der Anteil der Sonderzeichen kann in einer einzelnen Zeile bisweilen erschreckend hoch werden. Folgendes kleines Beispiel zeigt eine etwas längere typischen Befehlszeile. sed ’s/ //g;s/\(^.*\),\(.*$\)/\2,\1/;s/\(^.*\),\(.*,\)\(.*$\)/\1 \3 \2/;s/,/ /g‘

Diese Zeile hat durchaus einen Sinn und eine Funktion, sie wurde auch nicht boshafter Weise extra kompliziert geschrieben, sondern das ist normale SED-Sprache. Eine solche Befehlszeile wird man sich natürlich nicht merken können und kaum buchstabieren können, ja man kann sie kaum fehlerfrei abschreiben, eventuelle Fehler durch fehlerhafte Schreibweise oder auch logische Fehler sind deshalb auch sehr schwer zu erkennen und zu beseitigen. Das war auch einer der Gründe für die Entstehung von awk


Die auf dem ersten Blick sehr ungewöhnliche Schreibweise wird bei etwas Beschäftigung mit sed schon durchsichtiger, und wer sich öfter und intensiver mit sed beschäftigt, wird durchaus schnell bemerken, wie hilfreich diese kryptische Sprache ist. Für manch einen ist es sogar eine Art Kult geworden und sie haben zur Übung, Demonstration oder aus Spaß mit sed die brauchbarsten und die unmöglichsten Dinge, sogar kleine Spiele mit sed programmiert. In diesem SED Script Archiv sind einige solcher Programme zu finden. Weitere sed-scripte und weitere Spiele gibt es auf einer der wichtigsten SED-Seiten (Web-Seiten geschrieben übrigens mit ? : natürlich mit sed ;-)))


Heute gibt es eine Vielzahl von sed Implementierungen für die unterschiedlichsten Betriebssysteme die zT die eine oder andere Erweiterung unterstützen oder nicht. Unterschiede gibt es vor allem im Umfeld der Regulären Ausdrücke, da es dort einige Spezifikationen gibt, die sich in Details unterscheiden. Unter Linux haben wir ein sehr leistungsfähiges GNUsed das einige Erweiterungen beinhaltet, die nicht unbedingt portabel zu anderen Sed-Versionen sind.

Für was benötigen wir sed heute ?

Mit sed lassen sich kleinere Probleme schnell und effektiv lösen. Solche sed-Programme sind meist Einzeiler und werden nicht nur innerhalb von Scripten und der Shell benutzt, sondern durchaus auch einmal aus anderen Programmen oder Programmiersprachen heraus. Auch dort wird hin und wieder einmal auf eine Shellfunktion mit sed-Befehlszeile zurückgegriffen.

Für Randprobleme besonders bei Ein- und Ausgabe oder bei Konvertierung von Textdateien ist sed oftmals ein sehr hilfreiches Tool. Darüber hinaus kann man sed überall dort einsetzen, wo häufig und regelmäßig immer die selben oder ähnliche Dinge erledigt werden sollen, oder wo viele Textdateien nach einem ganz bestimmten Muster verändert werden sollen. Beispiele hierfür sind z.B:

  • Umwandlung von Textausgaben in bestimmte andere Formate oder zurück (z.B: Text nach HTML oder HTML nach Text);
  • Extrahieren bestimmter Abschnitte aus Texten, oder bestimmte Textformatierungen
  • das Ändern oder Korrigieren von Kleinigkeiten über viele HTML-Dateien oder an vielen Quellcode-Dateien

Überall dort wo der Aufwand für manuelle Änderung am Text ansteigt, wird sed interessant. Mit dem Stream Editor lassen sich eine Vielzahl von Standardkommandos von UNIX simulieren. Auch diese Standardkommandos haben alle ihre Ausnahmen und Problemfälle, und auch dort kann man hin und wieder einmal sed als die Lösung für solche Problemfälle finden.


Wer gezielt im WWW sucht, wird eine ganze Reihe von kleinen hilfreichen Anwendungen und Tricks rund um sed finden, Für viele Dinge, wie gezieltes Suchen, Extrahieren oder Änderungen in umfangreichen Texten, in vielen Dateien oder zur automatischen Bearbeitung von z.B. Konfigurationsdateien, wird man wohl auch morgen noch gerne auf sed zurückgreifen. Wenn moderne Programmiersprachen zu groß und mächtig oder unangemessen für winzige Probleme sind, oder wenn auf einige größere Standard-Tools auf Klein- und Minimalsystemen mal verzeichtet werden muss, dann ist eventuell sed als die kleine elegante Lösung die beste Option.

Für viele kleine Dinge ist sed durchaus gut geeignet, besonders wenn es sich kurz und knapp auf einer Zeile programmieren läßt, für viele Dinge insbesondere bei listenähnlichen Texten ist awk (wenn auch etwas langsamer bei der Arbeit) aber dennoch meist besser geeignet. Man sollte sed auch nicht dort einsetzen, wo die normalen Standard-Tools oder Programme das gewünschte Ergebnis mit vertretbaren Aufwand selbst liefern können, diese sind schneller und oftmals auch genauer. Bei größeren und komplizierten Probleme wird man freiwillig und gerne auf eine höhere Programmiersprache wie z.B. Perl oder Phyton ausweichen.

das Funktionsprinzip

Das Prinzip von sed ist recht simpel, aber man muss es sich genau verinnerlichen, sonst bekommt man schnell Verständnisprobleme beim Schreiben oder Interpretieren von sed-Programmen.

Beim Aufruf von sed werden die Regeln zum Ändern des Textes beim Programmaufruf mit übergeben. Wird keine Datei angegeben, dann nimmt sed den Standardeingabekanal als Eingangsdatei, wird eine Datei angegeben, dann diese. Werden mehrere Dateien angegeben, dann werden die Dateien der Reihe nach bearbeitet, und zwar werden die Dateien aneinander gereiht, der Zeilenzähler wird also bei einer neuen Datei nicht wieder zurückgesetzt. Die Ausgabe erfolgt auf der Standardausgabe und kann von hier mit den normalen Umleitungen auch an andere Befehle übergeben werden, oder in eine Datei umgeleitet werden. Die Eingangsdateien werden also nicht geändert.


sed hat einen Textbuffer den sogenannten Musterspeicher, dieser ist beim Starten des Programms leer. In diesen Musterspeicher wird die erste Zeile der Eingangsdatei geladen. Jetzt werden die Regeln auf diesen Musterspeicher angewendet und diese Zeile damit entsprechend geändert oder auch nicht. Sind alle Regeln abgearbeitet, dann wird der Inhalt des jetzt geänderten Musterspeichers nach stdout ausgegeben. Der Musterspeicher wird gelöscht und die nächste Zeile geladen, usw bis alle Zeilen der Eingabe verarbeitet sind. Beim Laden der neuen Zeile wird jeweils der interne Zeilenzähler um eins erhöht. Diesen Zeilenzähler können wir auch im sed-Program abfragen und auswerten.


Das Grundverhalten, dass sed jede bearbeitete Zeile selbstständig ausgibt bevor die nächste Zeile geladen wird, können wir mit einer Option beim Start von sed verhindern. Dann müssen wir jedoch innerhalb der Regeln festlegen, was sed denn ausgeben soll, wir müssen also „Print-Befehle“ benutzen. Die Option bei Aufruf von sed dazu ist „-n„.


Angenommen wir wollen aus einem Text die 2. Zeile löschen, dann müssen wir ohne Benutzung der Option -n die Regel nur so angeben, dass die 2. Zeile gelöscht oder übersprungen wird. Verwenden wir jedoch die Option -n so müssen wir ersteinmal dafür sorgen, dass wir alle Zeilen ausgeben und nur die 2. Zeile entweder bei der Ausgabe überspringen oder erst löschen bevor wir den dann leeren Buffer ausgeben.
Das sind oftmals fast gegensätzliche Ansatzweisen für den gesamten Programmablauf, und innerhalb des Programms benötigen wir dabei oftmals gegensätzliche Befehle oder Optionen. Welche Option für welche Aufgabe jeweils besser geeignet ist, müssen wir beim Erstellen eines sed-Programms von Aufgabe zu Aufgabe selbst entscheiden. In der Anfangszeit, bei den ersten Programmierversuchen, wird es öfter passieren, dass entweder Zeilen doppelt vorkommen, oder gar keine oder nur unvollständige Ausgaben kommen, nicht selten Option -n ;-))

was beinhaltet sed und was kann man damit machen

Neben dem Musterspeicher gibt es noch einen 2. Textbuffer, den sogenannten Haltespeicher. Auch dieser ist beim Start des Programms leer. In ihm könnte man jetzt z.B. den Inhalt des Musterspeichers kopieren und den Inhalt dort solange aufbewahren, bis er zu einem späteren Zeitpunkt benötigt wird, und dann wieder in den Musterspeicher laden. Hierfür gibt es einige sed Kommandos mit denen die Daten zwischen diesen beiden Textbuffern ausgetauscht werden also:

  • Musterspeicher durch Haltespeicher ersetzen
  • Haltespeicher durch Musterspeicher ersetzen
  • Inhalt von Halte- und Musterspeicher tauschen
  • Inhalt von Musterspeicher an den Haltespeicher anhängen
  • Inhalt von Haltespeicher an den Musterspeicher anhängen

Im Haltespeicher selbst kann aber nichts abgefragt oder gar verändert werden. Er dient nur zum Zwischenspeichern.


Und was geht jetzt mit dem Musterspeicher?
Einige Funktionen mehr, denn hier kann auch der Inhalt geändert werden, und von hier aus werden auch die Ausgaben gemacht z.B.:

  • Musterspeicher löschen
  • die nächste Zeile einlesen
  • die nächste Zeile hinten hinzufügen
  • Musterspeicher nach stdout ausgeben
  • Inhalte mit dem Haltespeicher austauschen
  • den Musterspeicher leeren dafür aber einen im Programm enthaltenen Text ausgeben
  • oder diesen Text vor dem Inhalt oder erst nach dem Inhalt des aktuellen Musterspeichers ausgeben
  • den Musterspeicher in eine Datei schreiben
  • Programmsprung je nach dem ob bestimmte Befehle den Musterspeicher geändert haben oder nicht
  • einzelne Zeichen durch andere Zeichen ersetzen (ähnlich dem Befehl tr)
  • und das Wichtigste, innerhalb des Musterspeichers suchen und ersetzen

Variablen ? außer dem Haltespeicher und der Variable in der sed automatisch die Eingabezeilen zählt, die wir aber nicht selbst ändern können, gibt es nichts Schleifen ? gibt es auch keine, aber es gibt 2 Sprungbefehle, ähnlich wie GOTO-Befehle und natürlich einen vorzeitigen Programmabbruch

Wenn man jetzt noch die Kommentar-Möglichkeit und Befehlsgruppierung hinzuzählt hat man sed schon sogut wie komplett erklärt.

wie kann man damit Probleme lösen

Nun kann man sich ja fragen, wie man mit so einer spartanischen Ausstattung und einem minimalem Befehlssatz überhaupt größere und komplexe Probleme lösen könnte?

Der Befehl, der den Hauptteil der Arbeit innerhalb von sed leistet, ist oben nur als „suchen und ersetzen“ angegeben. Dieser s-Befehl ist in der Kombination mit Regulären Ausdrücken sehr mächtig, (weiter unten, spezielles Kapitel). Er bietet wesentlich mehr Möglichkeiten als nur einzelne Worte auszutauschen, so wie man das von gleichnamigen Funktionen aus Text-Bearbeitungs-Programmen kennt. Suchen und ersetzen umfasst hier z.B. auch „eine bestimmte Stelle suchen und dort NICHTS gegen einen Text ersetzen“. Unterstützt wird das Ganze durch Reguläre Ausdrücke. So lassen sich mit dem s-Befehl alle typischen Arbeiten an einem Text simulieren, z.B.: Einfügen; Überschreiben; Löschen; Verschieben; Erweitern; usw.
Aber wie gesagt: alles immer jeweils nur in dem Text, der momentan im Musterspeicher steht.


Ein kleines Problem ergibt wohl auch in sed-Programmierung nur 1 , 2 oder einige wenige Befehle, und ist mit etwas Übung schnell zu entwerfen. Beim Entwickeln von Lösungen zu komplexen Problemen mit sed muss das Problem sehr genau analysiert werden, in kleinste Einzelschritte zerlegt, entsprechend der begrenzten Möglichkeiten von sed ein logischer Lösungsweg gefunden werden und dieser dann in Einzelschritten zu einem fertigen sed-Programm aneinandergereiht werden. Die vielen Annehmlichkeiten moderner Programmiersprachen gibt es bei sed nicht, hier muss man gelegentlich auch mal einen Lösungsweg von ganz unten und nur mit purer Logik selbst neu erfinden. Und genau in dieser Herausforderung liegt wohl auch oftmals der Reiz dennoch einmal selbst ein größeres Problem mit sed anzugehen.
Das Ganze erinnert etwas an Assembler-Programmierung, und das nicht ganz unbegründet. Die Mehrzahl der Befehle von sed, sind in ihrer Funktion sehr elementar und nicht unähnlich den Operationen die in einer CPU auf Registerebene ausgeführt werden. Der Unterschied ist: die CPU arbeitet mit Registern einer definierten Bit Breite und sed arbeitet mit einem Textbuffer in dem sich eine beliebige Anzahl von Textzeichen befinden. Bei den Akkumulator Befehlen (also den Befehlen mit denen wir z.B.. Vergleichen und Ändern können) haben wir bei der CPU allerdings nur die vergleichsweise einfache Bit-Logik, in sed gibt es dort universelle und komplexe Reguläre Ausdrücke die auf Buchstaben, Sonderzeichen, Wörter und ganze Texte angewendet werden.


Und warum der Stream-Editor so funktioniert und nicht anders, wird deutlich wenn man sich noch einmal vor Augen führt, wann dieser Stream-Editor entwickelt wurde.
1973 da hatten die Rechner Hauptspeicher von typisch 16-64KB Größe, Speichermedien von wenigen MB waren riesige Massenspeicher, UNIX und die Grundzüge der Programmiersprache C waren gerade erst geboren, bzw wurden gerade von Assembler Programmierung auf C portiert und komplett überarbeitet (Geschichte von Unix).
Terminals gab es zwar, aber der verbreitetste Weg durch einen Rechner war immer noch, von der Lochkarte oder einem Magnetband über den Rechner auf den Drucker. Alles was vorher kam war sehr viel Assembler-Programmierung, erste brauchbare universelle Betriebssysteme wie Multics und nackte Logik, das gesamte Umfeld war ein Tummelplatz von genialen Wissenschaftlern.
Wenn wir also heute immer noch mit dem Stream Editor arbeiten, dann muss in ihm wohl eine geniale Idee verbaut sein.

Der Aufruf und die Optionen von sed

Die Optionen

Eine Option -n steuert direkt die innere Abarbeitung und wurde oben schon besprochen. Weitere wichtige Optionen sind -e und -f sed -e REGEL

hinter der Option steht unmittelbar die Regeln für die Bearbeitung. Sind in der REGEL Leer- oder Sonderzeichen enthalten dann müssen wir sie vor der Interpretation der Shell durch Hochkomma schützen werden ( also sogut wie immer ;-))). Die Option -e REGEL kann auch mehrfach bei einem Aufruf angegeben werden, und auch in Kombination mit der folgenden Option benutzt werden. ( Die Option -e ist nicht zwingend erforderlich, sed interpretiert automatisch das erste Zeichen das nicht eindeutig einer Option zugeordnet werden kann, als der Begin einer Regel. Man sollte sich dennoch angewöhnen die Optionen sauber auszuschreiben) sed -f REGELDATEI

Die Regel oder mehrere Regeln stehen in einer separaten Datei, die beim Start mit der Option -f an sed übergeben wird. Auch diese Option kann in der Befehlszeile mehrfach vorkommen (auch in Kombination mit obriger Option), es werden dann der Reihe nach alle Regeln auf die zu bearbeitende Datei angewendet. weitere Optionen sind abhängig von der speziellen sed-Implementierung 

diese könnten spezielle Steuerungsoptionen für den Umgang der Eingabedateien beinhalten, oder auch die Interpretation der Regulären Ausdrücke beeinflussen. Diese Optionen sind nicht zwingend kompatibel zu anderen sed-Implementierungen, und werden auch nur in Einzelfällen benötigt.

der Aufruf

Nachfolgend ein paar Beispiele wie sed-Programme auf der Konsole oder aus einem Script heraus aufgerufen werden können BEFEHL | sed -e ‚REGEL‘ > AUSGABEDATEI sed -n -e ‚REGEL‘ EINGABEDATEI > AUSGABEDATEI BEFEHL | sed -f REGELDATEI | BEFEHL sed -e ‚REGEL1‘ -f REGELDATEI -e ‚REGEL2‘ <EINGABEDATEI >AUSGABEDATEI VARIABLE=`BEFEHL | sed -e ‚REGEL1‘ | sed -ne ‚REGEL2‘ | BEFEHL `

Oftmals lassen sich die Regeln für ein sed-Programm aus bestimmten Regelgründen nicht in eine Zeile schreiben. sed -ne ‚ BEFEHL1\ Optionen zum BEFEHL1\ weitere Optionen  ; BEFEHL2 ; BEFEHL3\ Optionen zum BEFEHL3  ; BEFEHL4 ; BEFEHL5 ‚

sed-Programm als Script

sed Programme lassen sich auch als eigenständige Script schreiben. Dazu wird der Programmtext in eine Datei geschrieben. An den Begin der Datei wird die Magic Line (shebang) #!/usr/bin/sed -f

(eventuell noch zusätzlich die Option -n) gesetzt.
Die Datei erhält Ausführungsrechte. Jetzt kann sie wie andere Scripte auch, direkt mit ihrem Namen ausgeführt werden.

Übergabe von Shell-Variablen an Sed-Programme

sed selbst kann nicht auf Variablen der Shell zurückgreifen und kennt auch keine eigenen Variablen, es kennt nur seinen Programmtext. Also muss bei Bedarf der Programmtext beim Aufruf von sed entprechend der Shellvariablen angepasst werden. In Shellscripten findet man sehr oft einen kleinen Trick.

Die Quotierung des Befehlstext, der den Befehlstext vor der Interpretation der Shell schützen soll, ist an einigen Stellen unterbrochen. An diesen Stellen stehen dann $Shellvariable. Beim Aufruf des sed-Kommandos sieht die Shell diese Variablen und ersetzt sie im Programmtext durch den Wert der Shellvariable. Somit hat man eine sehr elegante Steuerung der Funktion des sed-Scriptes durch Variable der Shell #!/bin/bash sed -n ‚ ‚/$1/‘ !{ #no match – put the current line in the hold buffer x # delete the old one, which is # now in the pattern buffer d }‘

Die genaue Funktion die sed ausführen soll, soll uns hier erst einmal nicht interessieren, gemeint ist hier die unterbrochen Quotierung
/$1/!{

die roten Hochkommas lassen die Shell /$1/ sehen und damit wird die Shell beim Aufruf von sed an dieser Stelle anstatt $1 den Wert des ersten Arguments des Scriptes einsetzen. Wir haben hier also über die Optionen beim Aufruf des Shellscript direkten Einfluss auf die Funktionsweise von sed

Nutzung von sed in Here-Dokuments’s

Eine weitere häufig benutzte Aufrufmöglichkeit von sed innerhalb von Shell-Scripten ist das Here Document Auch hier wird oftmals mit der oben gezeigten Methode auf Shellvariablen zurückgegriffen. Die Eingabefile die sed verarbeitet, ist dabei der Inhalt des Here-Dokumentes. folgendes Beispiel soll das verdeutlichen. #!/bin/bash KASSE=129.32 WAEHRUNG=“EURO“ MITARBEITER=“Hr. Maier“ sed -e ’s/XXXX/’$KASSE’/g;s/YYYY/’“$WAEHRUNG“‚/g;s/ZZZZ/’“$MITARBEITER“‚/g‘ <<EOF Der Bargeldbestand von XXXX YYYY wurde heute festgestellt verantwortlich ist wie immer ZZZZ EOF

hier wird auf 3 Shellvariablen zugegriffen die beim Aufruf durch deren Werte ersetzt werden. Die Ausgabe ist dann der Inhalt des Here-Dokumentes und die Platzhalter XXXX ; YYYY ; ZZZZ werden durch sed dann durch diese Werte ersetzt, die sed beim Kommandoaufruf von der Shell in den sed-Programmtext eingefügt bekommt. Der Bargeldbestand von 129.32 EURO wurde heute festgestellt verantwortlich ist wie immer Hr. Maier

die Befehle

Wie oben schon angedeutet gibt es nicht übermäßig viele Befehle. Die Befehle bestehen alle aus nur einem einzigem Zeichen, meist ein Buchstabe den man auch leicht als Kürzel für den Befehl interpretieren kann. (damit hat man wenigstens eine Gedankenstütze)

  • p = print
  • l = list
  • i = iinsert
  • a = apend
  • usw

zu einigen Befehlen gehören noch Optionen, und zu den meisten Befehlen können Adressen angegeben werden.

Adressierung der Befehle

Unter Adressen versteht man das Auswahlkriterium der Zeilen, auf denen der Befehl Anwendung finden soll. Die Adressenmöglichkeiten der einzelnen Befehle ist unterschiedlich, nicht alle Befehle können z.B. mit 2 Adressen versehen werden, manche kann man gar nicht mit Adressen versehen. Adressen können, müssen aber nicht angegeben sein. Die Adresse steht vor dem Befehl. Ein Negationszeichen ! zwischen der Adresse und dem Befehl negiert die Adresse, ( also „alle Anderen außer den adressierten Zeilen“ treffen zu )

  • Ist keine Adresse angegeben, dann wird dieser Befehl auf alle Zeilen der Eingabedatei ausgeführt
  • gibt es eine Adresse, dann wird dieser Befehl nur auf solche Zeilen ausgeführt, die zu dieser Adresse passen
  • viele haben 2 Adressen in der Schreibweise Adresse1,Adresse2 Hier handelt es sich um ein von Adresse1 bis zur Adresse2
  • (GNU)sed unter Linux erlaubt noch einiges mehr was aber nicht portable zu anderen sed-Implentationen ist (z.B. 3~4 würde bedeuten ab Zeile 3 jede 4.Zeile)


Die Adressierungsmöglichkeiten unterliegen folgenden Regeln

  • Eine Adresse kann eine Zahl sein, diese bedeutet die entsprechende Zeilennummer der Eingabedatei
  • Eine Adresse kann ein Regulären Ausdruck sein /regex/ entspricht alle Zeilen auf die dieser Reguläre Ausdruck passt, ( hierbei ist es möglich aber selten gebräuchlich auch \%regex\% zu schreiben, wobei % ein beliebiges Zeichen ist)
  • zwei Adressen Zahl1,Zahl2 enspricht von Zeilennummer Zahl1 bis Zeilennummer Zahl2 bezogen auf die Eingangsdatei
  • /regex1/,/regex2/ bedeutet vom der Zeile die regex1 erfüllt bis zur Zeile die regex2 erfüllt
  • Kominationen von Zahl,/regex/ und /regex/,Zahl sind möglich
  • anstatt einer Zahl das Zeichen $ bedeutet die letzte Zeile
  • Zeilenberechnungen mit Zeilennummern wie z.B. $-10 (als Adresse für die letzten 10 Zeilen gemeint) geht nicht
  • Die Adressierung kann für eine Gruppe von Befehlen erfolgen wenn die Befehle in { } eingeschlossen sind und durch ; voneinander getrennt werden. Die Adresse steht vor der öffnenden Klammer. Achtung: } muss dabei auf einer Zeile am Zeilenanfang stehen, dass heißt es dürfen davor nur Leer oder Tabulatorzeichen stehen
  • Das Zeichen ! zwischen der Adresse und dem Befehl negiert die Adresse, also alle Zeilen die nicht auf die Adresse zutreffen.
Beispiele für Adressierung

einfache Beispiel in Kombination mit den Befehlen print und delete und der Einfluss der Option -n sed -ne ‚1,10p‘ # Zeilen 1 bis 10 ausgeben sed -e ‚1,10p‘ # Zeilen 1 bis 10 doppelt restlichen Zeilen einfach ausgeben sed -e ‚2d‘ # 2. Zeile löschen sed -e ‚2,10!d‘ # Zeilen 2 bis 10 ausgeben sed -ne ‚2,10p‘ # Zeilen 2 bis 10 ausgeben sed -e ’10,$p‘ # Zeilen 1 bis 9 einfach und alle anderen Zeilen doppelt ausgeben sed -ne ‚$p‘ # letzte Zeile ausgeben sed -e ‚/Text/d‘ # Alle Zeilen die nicht „Text“ enthalten, ausgeben sed -e ‚/Text/!d‘ # Alle Zeilen die „Text“ enthalten, ausgeben sed -ne ‚/Text/,$!p‘ # Alle Zeilen bevor eine Zeile mit „Text“ kommt, ausgeben sed -ne ‚/Begin/,/END/p‘ # Alle Zeilen von „Begin“ bis „END“ ausgeben (wird „END“ nicht gefunden bis Schluss) # Kommt nach einem „END“ wieder ein „Begin“ dann von dort aus wieder ausgeben


hier jetzt mal ein paar Beispiele zur Verwendung von Charakter Klassen und ähnlichen Neuerungen die in GNU-sed unter anderem also auf Linux funktionieren, aber nicht 100% portabel sind sed -ne ‚/^[[:alnum:]]/!p‘ # Ausgabe alle Zeilen die nicht mit einem Buchstaben oder Zahl beginnen sed -ne ‚3~2p‘ # Ab der 3.Zeile jede 2.Zeile ausgeben (also ungerade Zeilen ab Zeile 3 ) sed -ne ‚5,/Text/p‘ # Ab der 5.Zeile bis zu einer Zeile mit „Text“ ausgeben sed -ne ‚3,+7p‘ # Die 3.Zeile und die 7 folgenden Zeilen ausgeben sed -ne ‚/Begin/,+2p‘ # Die Zeilen die „Begin“ enthalten und jeweils die nächsten 2 Zeilen ausgeben

Bisher wurden nur sehr einfache Reguläre Ausdrücke verwendet, aber da geht natürlich einiges mehr sed -ne ‚/^[EBH]/p‘ # alle Zeilen die mit „E“,“B“ oder „H“ beginnen ausgeben sed -e ‚/^$/d‘ # alle leeren Zeilen löschen sed -ne ‚/^[^#].*/p‘ # jede Zeile ausgeben, die mit einem anderem Zeichen als „#“ beginnt sed -ne ‚/^[[:space:]]*#/d‘ # Zeilen deren erstes Zeichen (außer Space und Tabulator) „#“ ist, löschen sed -ne ‚/^.\{64\}/p‘ # Alle Zeilen die mindestens 64 Zeichen lang sind, ausgeben sed -ne ‚/[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}\.[[:digit:]]\{1,3\}/p‘ # druckt jede Zeile in der eine IP-Adresse enthalten sein könnte

und man merkt sehr schnell, dass es mit Regulären Ausdrücken hier schon langsam unübersichlich wird. Reguläre Ausdrücke sind schon eine kleine Wissenschaft für sich, da aber bei sed noch zusätzliche Sonderzeichen und auch noch weitere Regeln dazukommen, also bestimmte Zeichen noch zusätzlich entweder entwertet oder aktiviert werden müssen, kann man hier das Chaos durchaus noch etwas perfektionieren.


Um z.B. alle fehlerfreien Zeilen zu suchen, die einen Zeitstring YYYY-MM-DD entsprechen wie ihn z.B. auch date +%F liefert, müsste man mit sed wie folgt adressieren. Hier mal gleich der Konsolausdruck. 😉 LINUX: # cat test1 2008-10-02 2008-03-19 2007-09-01 2006-07-28 2008-10-05 2007-13-01 2006-06-31 2008-30-02 2005-02-29 2006-11-31 2008-00-02 2004-02-29 LINUX: # sed -ne ‚/[1-9][0-9][0-9][0-9]-\(\(0[1-9]\|1[0-2]\)-\([01][1-9]\|10\|2[0-8]\)\|\(0[13-9]\|1[0-2]\)-\(29\|30\)\|\(0[13578]\|1[02]\)-31\)\|\([0-9][0-9]\(0[48]\|[2468][048]\|[13579][26]\)\|\(0[48]\|[2468][048]\|[13579][26]\)00\)-02-29/p‘ test1 2008-10-02 2008-03-19 2007-09-01 2006-07-28 2008-10-05 2004-02-29 LINUX: #

Und damit fängt es langsam an Spaß zu machen, aber wir wollen hier bei sed bleiben. Für komplizierte Reguläre Ausdrücke gibt es auch Tools und jede Menge gute Seiten im WWW.

ein paar Regeln zu Regulären Ausdrücken in sed

Nur mal so als Gedankenstütze zum nachlesen beim nächsten Problem mit sed und Regulären Ausdrücken mal hier einige Regeln
sed verwendet „Basic Regular Expressions“ einige Unterschiede zu den „Erweiterten Regulären Ausdrücken“ sind z.B.:

  • Die Quantifikatoren „|„, „+“ und „?“ sind normale Zeichen (GNU-sed wie es in Linux enthalten ist, kennt jedoch diese Operatoren, wenn sie durch einen vorangestellten Backslash „escaped“ werden)
  • die Klammern „{“ „}“ „(“ und „)“ sind normale Zeichen und müssen mit Backslashes „escaped“ (aktiviert) werden, also als „\{“ ; „\}“ ; „\(“ und „\)„geschrieben werden.
  • die Zeichen, die durch „\(“ und „\)“ eingeschlossen werden, können später mit „\1“ usw. (max „\9“ ) dereferenziert werden
  • ^“ ist ein normales Zeichen, wenn es nicht am Beginn eines Ausdrucks, oder eines Klammerausdrucks steht
  • $“ ist ein normales Zeichen, wenn es nicht am Ende eines Ausdrucks oder eines Klammerausdrucks steht
  • *“ ist am Beginn eines Ausdrucks oder eines Klammerausdrucks ein normales Zeichen
der s-Befehl

Der mit Abstand wichtigste Befehl in sed, der Befehl „s///“. Alle anderen Befehle sind nur das Beiwerk. Wer sich schon einmal etwas intensiver mit vi oder VIM beschäftigt hat, wird diesem Befehl vielleicht schon einmal benutzt haben. Die prinzipelle Funktion dieses Befehles ist schnell mit „suchen und ersetzen“ erklärt. Die Schreibweise:

[ADRESSE]s/SUCHMUSTER/ERSETZUNG/[FLAG]

  • ADRESSE ist der optionale Ausdruck wie er oben schon beschrieben ist, fehlt er, wird der Befehl auf alle Zeilen angewendet
  • FLAG steuert die Eigenschaften des Befehls und ist ebenfalls optional, Übersicht der möglichen Flags; ist kein Flag angegeben, gilt 1 ; welches dann bedeutet, es wird nur der erste gefundene Ausdruck der auf das Suchmuster passt, ersetzt.
  • s ist der Befehlsname selbst
  • SUCHMUSTER ist ein Regulärer Ausdruck nach dem gesucht wird
  • ERSETZUNG enthält den Text, der den Teil des Orginaltextes ersetzt, der durch das Suchmuster gefunden wird.
  • Als Abrenzung der einzelnen Optionen sind 3 „/“ Begrenzer zu setzen. (Bei Bedarf darf hier auch statt „/“ jedes andere Zeichen verwendet werden, es gilt das Zeichen als Trennzeichen, dass unmittelbar auf s folgt. Diese Option sollte jedoch mit Sorgfalt verwendet werden, da es ein späteres Interpretieren eines komplizierten Befehls durchaus auch erschweren kann)


In einer der häufigsten und einfachsten Anwendungsbereiche könnte ein kompletter Befehl jetzt so aussehen. sed -e ’s/Strauch/Baum/g‘ Erläuterung * es gibt keine Adresse, also wird der s-Befehl auf jede Zeile angewendet * Reguläre Suchausdruck lautet in diesem Beispiel einfach „Strauch“ * Der Ersetzungtext ist „Baum“ * als Flag wird „global“ verwendet, es werden also alle gefundenen Stellen pro Zeile ersetzt. * da sed ohne die Option -n gestartet wurde erfolgt eine automatische Ausgabe.

Damit würde in einer Datei jedes Vorkommens der Buchstabenkombination „Strauch“ durch „Baum“ ersetzt, also nicht nur das Wort Strauch selbst, sonder z.B. würde aus dem Wort „Strauchdieb“ das Wort „Baumdieb“


Der Befehl wird jetzt desshalb so mächtig, da Reguläre Ausdrücke nicht nur Buchstabenkombinationen kennen, sondern man damit jede nur erdenkliche Zeichenkombination universell in logischer Form eindeutig beschreiben kann, man Zeilenanfang und Zeilenende bestimmen kann, mit Zeichengruppen, Zeichenklassen, Alternativen, Wiederholungszeichen, und gruppierten Ausdrücken arbeiten kann.

die Bedeutung der Flags

Mit den Flags kann die Funktion des s-Befehls gesteuert werden. Ist kein Flag angegeben gilt 1 ; also nur Ersetzung des ersten Vorkommens des gefunden Strings

Bedeutung der Flags beim s-Befehl

FlagBedeutungBeispielBemerkung
NN=Zahl (1 < 512) ; das N’te Vorkommens/AB/CD/2wird N nicht angegeben dann erste Vorkommen
gglobal ; alle Vorkommens/AB/CD/ges werden alle Vorkommen ersetzt
pprint ; Ausgabe bei Ersetzungs/AB/CD/pwurde eine Ersetzung vorgenommen wird der Buffer an stdout ausgegeben
w DATEIwrite DATEI bei Ersetzungs/AB/CD/w FILEbei Ersetzung Ausgabe des Buffers in die angegebene Datei
icase-insensitive ; Groß-Kleinschreibung ignorierens/AB/CD/iist nicht kompatibel zu allen SED-Implementierungen
mbetrifft Interpretation von ^ und $ ; nicht kompatibel
xnicht kompatibel ; nur bei ssed im Perlmodus
snicht kompatibel ; nur bei ssed im Perlmodus

es ist auch mehr als nur ein einzelnes Flag möglich, soweit die Kombination einen Sinn ergibt. z.B. LINUX: # echo „abcabcabc“ | sed -ne ’s/AB/CD/2ip‘ abcCDcabc LINUX: #

kleine Befehlsbeispiele zum Suchen und Ersetzten

sed -e ’s/blau\|lila/rot/2′ # Das 2.Vorkommen je Zeile von „blau“ oder „lila“ wird durch „rot“ ersetzt sed -e ‚/^$/!s/^/#/ ‚ # bei alle nichtleeren Zeilen am Zeilenanfang „#“ einfügen sed -e ’s/#.*$//‘ # von einem Zeichen „#“ bis zum Zeilenende alles löschen sed ’s/^[ \t]*//;s/[ \t]*$//‘ # entferne alle Leerzeichen und Tabulatoren am Anfang und Ende der Zeilen sed -e ’s/Michael[^a]/Herr &/‘ # ersetze „Michael“ durch „Herr Michael“ jedoch nicht wenn hinter „Michael“ ein „a“ folgt. sed -e ’s/[Cc]olor/[b]&[\/b]/g‘ # jedes „Color“ und „color“ in „[b]Color[/b]“ oder „[b]color[/b]“ änderen date +%F | sed -e ’s/\([0-9]\{4\}\)-\([0-9]\{2\}\)-\([0-9]\{2\}\)/heute ist der \3.\2. \1/‘ #das Datumsformat YYYY-MM-DD umwandeln zu „heute ist der DD.MM. YYYY“

Besonderheiten der Beispiele

  1. Beispiel: es wird eine Oderverknüpfung benutzt | muss dabei entwertet werden also \|
  2. Beispiel: Verwendung der Sonderzeichen ^ für Zeilenanfang und $ für Zeilenende
  3. Beispiel: #.*$ bedeutet Zeichen # anschließend müssen 0 oder beliebig viele beliebige Zeichen (.*) stehen, bis Zeilenende ($) ; alles wird durch NICHTS ersetzt (//)
  4. Beispiel: [ \t] an dieser Stelle entweder ein Leerzeichen oder ein Tabulator, das „*“ darf sich 0 bis beliebig oft wiederholen. Hier wurden 2 Sedbefehle durch „;“ getrennt, beide werden hintereinander auf alle Zeilen ausgeführt.
  5. Beispiel: [^a] das „a“ ist durch „^“ negiert, das Bedeutet (nicht „a“) an dieser Stelle, das „&“ im Ersetzungsfeld bedeutet an dieser Stelle der gesamte mit dem Muster gefundene String einsetzen.
  6. Beispiel: Im Ersetzungsfeld steht wieder „&“ der „/“ im Ersetzungstext musste entwertet werden „\/“
  7. Beispiel: Hier haben wir zum einem „\{ \}“ mit der geschweiften Klammer läßt sich festlegen wie oft sich der vorhergehende Ausdruck oder Zeichen wiederholen soll, hier z.B. [0-9]\{4\} bedeutet genau 4 Mal eine Ziffer 0 bis 9, weiterhin haben wir „\( \)“ das ist eine Gruppierung (ähnlich einer Variable) mit „\1“ bis „\9“ kann sie im Ersetzungsfeld verwenden können. der Inhalt ist der jeweilige mit der entsprechende Klammer gefundene Text, in diesem Beispiel haben wir 3 solche Gruppen und wir geben sie in umgegehrter Reihenfolge wieder aus „\3 \2 \1“

Befehlsübersicht

Übersicht der Befehle und Schlüsselworte

KommandoAddrstdinstdoutMuster SpeicherHalte SpeicherErklärung
;Trennzeichen zwischen einzelner Befehle
!Negationszeichen vor Befehl (Steht zwischen Adresse und Befehl und kehrt die Adresse ins Gegenteil)
{ }2umschließt einen Block, der mehrere Kommandos beinhalten kann, diese müssen durch ; getrennt werden
#Kommentar, alle nachfolgenden Zeichen bis Newline werden nicht als Programmcode interpretiert
: MARKEdefiniert das Sprungziel MARKE Siehe Kommandos b oder t
=2Xgibt die aktuelle ZeilenNr der Eingabedatei auf separater Zeile aus
a1Xgibt die nachfolgenden Text nach der Ausgabe des Buffers aus
b MARKE2Sprungbefehl zur MARKE bzw. zum Ende des Scripts
c2XXMusterspeicher bzw Bereich löschen und stattdessen nachfolgenden Text ausgeben
d2XMusterspeicher löschen
D2XMusterspeicher bis zum Zeichen „newline“ löschen
g2XMusterspeicher wird durch den Inhalt des Haltespeicher ersetzt.
G2XHaltespeicher wird an den Inhalt des Musterspeicher angefügt
h2XHaltespeicher wird durch den Inhalt des Musterspeicher ersetzt
H2XMusterspeicher wird an den Inhalt des Haltespeicher angefügt
i1Xgibt die nachfolgenden Text vor der Ausgabe des Buffers aus
l1XMusterspeicher ausgegeben. („C-Notation“ unbekannte Zeichen in Oktalformat)
n2X ?Xje nach Option -n wird der Buffer ausgegeben oder nicht, neue Zeile laden
N2XXNächste Zeile an Inhalt des Musterspeichers angefügen
p2XMusterspeicher ausgegeben.
P2XMusterspeicher bis zum nächsten „newline“-Zeichen ausgeben.
q1sed Beenden, bei nicht gesetzter Option -n wird Musterspeicher ausgegeben
r FILE1XInhalt einer angegebenen FILE wird eingelesen und ausgegeben.
s/regex/rpl/flg2XErsetzt regex durch rpl. Null oder mehrere flg wirken steuernd ein
t MARKE2bedingter Sprungbefehl zur MARKE abhängig von vorheriger s oder y Kommandos
w FILE2XSchreibt Musterspeicher in FILE
x2XXInhalt von Muster- und Haltespeicher vertauschen
y/src/rpc/flg2XErsetzt jedes Zeichen im pattern buffer welches in src vorkommt durch das entsprechenden Zeichen in rpc
kleine sed Programme am praktischen Beispiel erklärt

Auf unseren Rechnern in vielen Standard-Scripten sind hunderte von kleinen und kleinsten sed-Befehlen eingebettet. Größere und komplizierter sed-Befehle, sind dabei sehr selten. Es sind fast alles nur sehr einfache Befehle, die sollten mit dem bisschen Wissen hier aus diesem Artikel und ein wenig Verständnis für Reguläre Ausdrücke sicherlich schnell zu durchschauen sein, auch wenn sie eventuell auf dem ersten Blick sehr kompliziert aussehen. Machen wir doch die Probe aufs Exempel:

Beispiel 1

gefunden in /etc/rc.d/rpmconfigcheck sed -e ’s/^/ /‘ < $configcheckfile

  • einfacher s-Befehl, Eingabedatei ist der Variable configcheckfile gespeichert
  • „^“ Zeilenanfang wird durch einige Leerzeichen ersetzt, also weiter nichts wie einrücken von Text.
Beispiel 2

gefunden in /etc/rc.d/smbfs mountpoint=$( echo „$mountpoint“|sed „s/\/*$//“)

  • es wird die Variable mountpoint (in der scheinbar Text steht) mit echo ausgegeben, durch sed gefiltert und die Ausgabe wieder in der Variable mountpoint gespeichert
  • „s/\/*$//“ Trennzeichen ist „/“ das haben wir aber 4 Mal 😉 , Beim näheren Hinsehen ist das 2 „/“ mit „\“ entwertet
  • damit lautet unsere Suchmaske ohne Quotierung „/*$“ und das ist schlichtweg als letztes Zeichen vor Zeilenende (eventuelle auch mehrfach vorhanden) „/“ (Quantoren)

gemeint

  • ersetzt wird mit NICHTS, also macht der Befehl nichts weiter als eventuelle „/“ am Ende des Variableinhaltes abzuschneiden
Beispiel 3

gefunden in /etc/rc.d/fbset mode=`echo $FBSET_PARAMS | sed -e ’s/^-[^ ]*//‘ -e ’s/ -[^ ]*//g’`

  • auch hier wird der Inhalt einer Variable durch sed gefiltert und das Ergebnis in einer anderen Variable gespeichert
  • sed hat hier 2 Regeln wie wir an 2 mal -e und der Quotierung schnell herauslesen.
  • die erste Regel ist ein s-Befehl, Suchmuster ist „^-[^ ]*“ bedeutet Am Zeilenanfang „^“ ein „-„ und dBefehlsübersichtann „[^ ]*“ also alles andere nur kein Leerzeichen und das sooft es will. Ersetzt wird durch NICHTS, also schneidet die erste Regel am Zeilenanfang alles was mit einem Strich anfängt bis zum ersten Leerzeichen weg.
  • die zweite Regel auch ein s-Befehl, macht fast das selbe, nur nicht vom Zeilenanfang an, sondern das Zeichen vor dem ersten Strich muss ein Leerzeichen sein, dann wird auch bis zum nächsten Leerzeichen nach dem Strich alles gelöscht.
  • der 2. Befehl arbeitet global, das heist es werden alle “ -irgendwas“ gelöscht.
  • In Summe macht der gesamte sed-Befehl also nichts anderes, als alle Optionen mit beginnendem „-“ aus dem Variabelinhalt zu beseitigen.
Beispiel 4

gefunden in /etc/rc.d/network RL=`sed -n ’s=^id:\(.\):initdefault.*$=\1=p‘ /etc/inittab`

  • der Inhalt von /etc/inittab wird durch sed gefiltert und in der Variable RL abgelegt.
  • es ist ein s-Befehl -n, also keine automatische Ausgabe,
  • Dieses Mal ist das Begrenzungszeichen „=“ da es unmittelbar nach dem „s“ kommt, der Befehl hat also hier die Struktur s=== und nicht wie bisher gewohnt s///
  • als Flag haben wir ein „p“, also sollte sed hier eine Ersetzung vornehmen, wird danach automatisch ausgegeben, ansonsten nichts ausgeben
  • Suchmuster: am Anfang „id:“ dann kommt irgend ein Zeichen das mit „\( \)“ gruppiert ist, und dann geht es weiter mit „:initdefault“ und anschließen alle Zeichen bis Zeilenende.
  • Ersetzt wird also die gesammte Zeile von Anfang bis Ende aber nur durch Inhalt von „\1“ also dem was vom Muster in der \( \) Klammer gefunden wird (Rückwärtsreferenz).
  • Ein Blick in die /etc/inittab, zeigt, da steht an dieser Stelle der Standardrunlevel (also normalerweisee 2 3 oder 5) und genau das ist das mögliche Ergebniss des ganzen Befehles.
Beispiel 5

gefunden in /etc/rc.d/xdm /etc/X11/xdm/SuSEconfig.xdm | \ sed ’s+\(.*\)+/etc/init.d/xdm: \1+g‘ | \ /bin/logger

  • nicht dadurch stören lassen, dass hier ein Befehl über mehrere Zeilen geschrieben wurde, Die Zeilen enden mit „\“ das bedeutet der Zeilensprung ist auskommentiert, den sieht die bash beim starten der Befehle nicht.
  • es wird ein Script /etc/X11/xdm/SuSEconfig.xdm ausgeführt und die Ausgabe durch sed mit einem s-Befehl gefiltert, diese Ausgabe wird dem Programm /bin/logger übergeben.
  • der s-Befehl hat hier die Struktur s+++ da ein „+“ unmittelbar dem „s“ folgt.
  • eine Adressierung gibt es nicht, also alle Zeilen werden bearbeitet.
  • die Suchmaske ist \(.*\) und bedeutet soviel wie gruppiert \( \) wird „Alles“ (beliebiges Zeichen, 0 mal oder beliebig oft)
  • ersetzt wird es durch „/etc/init.d/xdm: \1“ , wobei \1 durch die gefundene Gruppe, also der ganzen ursprünglichen Zeile, ersetzt wird.
  • das Flag „g“ ist hier eigentlich nicht nötig, da es ja nur eine einzigen Treffer pro Zeile geben kann.
  • Der Sed-Befehl macht also nichts weiter, als an den Anfang jeder Zeile „/etc/init.d/xdm: „ einzufügen.
Beispiel 6

gefunden in /usr/bin/texi2dvi4a2ps BEFEHL | sed -n ’s/^.*\[\(.*\)version \(….\)-\(..\)-\(..\).*$/txiformat=\1 txiversion=“\2\3\4″/p‘

  • der BEFEHL dessen Ausgabe hier gefiltert wird soll uns mal nicht stören.
  • sed wird mit „-n“ gestartet, also keine automatische Ausgabe jeder Zeile
  • der s-Befehl hat keine Adresse und normale Struktur s/// , Flag ist „p“ bedeutet also gibt es eine Ersetzung dann wird diese ausgegeben, ansonsten wird nichts ausgegeben.
  • Suchmuster ist ^.*\[\(.*\)version \(….\)-\(..\)-\(..\).*$ ; gesucht wird vom Zeilenbegnin nach einer eckigen Klammer „\[„ ; dann kommt irgendetwas oder nichts „.*“ , das wird wiedermal gruppiert \( \), die Gruppe endet vor der Zeichenfolge „version „; Anschließend wird nach Zeichen im Format „XXXX-XX-XX“ gesucht und irgendwas oder nichts kann bis Zeilenende kommen.
  • von dem XXXX-XX-XX Format werden 3 weitere Gruppen gebildet, wir haben also insgesamt 4 Gruppierungen im Suchmuster definiert.
  • ersetzt wird die gesamte Zeile durch „txiformat=\1 txiversion=“\2\3\4“ die \1 \2 \3 \4 wird durch die Gruppen ersetzt.
  • der sed-Befehl formatiert also eine „Versionszeile“ neu, und gibt sie aus, Andere Zeilen erzeugen keine Ausgabe.
Beispiel 7 (für Fortgeschrittene)

gefunden in /usr/bin/autoconf echo X/“$0″ | sed ‚/^.*\/\([^/][^/]*\)\/*$/{ s//\1/ q } /^X\/\(\/\/\)$/{ s//\1/ q } /^X\/\(\/\).*/{ s//\1/ q } s/.*/./; q‘

  • hier wird „X/“ vor „$0“ (also der aufgerufene Name des Scriptes) mit echo ausgegeben und an sed übergeben.

Analyse der Struktur

  • der sed-Befehl geht über mehrere Zeilen und scheint aus mehreren Befehlen zu bestehen, also verallgemeinern wir ihn erst mal, in dem wir die sed-Befehle extrahieren und die Regulären Ausdrücke wegblenden.

/ADRESSE1/{ s/// q } /ADRESSE2/{ s/// q } /ADRESSE3/{ s/// q } s ; q

  • Den sed-Befehl „q“ hatten wir bisher noch nicht, das ist der Abbruchbefehl von sed. Dort wird also das Programm vorzeitig beendet, vorher wird bei fehlender Option -n noch die Ausgabe des Musterspeichers veranlaßt.
  • die Bedeutung, die „{ }“ hier hat, ist auch neu für uns. Die Befehle die in dieser Klammer stehen gehören alle zur selben Adresse, (die Befehle müssen aber durch ; oder \n getrennt werden)
  • Also haben wir 3 Adressen die beim Zutreffen jeweils einen s-Befehl ausführen und dann sed beenden. und wenn keine dieser Adressen zutreffen sollte, den s-Befehl am Ende des Programms, der dann ausgeführt wird.

Schauen wir uns zuerst die s-Befehle an

  • die ersten 3 s-Befehle sind gleich „s//\1/“ das ist auch neu für uns. Der Suchstring, den gibt es gar nicht, da die // unmittelbar hintereinander stehen, dennoch greifen wir auf die Gruppe „\1“ beim Ersetzen zu ?

würden wir diesen Befehl auf der Konsole versuchen, sed ’s//\1/‘ käme eine Fehlermedung, „fehlender Suchstring“ sed nimmt hier für den fehlenden Suchstrings den selben Regulären Ausdruck wie in der Adresse, also mit der Adresse zusammen funktioniert der Befehl, ohne Adresse oder Adresse aus Zeilennummer funktioniert er nicht.

  • der letzte s-Befehl ist einfach „s/.*/./“ ersetzt alles oder nichts durch einen einzigen Punk

Analyse der Adressen

  • ADRESSE1: ^.*\/\([^/][^/]*\)\/*$ wir haben jetzt schon etwas Übung mit entwerteten Zeichen und Regulären Ausdrücken desshalb gleich mal die Zusammenfassung.

gesucht und gruppiert wird „ein mindestens 2 Zeichen langes Wort“ Wortbegrenzer ist „/“ gefunden wird die ganze Zeile. Achtung: hier „^.*\/“ treffen wir auf ein Phänomen der Regulären Ausdrücke, das auch neu für uns ist.gieriges Verhalten(Greediness of RegEx) gesucht wird am Zeilenanfang „irgendwas oder nichts bis ein „/“ kommt“ ist in der Shellvariable eine oder mehrere „/“ (also das Programm mit dem Path aufgerufen,) dann wird hier als „irgendwas“ der längst mögliche String gefunden durch das Greediness wird bei dieser Adresse hier gefunden und gruppiert der „Scriptname ohne den Path“ dieser wird dann auch nach dem s-Befehl ausgegeben, und das sed-Programm beendet.

  • ADRESSE2 „^X\/\(\/\/\)$“ kommt also nur zum Zug wenn ADRESSE1 nicht zutrifft.

sie sucht nach „X///“ und gruppiert die letzten beiden „/“ der s-Befehl würde also „//“ ausgeben und sich beenden.

  • ADRESSE3 „^X\/\(\/\).*“ (nur wenn sowohl Adresse1 und Adresse2 nicht zutreffen) funktioniert ähnlich wie ADRESSE2 nur sucht sie nur nach einem „/“ weniger würde auch fündig werden bei vielen aneinandergereihten „/“ und gibt nur ein „/“ aus
  • Treffen keine der 3 Adressen zu, z.B. weil „$0“ leer sein sollte, dann wird der letzte s-Befehl ausgeführt, der nur einen Punkt ausgibt.
Da ist noch ein kleiner Trick im Script versteckt

Damit bei einer Leeren „$0″ das sed-Programm überhaupt arbeiten kann, wird als Trick echo X/“$0“

benutzt. Das vorangestellte „X/“ wird beim Ersetzten innerhalb von sed jedesmal wieder entfernt, aber es sichert bei leeren $0 eine ordnungsgemäße Funktion des Programms.

Das Ergebnis des gesamten sed-Programms

Das Ergebniss des gesamten sed-Scriptes ist also abhängig vom Inhalt der Shell Variable $0 und ist entweder der „Scriptname ohne Path“ ; „//“ ; „/“ oder „.“

Sicherheit spielt im Internet stets eine große Rolle: Deshalb ist das Sicherheitsverfahren SSH fest im TCP/IP-Protokollstapel verankert. Mit dem SSH-Protokoll ist es Nutzern möglich, eine gesicherte Verbindung zwischen zwei Computern aufzubauen. Bereits seit 1995 wird das Netzwerkprotokoll eingesetzt und seitdem wurde es mehrfach überarbeitet. Wir erklären wir Ihnen die wichtigsten Begrifflichkeiten zum Protokoll SSH und erläutern, wie die Verschlüsselung funktioniert.

Inhaltsverzeichnis

  1. Wofür braucht man SSH?
  2. SSH vs. OpenSSH
  3. Wie funktioniert SSH? Eine Erklärung

Als Shell bezeichnet man den Teil des Betriebssystems, über welchen Nutzer auf den Computer zugreifen können. Normalerweise versteht man darunter die textbasierte Kommandozeile (beziehungsweise Eingabeaufforderung, Terminal oder Konsole) – aber auch die grafische Benutzeroberfläche fällt unter den Begriff Shell. Man nennt also das Verfahren zum Verbindungsaufbau Secure Shell, weil das Protokoll eine sichere Verbindung zur Shell eines anderen Computers herstellt.

Wofür braucht man SSH?

SSH ermöglicht es, dass zwei Computer eine sichere und direkte Verbindung innerhalb eines möglicherweise unsicheren Netzes – wie dem Internet – aufbauen. Das ist notwendig, damit Dritte nicht den Datenstrom abgreifen können und so sensible Daten in die falschen Hände geraten. Auch vor Secure Shell gab es Möglichkeiten, direkte Verbindungen zwischen zwei Rechnern herzustellen, doch die entsprechenden Anwendungen wie Telnet, Remote Shell oder rlogin waren durchweg unsicher. SSH verschlüsselt die Verbindung zwischen zwei Rechnern und ermöglicht, dass von einem Computer aus ein zweiter bedient werden kann.

SSH sorgt aber nicht nur für eine verschlüsselte Verbindung, sondern gewährleistet darüber hinaus, dass nur Verbindungen zwischen den dafür vorgesehenen Computern hergestellt werden (es ist also keine Man-in-the-Middle-Attack möglich) und die entsprechenden Daten nicht auf dem Weg zum Empfänger manipuliert werden können. Der Zugriff auf den entfernten Rechner erfolgte ursprünglich stets über die Kommandozeile. Über sie richtet man Befehle an das entfernte Gerät. Inzwischen ist es aber auch möglich, mithilfe von Virtual Network Computing (VNC) eine grafische Benutzeroberfläche (die bei Servern gar nicht immer vorhanden ist) auf den eigenen Rechner zu spiegeln und so den anderen Computer zu steuern.

SSH hat viele verschiedene Einsatzgebiete:

  • Verwaltung von Servern, auf die man nicht lokal zugreifen kann
  • Sichere Übermittlung von Dateien
  • Sicheres Erstellen von Back-ups
  • Verbindung zwischen zwei Rechnern mit Ende-zu-Ende-Verschlüsselung
  • Fernwartung von anderen Computern

Die Entwicklung von SSH hat auch andere Protokolle beeinflusst. So hat man beispielsweise das unsichere FTP-Protokoll, mit dem es möglich ist, Dateien auf einen Server zu laden und von dort dann wieder herunterzuladen, zum SSH File Transfer Protocol (SFTP) weiterentwickelt.

Ein Vorteil von SSH ist, dass das Protokoll auf allen gängigen Betriebssystemen läuft. Da es sich ursprünglich um eine Unix-Anwendung handelt, ist es zudem von Haus aus auf allen Linux-Distributionen und auf macOS implementiert. Aber auch unter Windows lässt sich SSH verwenden, sofern Sie ein entsprechendes Programm installieren.

SSH vs. OpenSSH

Secure Shell ist 1995 ursprünglich als Open-Source-Projekt entstanden. Im gleichen Jahr gründete der Entwickler Tatu Ylönen jedoch bereits eine Firma, die das Protokoll weiterentwickeln sollte. So hat sich das anfänglich offene Projekt immer mehr zu einer proprietären Software weiterentwickelt. Die Netzgemeinde hat das aber nicht einfach hingenommen und entwickelte auf Basis des SSH-1-Protokolls eine offene Abspaltung: OpenSSH. Da aber auch die Firma SSH Communication Security weiter an Secure Shell arbeitet, existieren inzwischen zwei konkurrierende Protokolle nebeneinander. Zum einen hat man das proprietäre SSH-2-Protokoll (eine Weiterentwicklung, da in SSH-1 Sicherheitslücken bekannt wurden) und zum anderen OpenSSH.

OpenSSH und das kommerzielle SSH sind sowohl von Funktionsweise als auch Umfang annähernd gleichwertig. Der Unterschied betrifft vor allem die Kosten, aber ebenso den Support. Entscheidet man sich für das Produkt der SSH Communication Security, erhält man zusätzlich einen 24/7-Support. Gerade bei großen Unternehmen mit wechselnden IT-Verantwortlichen kann dies sinnvoll sein. OpenSSH bietet hingegen durch die Open-Source-Gemeinde den Vorteil, dass das Projekt stetig und von vielen Teilnehmern weiterentwickelt wird.

Wie funktioniert SSH? Eine Erklärung

Secure Shell setzt mehrere Verschlüsselungs- und Authentifizierungstechniken ein. So wird zum einen sichergestellt, dass Datenströme weder gelesen noch manipuliert werden können. Zum anderen können dadurch nur autorisierte Teilnehmer miteinander Kontakt aufnehmen.

Authentifizierung

In einem ersten Schritt authentifizieren sich SSH-Server und Client untereinander. Der Server sendet ein Zertifikat an den Client, um zu verifizieren, dass es sich wirklich um den richtigen Server handelt. Nur bei der ersten Kontaktaufnahme besteht die Gefahr, dass sich ein Dritter zwischen die beiden Teilnehmer schaltet und so die Verbindung abfängt. Da das Zertifikat selbst auch verschlüsselt ist, kann es nicht imitiert werden. Weiß der Client einmal, wie das richtige Zertifikat lautet, kann kein anderer mehr vortäuschen, über den entsprechenden Server Kontakt aufzunehmen.

Nach der Server-Authentifizierung muss sich aber auch der Client gegenüber dem Server als zugangsberechtigt ausweisen Dafür kann man ein Passwort einsetzen. Dieses – beziehungsweise der verschlüsselte Hashwert davon – ist auf dem Server hinterlegt. Daraus resultiert aber auch, dass Nutzer bei jeder Anmeldung auf einem anderen Server während der gleichen Sitzung das Passwort eingegeben müssen. Deshalb gibt es als alternative Möglichkeit der clientseitigen Authentifizierung die Verwendung des Schlüsselpaares Public Key und Private Key.

Den Private Key erstellt man individuell für seinen eigenen Computer und sichert diesen mit einer Passphrase ab, die länger sein sollte als ein typisches Passwort. Der Private Key ist ausschließlich auf dem eigenen Rechner gespeichert und bleibt stets geheim. Möchte man eine SSH-Verbindung aufbauen, gibt man zunächst die Passphrase ein und öffnet so den Zugang zum Private Key.

Auf dem Server wiederum (wie auch auf dem Client selbst) liegen ebenfalls noch Public Keys. Der Server erstellt mit seinem Public Key ein kryptografisches Problem und sendet dies an den Client. Dieser wiederum entschlüsselt das Problem mit dem eigenen Private Key, sendet die Lösung zurück und teilt so dem Server mit, dass er eine rechtmäßige Verbindung aufbauen darf.

Während einer Sitzung muss man die Passphrase nur einmal eingeben, um Verbindung zu beliebig vielen Servern aufzunehmen. Zum Schluss der Sitzung melden sich die Nutzer an ihren lokalen Rechnern ab und stellen so sicher, dass kein Dritter, der physischen Zugang zur lokalen Maschine erhält, eine Verbindung zum Server aufnehmen kann.

Verschlüsselung

Nach der gegenseitigen Authentifizierung bauen die beiden Kommunikationsteilnehmer eine verschlüsselte Verbindung auf. Dafür wird für die Sitzung ein Schlüssel erzeugt, der nach Beendigung der Sitzung wieder abläuft. Dieser ist nicht zu verwechseln mit den Public-/Private-Key-Paaren, die nur zum Schlüsselaustausch dienen. Der Schlüssel, der für die symmetrische Verschlüsselung eingesetzt wird, ist nur für diese eine Sitzung gültig. Sowohl Client als auch Server verfügen über den gleichen Key und so können jegliche Nachrichten, die ausgetauscht werden, ver- und entschlüsselt werden. Client und Server erstellen den Schlüssel gleichzeitig, aber unabhängig voneinander. Beim sogenannten Key-Exchange-Algorithm verwenden beide Parteien bestimmte öffentliche und geheime Informationen und erstellen so den Schlüssel.

Eine weitere Form der Verschlüsselung findet in SSH durch Hashing statt. Ein Hash ist eine Form von Signatur der übermittelten Daten. Mit einem Algorithmus wird aus den Daten ein Hash erzeugt, der einmalig ist. Sollten Daten manipuliert werden, ändert sich automatisch auch der Hashwert. Daran kann der Empfänger erkennen, ob Daten auf dem Weg durch Dritte geändert wurden. Die Hashwerte sind so gestaltet, dass sie auch nicht einfach simuliert werden können. Idealerweise ist es niemals möglich, zwei unterschiedliche Übertragungen mit dem gleichen Hash zu erzeugen. Das nennt man Kollisionssicherheit.

SSH-Ports

TCP-Ports sind Endpunkte, die Server und Clients öffnen, um die Kommunikation zu ermöglichen. Wie bei einem Hafen (auf Englisch „Port“) empfangen und senden die Kommunikationspartner hierüber die Datenpakete. TCP verfügt über einen Adressraum von 16 Bit und so stehen 65535 Ports zur Verfügung. Die Internet Assigned Numbers Authority (IANA) hat allerdings einige Ports (genau 1024) für bestimmte Anwendungen fest vergeben: so auch den SSH-Port. Standardmäßig laufen alle SSH-Verbindungen über den Port 22.

Hinweis

Da der Port, über den SSH-Verbindungen laufen, allgemein bekannt ist und über diesen offenbar sensible Daten vermittelt werden, ist der SSH-Port für Cyberkriminelle ein favorisiertes Ziel. Deshalb halten einige Nutzer es für sinnvoll, den SSH-Port zu verlegen. Allerdings bietet dies nur einen kurzfristigen Schutz. Mit einem Portscanner ist es möglich, jegliche Ports, die ein Rechner verwendet, zu finden.

SSH-Clients

Der SSH-Client ist in der Regel der eigene PC, mit dem man eine Verbindung zum Server aufbauen möchte. Um dies zu schaffen, kann oder muss (abhängig vom Betriebssystem) man gesonderte Software installieren, die eine SSH-Verbindung aufbaut. Auch diese Programme nennt man in der Regel SSH-Client. Von der SSH Communication Security selbst stammt das kostenpflichtige Tectia SSH, das zusätzlich eine Server-Software enthält. Darüber hinaus existieren aber auch zahlreiche kostenlose Alternativen, wie zum Beispiel die Open-Source-Software PuTTy für Windows und Linux oder lsh, das auf allen Betriebssystemen funktioniert, die auf Unix basieren.

Tipp

Einige Programme bieten Nutzern eine grafische Oberfläche, mit der Konfiguration und das Einsetzen von SSH vereinfacht wird. Prinzipiell lässt sich Secure Shell auch über die Kommandozeile ausführen – unter macOS und anderen Unix-ähnlichen Betriebssystemen sogar ohne weitere Installation.

SSH-Server

Der SSH-Server ist das Gegenstück zum Client. Auch hier wird der Begriff zugleich für die Software verwendet. Ein großer Teil der Software für Clients funktioniert ebenfalls auf Servern. Darüber hinaus gibt es auch Software, die ausschließlich für SSH-Server gestaltet ist. Es ist üblich, SSH auf Servern bereits beim Hochfahren zu starten. Das garantiert, dass man jederzeit per SSH von außerhalb auf den Server zugreifen kann.

Es ist übrigens nicht notwendig, dass der SSH-Server tatsächlich ein Server im engeren Sinne ist, der in einem entfernten Rechenzentrum steht. Nutzer können auch zu Hause einen SSH-Server auf dem eigenen PC installieren, um so beispielsweise von den Vorteilen des Port-Forwarding zu profitieren.

Benutzer hinzufügen: sudo adduser BENUTZERNAME

Benutzer einer Gruppe hinzufügen: usermod aG www-data ‚username‘

Inhalt der phpinfo.php

<?
phpinfo();
?>

PHP.ini anpassen:

memory_limit=512M

post_max_size=256M

upload_max_filesize=256M

max_execution_time=600

max_input_time= 600

upload_max_filesize“ kann mehr bekommen, wenn man sehr große Videos hochladen möchte. Dann muss zwingend auch die „post_max_size“, die „max_execution_time“ und die „max_input_time“ entsprechend angepasst werden, sonst gibt es einen harten Abbruch. Aber leider erst, nachdem man die Datei erfolgreich geglaubt, upgeloadet zu haben.

memory_limit: Maximale Speichermenge, welche ein PHP-Prozess an RAM-Speicher nutzen darf

post_max_size: Maximale Grösse einer POST-Abfrage, welche an PHP übergeben werden darf

upload_max_filesize: Maximale Grösse einer Datei, welche an PHP über geben werden darf

max_input_time: Maximale Zeit in Sekunden, die ein Skript verbrauchen darf, um Eingabedaten (wie POST, GET und Dateiuploads) zu verarbeiten

Folgende php-Module nachladen:

Für php7.4: sudo apt install php7.4 php7.4-bcmath \ php7.4-cli php7.4-common php7.4-curl php7.4-dev \ php7.4-fpm php7.4-gd php7.4-imap php7.4-intl \ php7.4-json php7.4-mbstring php7.4-mysql \ php7.4-opcache php7.4-readline php7.4-sqlite3\ php7.4-xml php7.4-zip php7.4-xmlrpc \ php-libsodium php-imagick php-pear php-dev \ libmcrypt-dev
Für php8.1: sudo apt install php8.1 php8.1-bcmath \ php8.1-cli php8.1-common php8.1-curl php8.1-dev \ php8.1-fpm php8.1-gd php8.1-imap php8.1-intl \ php8.1-json php8.1-mbstring php8.1-mysql \ php8.1-opcache php8.1-readline php8.1-sqlite3\ php8.1-xml php8.1-zip php8.1-xmlrpc \ php-libsodium php-imagick php-pear php-dev \ libmcrypt-dev

Mysql

Besonderheiten beim root-Passwort

Wie bereits erwähnt wird normalerweise bei der Installation des MySQL-Servers das Passwort für den MySQL-root-Benutzer abgefragt. Sollte dieses aus welchen Gründen auch immer nicht geschehen (wie es z.B. für Ubuntu 18.04 der Fall ist) oder aber bei der Abfrage kein Passwort angegeben worden sein, so wird für den Benutzer ‚root’@’localhost‘ das auth_socket Authentifizierungs-Plugin benutzt. Mit einer root-Shell kann mysql dann ohne Passwort verwendet werden, weil die Berechtigung über den aufrufenden Linux-Benutzer gesteuert wird. Damit ist dann allerdings das Anmelden als MySQL-root außerhalb einer root-Shell nicht mehr möglich. D.h. jeder Aufruf von MySQL-Kommandozeilen-Programmen oder sonstige Verbindungen zum Server von außerhalb als MySQL-root müssen im Linux-root-Kontext stattfinden.

Wenn für den MySQL-Benutzer root wieder ein unabhängiges Passwort gesetzt werden soll, muss man sich mittels n einer root-Shell am MySQL-Server anmelden und die folgenden Kommandos an der MySQL-Eingabeaufforderung mysql> eingeben:ALTER USER ‚root’@’localhost’IDENTIFIED WITH mysql_native_password BY ‚NeuesPasswort‘;FLUSH privileges;QUIT;

In Ubuntu-Systemen, die MySQL 5.7 (oder höher) ausführen, ist der MySQL-Benutzer root so konfiguriert, dass er nicht per Passwort, sondern standardmäßig mit dem Plugin auth_socket authentifiziert wird. Dadurch entsteht in vielen Fällen mehr Sicherheit und Benutzerfreundlichkeit, kann aber auch Dinge komplizieren, wenn Sie einem externen Programm (z. B. phpMyAdmin) Zugriff auf den Benutzer erteilen müssen.

Um als root ein Passwort für die Verbindung mit MySQL zu verwenden, müssen Sie die Authentifizierungsmethode vom Plugin auth_socket in ein anderes Plugin ändern, wie zum Beispiel caching_sha2_password oder mysql_native_password. Öffnen Sie dazu die MySQL -Eingabeaufforderung auf Ihrem Terminal:

sudo mysql

Prüfen Sie dann mit folgendem Befehl, welches Authentifizierungsverfahren Ihre MySQL -Benutzerkonten verwenden:

SELECT user,authentication_string,plugin,host FROM mysql.user;

ALTER USER 'root'@'localhost' IDENTIFIED WITH caching_sha2_password BY 'password';

Anmerkung: Die vorherige ALTER USER-Anweisung konfiguriert den MySQL-Benutzer root so, dass er mit dem Plugin caching_sha2_password authentifiziert wird. Gemäß der offiziellen MySQL-Dokumentation ist caching_sha2_password das bevorzugte Authentifizierungs-Plugin von MySQL, da es eine sicherere Passwortverschlüsselung bietet als das ältere, aber immer noch verbreitete Plugin mysql_native_password.

Allerdings funktionieren viele PHP-Anwendungen (beispielsweise phpMyAdmin) mit caching_sha2_password nicht zuverlässig. Wenn Sie diese Datenbank mit einer PHP-Anwendung verwenden möchten, wollen Sie root ggf. so festlegen, dass stattdessen mit mysql_native_password authentifiziert wird:

ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;

Für Mariadb gilt:
UPDATE mysql.user SET plugin = 'mysql_native_password' WHERE user = 'root';
FLUSH PRIVILEGES;
SELECT user,authentication_string,plugin,host FROM mysql.user;

Erstellen Sie von dort einen neuen Benutzer und geben Sie ihm ein starkes Passwort:
CREATE USER 'sammy'@'localhost' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON *.* TO 'sammy'@'localhost' WITH GRANT OPTION;

sammy und password sind durch eigene Namen zu ersetzen!Bestehende User anzeigen lassen:
SELECT user FROM mysql.user;
Bestehende Datenbanken anzeigen:
show databases;
Einen neuen User mit einem sicheren Passwort anlegen:
CREATE USER 'neuerUser'@'localhost' IDENTIFIED BY 'sicheresPasswort';
Neue Datenbank anlegen:
CREATE DATABASE  neueDatenbank;
Dem neuen User komplette Rechte für die Datenbank zuweisen:
GRANT ALL PRIVILEGES ON neueDatenbank . * TO 'neuerUser'@'localhost';
Einem User komplette Rechte auf alle Datenbanken zuweisen:
GRANT ALL PRIVILEGES ON *. * TO 'neuerUser'@'localhost';
Abschließend muss sichergestellt werden, dass die Rechte in der Datenbank auch geladen werden:
FLUSH PRIVILEGES;

User mit Root-Rechten anlegen

CREATE USER 'admin'@'localhost' identified by 'sicheresPasswort!';

GRANT ALL privileges on *.* to ‚admin’@’localhost‘ with grant option;

FLUSH PRIVILEGES;

Backup Export/Import von Datenbanken

Einfaches Backup einer Datenbank

mysqldump -u root -p [optionen] dbname > backup.sql

Backup mit Kompression (GUNZIP)

mysqldump -u root -p [optionen] dbname | gzip -c > backup.sql.gz

Erzeugung einer performateren Backup-Datei

Wichtig für das Einspielen einer Backup-Datei ist die Erzeugen einer korrekten und performanten Backup-Datei. Regelmäßig kommt es bei dem Einspielen von Backup-Dateien zu Fehlermeldung und Abbrüchen (siehe MySQL-Fehlermeldungen). Oft liegt die Ursache in der erzeugten Dump-Datei. In Listing 6, 7, 8 und 9 finden man Lösungsansätze zur Erzeugung von performanten Backup-Dateien.

Datenbankdump über alle Datenbanken ohne Komprimierung

mysqldump -u root -p –events –all-databases –ignore-table=mysql.innodb_index_stats –ignore-table=mysql.innodb_table_stats > dump.sql

Backup einer Datenbank

mysqldump -u root -p –events dbname –ignore-table=mysql.innodb_index_stats –ignore-table=mysql.innodb_table_stats > backup.sql

Backup einer Datenbanken mit Komprimierung

mysqldump -u root -p –events dbname –ignore-table=mysql.innodb_index_stats –ignore-table=mysql.innodb_table_stats | gzip > backup.sql.gz

Einspielen eines einzelnen MySQL-/ MariaDB-Dumps in eine Datenbank

mysql -u root -p  dbname < backup.sql

mysql -u Benutzername -p dbname < /Verzeichnis/backup.sql

mysql -u root -p -f dbname < backup.sql

Einspielen eines kompletten Backups von mehreren Datenbanken

gunzip < backup.sql.gz | mysql -u root -p

Einspielen einer einzelnen Datenbank aus einer Dump-Datei („–all-databases dump“) die mehrere Datenbanken beinhaltet

mysql -u root -p –one-database dbname < backup.sql

Kleiner, aber hilfreicher Tipp: Mit der SQL-Abfrage über den phpMyAdmin SQL-Editor können alle Daten aus einer oder mehreren Spalten ausgewählt werden.

SELECT spalte1, spalte2 FROM tabellenname

FormfaktorGröße in mmGröße in ZollBemerkungen
LPX229 × 279…3309 × 11…13semi-proprietär 1996
Micro-ATX (µATX)244 × 2449,6 × 9,61996; Boards mit nur 2 RAM-Steckplätzen sind inzwischen abweichend vom Standard oft deutlich schmaler.
Micro-BTX (µBTX)264 × 26710,4 × 10,5Intel 2004
Mini-ATX284 × 20811,2 × 8,2veralteter Standard, bis ATX-Version 2.03 enthalten, in ATX-Version 2.1 entfernt
Mini-ATX150 × 1505,9 × 5,9Formatbezeichnung für eine Baureihe der Firma AOpen
Mini-DTX170 × 2036,7 × 8AMD 2007
Mini-ITX170 × 1706,7 × 6,7Shuttle 2003, danach VIA
Mini-LPX203–229 × 254–2798–9 × 10–11siehe LPX
Mini-STX147 × 1405,8 × 5,4Intel 2015
Nano-ITX120 × 1204,7 × 4,7VIA 2004
NLX203–229 × 254–3458–9 × 10–13,6Intel 1999
Next Unit of Computing (NUC)[1]101,6 × 101,64 × 4Intel 2014
PC/10490 × 963,550 × 3,775
Pico-BTX203 × 2678 × 10,5Intel 2004
Pico-ITX100 × 724 × 2,8VIA 2007

Die Konfigurationsdatei für Apache2 einrichten

sudo nano /etc/apache2/sites-available/your_domain.conf

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName your_domain
    ServerAlias www.your_domain
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
Aktivierung der Site
sudo a2ensite your_domain.conf
Abschließend die Aktivierung der Site mit:
sudo systemctl apache2
Dektivierung der Site mit:
sudo a2dissite your_domain.conf
ebenfalls mit sudo systemctl apache2 deaktivieren.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Kommentare

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert