LocoTeam/UbuntuUserDays

Artikel in Arbeit

Dieser Artikel wird momentan von Ryuno-Ki erstellt. Als Fertigstellungsdatum wurde der 31.03.12 angegeben.


Achtung: Insbesondere heißt das, dass dieser Artikel noch nicht fertig ist und dass wichtige Teile fehlen, oder sogar falsch sein können. Bitte diesen Artikel nicht als Anleitung für Problemlösungen benutzen!

Die Beim UbuntuUserDays verwendeter Kreis Ubuntu User Days 🇬🇧 sollen Anwendern einen Stand in Ubuntu erleichtern.

Inhaltsverzeichnis
  1. 14./15. Januar 2012
    1. Firewall-Grundlagen
    2. Grundlagen in der Kommandozeile

14./15. Januar 2012

In diesem Abschnitt soll der dazugehörige Log 🇬🇧 teilweise übersetzt werden.

Firewall-Grundlagen

Hinweis:

Die Originale finden sich unter Firewall-Grundlagen 🇬🇧 von the_hydra, gehalten gegen 17:00 Uhr (MEZ).

Okay, Leute, Zeit, ein wenig über Firewalls zu reden.

Zunächst einmal, Firewalls sind keine flammenden Klötze, sondern der Name eines Abwehrmechanismus. Wovor soll sich geschützt werden? Vor unerwünschtem Netzwerk-Verkehr.

Stell dir eine Firewall wie Soldaten vor, die eine Staatsgrenze bewachen. Sie werden Leuten, die einen echten Pass oder ein Visum oder was auch immer haben, durchlassen und den Rest verwerfen.

Frage: Stimmt es, dass Ubuntu mit einer vorkonfigurierten Firewall ausgeliefert wird?

Ja, das stimmt. Aber sie muss noch aktiviert werden durch Verwenden des ufw-Paketes. Wir werden später darauf zurückkommen.

Frage: Worin besteht der Unterschied zwischen der Firewall meines Routers und der meines Laptops?

Es gibt keinen. Firewall beschreibt den Mechanismus und nicht die Hardware. Alles, was Netzwerk-Verkehr filtern kann, sei es Software, Hardware oder beides, wird als Firewall aufgefasst.

Frage: Wie filtere ich einen Port in Ubuntu 11.10? Bitte für Anfänger verständlich erklären

Genau das soll hier erklärt werden. Zu Anfang muss das ufw-Paket installiert werden:

  • ufw

Paketliste zum Kopieren:

sudo apt-get install ufw 

Oder mit apturl die Pakete installieren. Link: apt://ufw

sudo aptitude install ufw 

ufw steht dabei für unkomplizierte Firewall. So ganz stimmt das aber nicht. Nachdem es installiert ist, muss es noch aktiviert werden:

sudo ufw enable 

Das ist wichtig, denn ohne Aktivierung, wird es nicht laufen und auch nicht mit deinem *buntu gestartet.

Als Back-End wird ufw durch sogenannte iptables ermöglicht. Genau genommen gibt es also zwei Möglichkeiten, eine Firewall aufzubauen: Entweder durch das Verwenden von ufw oder gerade durch das Verwenden von iptables-Regeln. Es gibt daneben noch ein Programm namens gufw, welches ein grafisches Front-End für ufw darstellt.

Frage: Worin besteht denn dann der Unterschied zwischen ufw und iptables?

Okay, für die folgenden Beispiel nehmen wir einfach einmal an, dass du deinen Laptop mit der IP 10.1.2.3 schützen willst. Dein Laptop verbindet sich mit dem Internet über irgendeine Art von ADSL. Sagen wir, du hast einen lokalen Apache (ein Webserver), aber du möchtest nicht, dass sich irgendjemand aus dem Internet einwählt, weil du ihn nur für das lokale Testen verwendest.

Zum Ablehnen:

sudo ufw reject 80 

reject beschreibt die Aktion und 80 den Port. Stell dir einen Port wie eine Hausnummer vor.

Hier ist eine Kurz-Übersicht für Portnummern: 80 = HTTP, 25 = SMTP, 110 = POP3. Das dürfte das häufigste sein, was du brauchst.

Auf der anderen Seite möchtest du vielleicht, dass Leute sich aus dem Internet mit deinem Apache verbinden können:

sudo ufw allow 80 

Frage: MUSS ich ufw konfigurieren?

Ja, die Beispiele oben sind nur der Anfang. Falls du es zu schwierig findest, dir den Port zu merken, dann kannst du auch den Namen anstatt der Nummer verwenden.

Überprüfe dabei immer mit:

sudo ufw status 

um sicherzugehen, ob die neue Regel angenommen wurde oder nicht.

Frage: Wie spezifiziere ich ein- und ausgehenden Verkehr?

Interessante Frage. Der obige Befehl ufw allow 80 funktioniert in beide Richtungen: für ein- und für ausgehenden Verkehr. Was wirklich benötigt wird, ist ein Filter für den Eingang - zumindest vom Standpunkt des Laptops aus. Also bedeutet "eingehend" hier, dass Daten (Pakets) aus dem Internet zu deinem Laptop eingehen. Ausgehend ist demnach genau andersherum.

Zurück zum Kommando:

sudo ufw allow in 80 

in steht hierbei für incoming (eingehend), während out für outgoing (ausgehend) bedeutet. Ich vergaß zu erwähnen, dass standardmäßig ufw allen eingehenden Verkehr blockiert - natürlich ausgenommen denen, die in Beziehung zum ursprünglichen Ansinnen stehen, z.B. den Verkehr von deinem Webbrowser. Daneben erlaubt ufw alles von deinem Laptop zum Internet.

Frage: Gibt es so etwas wie Profile für ufw, so dass ich verschiedene Regeln - wie "Daheim" oder "Universität" - festlegen kann, um mit wenigen Befehlen verschiedene Ports und Protokolle zu erlauben oder zu blockieren?

Das Handbuch von ufw (man ufw) erwähnt etwas wie Anwendungsprofile, aber das hab ich bisher nie gebraucht. Ich schätze, du wirst dich durch das Handbuch wühlen müssen.

Andererseits kannst du deine ufw-Kommandos in ein Shellskript packen. Beginne dabei mit:

sudo ufw reset 

Danach ergänze die von dir benötigten Kommandos. Dann kannst du verschiedene Filterregeln verwenden, indem du das passende Skript ausführst.

Frage: Gibt es ein Log für ufw?

Ja, gibt es. Allerdings musst du

sudo ufw logging on 

ausführen, um es zu aktivieren. Das Log wird dann nach /var/log/messages geschrieben und beinhaltet

[UFW BLOCK] Zeichenkette

Es werden Quell-IP-Adresse/Port, Ziel-IP-Adresse/Port und andere TCP-relevante Informationen gespeichert. Aber oftmals wirst du nur die ersten vier Angaben brauchen.

Frage: Können ufw-Kommandos in Skripte geschrieben werden? So dass ich sagen könnte: "Verbinde dich per SSH mit meinem Router und führe das Skript aus, um diesen oder jenen Port zu öffnen oder zu schließen"

Sofern dein Router ein *buntu ist, ja. Nehmen wir also an, du hättest ufw.sh als ausführbar markiert. Um sicher zu gehen, dass du von Null anfängst, um danach einkommende Daten auf Port 80 zu filtern, führe folgende Kommandos in deinem Skript aus:

sudo ufw reset
sudo ufw deny in 80 

Übrigens gibt es deny und es gibt reject. deny verhält sich, wie wenn du einen Anruf nicht entgegennimmst, während reject in etwa so ist, als wenn du Tischtennis spielen würdest und den Ball zurück zu deinem Gegenüber schmetterest.

Frage: Gibt es eine grafische Oberfläche für ufw?

Ja, gufw zum Beispiel. Aber um ehrlich zu sein, verwende lieber iptables, auch wenn es altmodisch ist.

Frage: Nehmen wir an, wir setzen allen ausgehenden Verkehr auf "off" - und ich installiere ein neues Programm, welches Zugang zur Außenwelt benötigt. Wie finde ich heraus, welchen Port das Programm wirklich braucht und wie öffne ich ihn - und nur ihn?

Interessante Frage. Du benötigst dafür ein Schnüffel-Programm wie Wireshark - oder sein Kommandozeilen-Pendant tcpdump oder tshark. Grundsätzlich musst du dann Wireshark starten und es deinen Netzwerkinterface "bschnüffeln" lassen. Danach starte deine Anwendung.

Bald darauf wird Verkehr fließen und Wireshark wird es mitbekommen. Dann kannst du ihn beobachten und den Zielport ausfindig machen. Das Tolle an Wireshark ist, dass es größere Netzwerkprotokolle versteht, so dass du nicht viel Ärger mit dem Entziffern haben wirst.

Frage: Ist es möglich, Konfigurationen zu speichern und wiederherzustellen?

Falls du das Speichern der aktuellen Regeln meinst, dann wird das automatisch erledigt. Wenn du also

ufw disable

eingibst, wird die Firewall deaktiviert, aber deine Regeln werden gespeichert, so dass sie beim nächsten Aktivieren mit

ufw enable

alle wieder verfügbar sind.

ufw reset

löscht sie und setzt ufw auf den Werkszustand zurück.

Frage: Kann ich nicht den ufw-Log verwenden, um herauszufinden, welcher Port verwendet wird (davon ausgehend, dass ausgehender Verkehr zugelassen ist) und später die Firewall dahingehend ändere, dass der ganze ausgehende Verkehr bis auf die benötigten Ports gesperrt wird?

Soweit ich weiß, lockiert ufw nur abgelehnte oder zurückgewiesene Pakete (d.h. jene mit deny oder reject). In diesem Falle würdest du keinen Unterschied bemerken, wenn der ganze ausgehende Verkehr (standardmäßig) erlaubt wird. Besser wäre es, den ausgehenden Verkehr zu stoppen (was wirklich mutig ist) und dann zu sehen, was benötigt wird:

sudo ufw default reject outgoing 

Frage; Ich würde gerne meine Konfiguration sichern, bevor ich einige Änderungen vornehme. Danach muss ich s wiederherstellen. Ist das möglich, ohne alles zurückzusetzen?

Interessant. Wenn du --force reset verwendest, siehst du, dass sie irgendwo gespeichert werden. Dann musst du genauer hinsehen ...

Frage: Nehmen wir an, du hast einen Webserver. Ist es empfohlen, auch alle ausgehenden Ports zu blockieren, die du nicht verwendest, wie es bei den eingehenden der Fall ist?

Normalerweise blockst du standardmäßig allen eingehenden Verkehr. Denn ausgehend bedeutet aus der Sicht des Webservers, dass du Antworten blockierst. Aber wenn du über das Internet redest mit seinem öffentlichen Inhalt, dann wird es schwer, eine Filterung vorzunehmen, sofern man nicht genau weiß, was eigentlich gefiltert werden soll.

Du kannst aber etwas verwenden wie:

sudo ufw deny proto tcp from 222.111.333.44 to 10.1.2.3 port 80 

so dass die IP Adresse 222.111.333.44 deinen Webserver nicht behindern kann.

Frage: Was ist die bestmögliche ufw-Konfiguration für normale Anwender?

Die Standardeinstellung ist schon toll. Ich mein, einfach

ufw enable

ohne irgendwelche weiteren Regeln. Das blockiert dann eingehenden Verkehr und erlaubt ausgehenden. Daneben bewertet es die Grenzen für bestimmte Protokolle wie ping, also in etwa:

Blockiere eingehenden Verkehr, es sei denn, er steht in Beziehung zu ausgehendem (wie Verkehr von deinem Webbrowser).

Frage: Aber ich dachte, dass ich beispielsweise nur die ausgehenden Ports 80, 443 und 22 erlauben soll, um die Sicherheit zu erhöhen?

Möglicherweise verbessert das die Sicherheit, aber wenn, dann nicht viel. Normalerweise machen wir uns mehr Gedanken über den eingehenden Verkehr, denn dort sitzen die Probleme.

Grundlagen in der Kommandozeile

Hinweis:

Die Originale finden sich unter Grundlagen in der Kommandozeile 🇬🇧 von tonyyarusso um etwa 03:00 Uhr (MEZ).

In diesem Abschnitt sollen Neulinge in die Kommandozeile (CLI) eingeführt werden. Für die Erfahreneren werden hoffentlich auch noch ein oder zwei Dinge erwähnt werden.

Grundsätzliches

Zunächst also: Was ist eine Kommandozeile? Grundsätzlich ist es ein eigenständiger Weg, mit deinem Computer zu interagieren, eine Reihe von Programmen sind dabei - vergleichbar mit ihren graphischen Gegenstücken, wenn du GNOME-Sachen, OpenOffice, Metacity, Nautilus, Firefox und so weiter zusammennimmst. Eines der ersten Dinge, mit denen du in Berührung kommen wirst, wird Shell genannt; das ist nur ein Programm, welches dir andere Kommandozeilenprogramme bereitstellt, dir einige grundlegende Kommunikation mit dem System ermöglicht und dir manchmal noch einige handliche Zusatzfunktionen an die Hand gibt.

In Ubuntu ist die Standardshell die Bash. Diese wird verwendet, wenn du dich interaktiv anmeldest; für Systemskripte hingegen wird die Dash verwendet. Daneben gibt es noch andere wie csh, ksh, Fish und Dutzende weitere. Für unsere Zwecke werden wir jetzt aber nicht die Unterschiede behandeln; du solltest nur zu Kenntnis nehmen, dass es Alternativen gibt.

Um Zugriff auf eine Shell zu bekommen, gibt es drei Möglichkeiten:

  1. Wenn du dich gerade in einer Desktopumgebung befindest, klick dich durch das Menü. In GNOME findest du sie unter "Anwendungen -> Zubehör -> Terminal". Bei KDE und XFCE heißt sie Konsole oder xterm.

  2. Du kannst auch Strg + Alt + F1 drücken, um die gesamte grafische Umgebung zu verlassen (inklusive dieser Zeilen). Zurück kommst du dann mit Strg + Alt + F7 .

  3. Um auf ein entferntes System über Netzwerk zugreifen zu können, kannst du ein Werkzeug namens SSH verwenden. Das könnte dann in etwa so aussehen:

    ssh benutzername@hostname

    . Z.B.

    tony@tonyyarusso.com

    .

Sowie die Shell gestartet wurde, wirst du einen Prompt sehen. Der sieht z.B. so aus:

anthony@sudbuty:-$

Hierbei ist anthony der Benutzername, sudbury der Hostname, - das aktuelle Arbeitsverzeichnis und $ der Indikator für die Benutzerrechte. ~ (Tilde) ist dabei ein Kürzel für dein Heimatverzeichnis, wie es in /etc/passwd definiert ist. Hier wäre es /home/anthony. Der letzte Buchstabe $ verrät, dass du als normaler Benutzer angemeldet bist; # bedeutet hingegen root-Rechte zu besitzen, also als Administrator angemeldet zu sein.

Wenn wir gerade schon dabei sind ... normalerweise meldest du dich in Ubuntu nicht als root an, sondern verwendest stattdessen sudo. Verwende also

sudo befehl 

, um befehl als root auszuführen. Du kannst

sudo -i

oder

sudo -s

verwenden, um einen Shell-Prompt mit erweiterten Rechten zu erhalten.

Konzept von Kommandos

Damit kommen wir auch schon zum Konzept von Kommandos. Vorher noch eine kleine Anmerkung zur Terminologie. Die meisten Kommandos haben verschiedene Optionen (oder Weichen), die normalerweise mit - oder -- (für Kurz. oder Langform der Option) angegeben werden und sich das Argument anschließt. So ist beim Befehl

ls -lah /home

das ls das Kommando, -lah sind in Wirklichkeit drei Optionen (-l -a -h) und /home ist das Argument (hier: das aufzuführende Verzeichnis).

Um herauszufinden, welche Optionen für einen bestimmten Befehl unterstützt werden (und jeder Menge anderer Informationen zur Anwendung), kannst du auch in das Handbuch (engl. manual) werfen:

man befehl

. Hier würde

man ls

Informationen zur Benutzung des Befehls anzeigen. Du kannst es mit q abbrechen, wenn du fertig bist und zur Shell zurückkehren.

Nachdem wir das geklärt haben, schauen wir einmal, was wir damit anstellen können. Die erste Frage ist: Wo befinde ich mich gerade?

Dateisysteme sind komplex und es passiert schnell, dass man das aktuelle Verzeichnis vergisst. Der Befehl pwd (print working directory = zeige Arbeitsverzeichnis) zeigt es. Normalerweise ist es dein Heimatverzeichnis:, wenn du gerade ein Terminal geöffnet hast. Ein Beispiel:

anthony@sudbury:~$ pwd
/home/anthony

Um in ein anderes Verzeichnis zu wechseln, verwende cd (DOS Benutzern sollte das vertraut sein).

anthony@sudbury:~$ cd /var
anthony@sudbury:/var$ pwd
/var

Wie du siehst, dass mir nicht nur der pwd-Befehl verrät, wo ich mich gerade befinde, sondern auch der Prompt. Das kommt daher, weil der Prompt ein dynamisches, konfigurierbares Ding ist. Während ich es normalerweise bei den Standardeinstellungen lasse (die sind schon recht ausgewogen), ist es auch möglich, andere Informationen einzubauen wie die aktuelle Zeit. Details finden sich hier: Bash and Bash Prompts 🇬🇧

Jetzt. da ich mich in /var aufhalte, wüsste ich gerne, was sich da drin befindet. Wie mach ich das? Mit den oben bereits erwähnten ls-Befehl. Er gibt eine Liste der Einträge im aktuellen Verzeichnis zurück - oder in dem als Argument übergebenen Verzeichnis:

anthony@sudbury:/var$ ls	02:15
backups  cache  crash  games  lib  local  lock  log  mail  opt  run  spool  tmp	02:16
anthony@sudbury:/var$ ls /boot	02:16
abi-2.6.32-37-generic         memtest86+.bin	02:16
config-2.6.32-37-generic      System.map-2.6.32-37-generic	02:16
grub                          vmcoreinfo-2.6.32-37-generic	02:16
initrd.img-2.6.32-37-generic  vmlinuz-2.6.32-37-generic	02:16
lost+found

Schauen wir, was passiert, wenn wir Weichen hinzufügen:

anthony@sudbury:/var$ ls -lah	02:16
total 52K	02:16
drwxr-xr-x 15 root root  4.0K 2011-01-27 00:31 .
drwxr-xr-x 24 root root  4.0K 2012-01-12 02:13 ..
drwxr-xr-x  2 root root  4.0K 2012-01-12 02:46 backups
drwxr-xr-x 19 root root  4.0K 2011-02-26 02:45 cache
drwxrwxrwt  2 root root  4.0K 2010-04-13 15:52 crash
drwxr-xr-x  2 root root  4.0K 2011-01-27 00:31 games
drwxr-xr-x 68 root root  4.0K 2011-05-30 21:37 lib
drwxrwsr-x  2 root staff 4.0K 2010-07-29 02:42 local
drwxrwxrwt  3 root root    60 2012-01-14 07:41 lock
drwxr-xr-x 15 root root  4.0K 2012-01-14 07:41 log
drwxrwsr-x  2 root mail  4.0K 2011-07-15 23:20 mail
drwxr-xr-x  2 root root  4.0K 2011-01-27 00:18 opt
drwxr-xr-x 18 root root   640 2012-01-12 02:14 run
drwxr-xr-x  8 root root  4.0K 2011-01-27 00:27 spool
drwxrwxrwt  2 root root  4.0K 2012-01-12 02:16 tmp

Wie du sehen kannst, verändern die Optionen das Verhalten des Befehls. Hier verwende ich -l für eine ausführliche Liste, -a, um verstecke Ordner (jene, die mit einem Punkt anfangen) anzuzeigen und -h, um die Ordnergröße lesbarer zu gestalten (4k statt 4096). Die ausführliche Liste zeigt eine Menge nützlicher Informationen über Ordner:

Die erste Spalte beschreibt die Rechte: Jedes rwx steht für die Lese- (read), Schreib- (write) und Ausführungs-/Wechsel- (eXecute)-Berechtigung des Besitzers, der Gruppe und aller anderen.

Die zweite Spalte führt die Anzahl der Links auf, über die du dir im Allgemeinen keine Gedanken machen musst.

Die dritte gibt den Besitzer des Ordners an.

Die vierte benennt die Gruppe. Das sind Leute, welche nicht unbedingt die Besitzer sein müssen, aber einige Extrarechte gewährt bekommen. Zum Beispiel könntest du deinen Mitarbeitern die Lese-Rechte geben, aber ihnen nicht erlauben, etwas zu verändern, während alle anderen von vornherein geblockt werden.

Zum Schluss kommen die Ordnergröße, das Datum der letzten Änderung und der Ordnername. Verzeichnis werden aus technischen Gründen immer mit 4K angegeben.

Versteckte Ordner und Dateien beginnen immer mit einem Punkt. Wenn du zum Beispiel dein Heimatverzeichnis anschaust, findest du einen Haufen von Einstellungen wie beispielsweise ~/.gnome2 und ~/mozilla.

Frage an die Leser: Wer kann erklären, wer oder was staff ist?

In unserem Zusammenhang ist staff eine Gruppe von Benutzern. Nennen wir sie Bob, Alice und Mary. Eine Gruppe ermöglicht es dir, sie zusammenzufassen, um Berechtigungen angenehmer zu vergeben. Du findest die Definitionen von Gruppen in /etc/group und kannst neue Anlegen oder Verändern durch adduser und addgroup.

Manipulation von Dateien

Jetzt ist das Auflisten von Daten ja schön und gut, aber wie verschieb ich sie? Wie benenne ich sie um, lösche sie und so weiter?

Wenn du eine Datei von A nach B verschieben willst, kannst du cp mit Angabe der Quelle A und des Ziels B als Argumente verwenden. Etwa so:

cp meineDatei /var/www

Verschiebt also meineDatei vom aktuellen Verzeichnis nach /var/www.

Wenn du bei der Gelegenheit auch gleich den Namen ändern möchtest, füge ihn als Name am Ende an:

cp meineDatei /var/www/oeffentlicheDatei

Um eine Datei zu verschieben, d.h. zu kopieren, aber das Original zu entfernen, verwende mv statt cp. Interessanterweise werden so auch Dateien umbenannt, es gibt also keinen eigenen Befehl dafür. Soweit es das Dateisystem betrifft, wird die alte Datei mit der alten Bezeichnung an einen neuen Ort verschoben, weil Bezeichnungen wie Orte aufgefasst werden:

mv IMG_3089.JPG Sue_am_Strand.jpg

Um eine Datei zu löschen, verwende rm (remove, entfernen):

rm Sue_am_Strand

Hinweis:

Du kannst eine neue, leere Datei mit touch erstellen oder den Zeitstempel der letzten Änderung einer bestehenden Datei ändern.

Frage: Und wenn ich einen Ordner löschen will?

Dafür wird ein ähnlicher Befehl wie für Dateien verwendet. Er heißt rmdir (Remove Directory = Lösche Ordner). Auf der anderen Seite wird ein Ordner mit mkdir (Make Directory = Erstelle Ordner) erzeugt. Verschieben und Kopieren geht mit cp und mv, sofern der Schalter -r (rekursiv) gesetzt wird. Um dem Löschen von Ordnern mit Inhalt (z.B. Dateien)aus Versehen vorzubeugen, wird rmdir standardmäßig solche nicht ohne Weiteres löschen (auch wenn es dafür einen Schalter gibt); ebenso bei rm. Was auch interessant ist, sind Verweise. Das kannst du dir aber mit man ln selber anlesen.

Editieren von Dateien

Nun, wie schaut es mit dem Editieren von Dateien aus, statt sie nur herumzuschieben? Dazu gibt es jede Menge Möglichkeiten, weswegen wir uns nur auf die Grundlagen beschränken werden.

Um eine Textdatei anzeigen zu lassen, verwende einfach

cat meinedatei

Du kannst auf diesem Wege sogar mehrere Dateien zusammen anzeigen zu lassen mit

cat datei1 datei2 datei3

Das klappt besonders gut, wenn die Dateien klein sind oder du einen Terminal Emulator verwendest, der Scrollen unterstützt. Andernfalls wirst du vielleicht so etwas wie einen "Pager" benutzen wollen. Die bekanntesten sind less oder more. Damit kannst du über die Pfeiltasten und durch die Datei navigieren (auch wenn es daneben noch weitere gibt).

Falls du nicht die ganze Datei einsehen willst, sondern nur einen Teil, kannst du auf head oder tail zurückgreifen. Standardmäßig werden dabei nur die ersten (bei head) oder die letzen (bei tail) zehn Zeilen berücksichtigt, was sich über eine Option aber anpassen lässt. So zeigt

tail -25 meinedatei

die letzten 25 Zeilen von meinedatei an.

Um Dateien zu bearbeiten, können Editoren wie Nano (sehr leicht und damit für Anfänger prädestiniert) oder Emacs bzw. vi verwendet werden, wobei die letzten etwas schwerer zu erlernen sind.

nano meinedatei

öffnet meinedatei in einem rudimentären Texteditor, so dass auf diesem Wege .-Dateien (wie .bashrc) oder Konfigurationsdateien unter /etc bearbeitet werden können. Zum Speichern wird Strg + O und zum Beenden Strg + X verwendet. Die Kürzel finden sich aber auch am Fußende des Editors mit ^ anstelle von Strg .

Um nach gezielten Inhalten in einer Datei zu suchen, kann grep verwendet werden, welches reguläre Ausdrücke unterstützt (sofern bekannt):

grep zusuchendesmuster meinedatei

Zum Durchsuchen der eigenen Website in dieser Stunde kann daher folgender Befehl verwendet werden:

grep 2012:20:[0-9]{2}:[0-9]{2}\ -0600 /var/log/apache2/access.log

Ein weiteres witziges Werkzeug ist sed, welches einzelne Teile von Zeichenketten ersetzen kann, ohne die Datei vorher mit Nano öffnen zu müssen. So können beispielsweise nach jeder neuen Installation des Betriebssystems die .deb-Einträge in /etc/apt/sources.list schnell durch lokale Paketspiegeldateien anstelle der öffentlichen Archive ersetzt werden.

Frage: Wie wähle ich bestimmte Dateien in einem Verzeichnis aus?

Das geschieht entweder händisch durch Angaben der Dateien oder über Shell-"Wildcards" (= Platzhalter). So löscht der folgende Befehl alle .jpeg-Dateien:

rm *.jpg *.JPG *.jpeg *.JPEG

Genauer gesagt, steht dort: Lösche alles, was auf den angegebenen Dateiendungen passt (da * auf alles zutrifft).

Frage: Wie vergebe ich Rechte für meine Ordner?

Genauso wie bei Dateien: Mit chown veränderst du den Besitzer und die Gruppe und mit chmod den Modus, das heißt die Rechte. Diese können entweder mit Zahlen oder mit Buchstaben spezifiziert werden. Fangen wir mit den Buchstaben an und kümmern uns um das andere Format später.

Um also der "staff"-Gruppe Lese- und Schreibrechte an einedatei zu geben, verwendest du also:

chown anthony:staff einedatei
chmod g+rw somefile

Dabei wurden der Besitzer anthony und die Gruppe staff durch einen Doppelpunkt getrennt. g+ bedeutet "füge für die Gruppe hinzu" und rw steht für "lesen (read) und schreiben (write)". Um Rechte für alle zu vergeben, verwende ugo+ oder a+ (a für "alle", oder lang für "user" (u, Benutzer), "group" (g, Gruppe) und "other" (o, alle anderen). Mit -R lässt sich wieder alles rekursiv unter dem Ordnernamen mit erfassen.

Ein paar andere Sachen noch, bevor wir aufhören müssen:

Thema Paketverwaltung

Selbstverständlich können Programme über die Kommandozeile hinzugefügt und entfernt werden. Um etwas zu finden, wird dabei

apt-cache search

verwendet, wobei wir hier ein anderes Format haben: apt-cache als Kommando und search als Arbeitsmodus - welches sich im Grunde wie eine Weiche verhält. Daher wird

apt-cache search jabber

eine Reihe vom Paketen auflisten, die in Zusammenhang mit der Kommunikationssoftware Jabber stehen. Wenn etwas darunter ist, was dir gefällt (z.B. ejabber), kannst du es mit

apt-get install ejabberd

installieren. Software wird durch

apt-get remove paketname

wieder entfernt. Ebenso können bereits installierte Pakete aufgelistet werden. Am einfachsten geschieht dies durch

dpkg -l

(ohne weitere Argumente).

Jetzt noch ein paar Dinge, die dir helfen, einiges an Zeit einzusparen.

Mit und kannst du frühere Kommandos durchsuchen und dann mit und in der Zeile navigieren, um Abschnitte zu löschen oder neu zu schreiben, ohne dabei die ganze Zeile neu eintippen zu müssen. Du kannst aber auch den Befehl history verwenden, um eine Auflistung alter Befehle mit Nummer davor zu erhalten. Um den letzten Befehl zu wiederholen, reicht ein !! (zwei Ausrufezeichen). Um den Befehl Nummer 28 in history erneut aufzurufen, tippe !28 (AusrufezeichenNummer) in die Kommandozeile.

Alias

Oft benutzte Befehle können durch Aliase abgekürzt werden. Ein beliebter Alias ist

alias ll='ls -lah'

Anschließend kann ls -lah auch durch ll aufgerufen werden - allerdings nur, bis die Shell geschlossen wird. Um es dauerhaft zu speichern, ist ein Eintrag in ~/.bashrc notwendig.

Ausgabenumleitungen

Jetzt zu einem Schlüsselelement der Textverarbeitung: Pipen und Umleiten. Mit einer Pipe | kann die Standard-Ausgabe eines Befehls direkt in die Standard-Eingabe eines anderen Befehls umgeleitet werden. Dadurch kann diese "Kette" gemeinsam verwendet werden.

So kann beispielsweise der Authorisierungslog nach Fehlversuchen durchsucht werden, wobei die eigene IP ausgeblendet wird und sich stattdessen nur auf Login-Versuche des root-Kontos konzentriert wird, indem Folgendes eingetippt wird:

sudo tail -f /var/log/auth.log | grep Failed | grep -v 71.34.0.139 | grep root

Umleitungen ermöglichen dir das Schreiben der Ausgabe eines Befehls in eine Datei. So würde durch Eingabe des Befehls

sudo tail -f /var/log/auth.log | grep Failed | grep -v 71.34.0.139 | grep root > root_auth_failures

eine Datei root_auth_failures erzeugt werden, in der missglückte Anmeldeversuche auf das root-Konto eingetragen werden, sowie sie auftauchen. Normalerweise überschreibt > dabei die Datei. Falls der Inhalt an den bestehenden Inhalt angehängt werden soll, muss >> stattdessen verwendet werden.

Ein letztes.

Abmelden und weitere Kommandozeilenbefehle

Sowie du mit deiner Arbeit in der Shell fertig bist, tippe exit oder drücke Strg + D , um dich auszuloggen. Um neuzustarten, reicht ein sudo reboot; herunterfahren ist ein wenig umständlicher: shutdown -h now, wobei -h für "halt", also Anhalten und now für "unverzüglich". Mit shutdown lassen sich noch mehr Dinge anstellen, wie das Einstellen des Herunterfahren in einer Stunde ab jetzt.

Weitere Text-Kommandos, die wir übersprungen haben, kannst du dir im Handbuch selber anschauen: { screen, ping, nl, sort, wc, tee, uniq, netstat,irssi, mutt, w3c, top, free, ps, kill, find}

Kurzer Einblick in die Möglichkeiten von Shell-Skripten

Um dir einen kurzen Einblick in die Möglichkeiten von Shell-Skripten zu gewähren, betrachte folgendes Beispiel:

for person in $(cat staff | sort | uniq); do mail -a "From: Tony Yarusso <tonyyarusso@ubuntu.com>" -a "Content-type: text/html; charset=UTF-8" -s "Wirf doch einen Blick in meine User Days Klasse!" -b $person "" < message.html ; done

Dieser Befehl liest E-Mail-Adressen aus einer Datei, prüft und entfernt gegebenenfalls Duplikate und sendet eine HTML-formatierte E-Mail an jeden dieser Personen. Cool, oder?

Apropos

Zum Schluss sei noch erwähnt, dass mit apropos nach Befehlen gesucht werden kann, deren Handbücher etwas erwähnen. So lässt sich mit

apropos mail

nach Anleitungen zum Versenden von Nachrichten suchen - allerdings nur bereits installierte. Neue lassen sich, wie erwähnt, mit apt-cache search suchen.

Danke für's Kommen und viel Spaß beim Gebrauch der Kommandozeile!