[[Vorlage(Baustelle, 31.03.12, Ryuno-Ki)]] Die [[Bild(UUD-Circle alt="Beim UbuntuUserDays verwendeter Kreis")]] [https://wiki.ubuntu.com/UserDays Ubuntu User Days] {en} sollen Anwendern einen Stand in Ubuntu erleichtern. ## Ryuno-Ki: Der grobe Aufbau dieses Artikels sieht so aus, dass die erste Ebene das Datum enthält -> spätere UUDs, die zweite die Themen der Vorträge und die dritte die einzelnen Fragen. ## Ryuno-Ki: Dieses Bildchen http://ikhaya.ubuntuusers.de/2012/01/12/ubuntu-user-days/#comment_3 bekomme ich leider nicht eingebunden. Kann das jemand ändern? [[Inhaltsverzeichnis(2)]] = 14./15. Januar 2012 = In diesem Abschnitt soll der dazugehörige [http://irclogs.ubuntu.com/2012/01/14/%23ubuntu-classroom.html Log] {en} teilweise übersetzt werden. == Firewall-Grundlagen == {{{#!vorlage Hinweis Die Originale finden sich unter [http://irclogs.ubuntu.com/2012/01/14/%23ubuntu-classroom.html#t16:00 Firewall-Grundlagen] {en} 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: {{{#!vorlage Paketinstallation ufw }}} {{{#!vorlage Befehl sudo aptitude install ufw }}} [:ufw:] steht dabei für '''u'''nkomplizierte '''F'''ire'''w'''all. So ganz stimmt das aber nicht. Nachdem es installiert ist, muss es noch aktiviert werden: {{{#!vorlage Befehl sudo ufw enable }}} Das ist wichtig, denn ohne Aktivierung, wird es nicht laufen und auch nicht mit deinem *buntu gestartet. Als [wikipedia:Front-End_und_Back-End: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 [:ufw:gufw], welches ein grafisches [wikipedia:Front-End_und_Back-End: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 [wikipedia: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: {{{#!vorlage Befehl sudo ufw reject 80 }}} ''reject'' beschreibt die Aktion und ''80'' den Port. Stell dir einen Port wie eine Hausnummer vor. Hier ist eine Kurz-[wikipedia:Liste_der_standardisierten_Ports:Ü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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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. ## Ryuno-Ki: Gibt es eine Möglichkeit, dass ohne ein "ich" zu umschreiben? Andererseits kannst du deine [:ufw:]-Kommandos in ein Shellskript packen. Beginne dabei mit: {{{#!vorlage Befehl 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 {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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, [:ufw: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 [:Wireshark: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 [wikipedia:Netzwerkprotokoll:]e 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: {{{#!vorlage Befehl 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: {{{#!vorlage Befehl 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 == {{{#!vorlage Hinweis Die Originale finden sich unter [http://irclogs.ubuntu.com/2012/01/15/%23ubuntu-classroom.html#t02:00 Grundlagen in der Kommandozeile] {en} 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:]. 1. Du kannst auch [[Vorlage(Tasten, Strg+Alt+F1)]] drücken, um die gesamte grafische Umgebung zu verlassen (inklusive dieser Zeilen). Zurück kommst du dann mit [[Vorlage(Tasten, Strg+Alt+F7)]]. 1. 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 [:Bash/Prompt: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 [:Homeverzeichnis: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 [:sudo#root-im-Terminal:root-Rechte] zu besitzen, also als Administrator angemeldet zu sein. Wenn wir gerade schon dabei sind ... normalerweise meldest du dich in Ubuntu nicht als [:sudo#Der-Benutzer-root:root] an, sondern verwendest stattdessen [:sudo:]. Verwende also {{{#!vorlage Befehl sudo befehl }}} , um `befehl` als [:sudo#root-im-Terminal:root] auszuführen. Du kannst {{{sudo -i}}} oder {{{sudo -s}}} verwenden, um einen [:Bash/Prompt: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? === Navigation im Dateisystem === 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 [:Homeverzeichnis: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 [:Bash/Prompt:Prompt]. Das kommt daher, weil der [:Bash/Prompt: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: [http://www.linuxselfhelp.com/howtos/Bash-Prompt/Bash-Prompt-HOWTO-2.html Bash and Bash Prompts] {en} 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 }}} {{{#!vorlage 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 [[Vorlage(Tasten, hoch)]] und [[Vorlage(Tasten, runter)]] 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. [:VIM: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 [[Vorlage(Tasten,Strg+O)]] und zum Beenden [[Vorlage(Tasten,Strg+X)]] verwendet. Die Kürzel finden sich aber auch am Fußende des Editors mit [[Vorlage(Tasten, ^)]] anstelle von [[Vorlage(Tasten, Strg)]]. Um nach gezielten Inhalten in einer Datei zu suchen, kann [:grep:] verwendet werden, welches [wikipedia:Regulärer_Ausdruck: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-"[wikipedia:Wildcard_(Informatik):Wildcard]s" (= 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/apt-cache: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. === Navigation in der Befehls-History === Mit [[Vorlage(Tasten, pfeil hoch)]] und [[Vorlage(Tasten, pfeil runter)]] kannst du frühere Kommandos durchsuchen und dann mit [[Vorlage(Tasten, pfeil links)]] und [[Vorlage(Tasten, pfeil rechts)]] 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 [:Bash#Durchsuchen-der-History: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 [:Bash#Durchsuchen-der-History: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: [:Shell/Umleitungen#Der-Pipe-Operator:Pipen] und [:Shell/Umleitungen: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 [:sudo#Das-HOME-Verzeichnis-von-root:root-Konto]s 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 [:sudo#Das-HOME-Verzeichnis-von-root: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 [[Vorlage(Tasten,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 " -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! #tag: Sicherheit, Netzwerk, Internet, Firewall, Einsteiger, Community