Unterlagen in einem PDF - Fakultät für Mathematik
Transcription
Unterlagen in einem PDF - Fakultät für Mathematik
Technische Praxis der Computersysteme 1 Thomas Leitner <thomas.leitner@univie.ac.at> Fakultät für Mathematik, Universität Wien Wintersemester 2015 Letzte Änderung: 2015-12-04 09:00 Foliensatz 0 Organisatorisches Organisatorisches • VO und UE werden gemeinsam als VU angerechnet • VO-Termine • • Geblockt 10 Termine jeweils am Donnerstag 13:15 bis 15:30 im HS02, W29 • 01.10.2015, 08.10.2015, 15.10.2015, 22.10.2015, 29.10.2015, 05.11.2015, 12.11.2015, 19.11.2015, 26.11.2015, 03.12.2015 Prüfung • Mündlich • Dauer circa 30 Minuten • Anmeldung per E-mail • Jederzeit nach Ende der Vorlesung Inhalte der Vorlesung • Installation einer Linux-Distribution • Geschichte von Linux • Was ist ein Betriebsystem? • Systemstart • Prozesse • Dateisysteme • Berechtigungen (Authentifizierung/Authorisierung) • Grundlegender Umgang mit der Shell • Graphische Oberflächen • Shell-Scripting Ziel: Studierende sind in der Lage, Linux zu installieren und beherrschen den Umgang mit der Shell. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 2 von 95 Foliensatz 1 Geschichte von Linux Inhalt • Geschichte von Unix und Linux • Urheberrecht und Lizenz • Open Source und Freie Software Whirlwind Computer Der erste Rechner, der in Echtzeit arbeitete und einen Bildschirm für die Ausgabe hatte. Motivation Betriebssystem • Mitte des letzten Jahrhunderts waren Computer anders als heute: Es waren große Rechenanlagen, die viele Mitarbeiter brauchten - genannt „Operatoren“. Diese haben, wenn notwendig, Programmcode oder Daten in die Maschine eingegeben, wenn diese es durch einen „Interrupt“ verlangten. Die Idee eines „Operating Systems“ war, diese Tätigkeiten zu automatisieren. • Später kamen zusätzliche Fähigkeiten hinzu: Time-Sharing (mehrere Anwender gleichzeitig auf derselben Maschine), Tastatur & Terminal für Ein- und Ausgabe, Netzwerkfähigkeit (Ethernet), grafische Oberfläche & Maus, und mit dem Personal Computer der Einzug ins Wohnzimmer. • Zu Beginn hatte jeder Computer ein anderes Betriebssystem. Das stellte sich als nicht praktikabel heraus und man suchte nach Lösungen… Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 3 von 95 Unix Anfänge • Unix wurde von Ken Thompson und Dennis Ritchie Anfang der 1970er Jahre geschaffen Geschichte von Unix 1 1969 kommerzielles Projekt von AT&T-Angestellten bei Bell Labs • Grundlage war Idee von Mehrbenutzersystem „Multics“; später „Unix“ getauft • Parallel dazu Programmiersprache „C“ entwickelt; dadurch war es auf verschiedene HardwarePlattformen portierbar - kein direkter Maschinencode! • Quellcode aus rechtlichen Gründen gratis (Unkostenersatz) weitergegeben, Fragmentierung • 1980er Jahre: Krieg zwischen verschiedenen Unix Systemen • System V (1983), 4.2BSD (1983), IBM AIX (1986), … • Standardisierung: POSIX (einheitliche Schnittstellen für Unix-Systeme) • GNU (1983) von Richard Stallman (Kürzel: RMS, gegen Proprietarisierung) • Minix (1987) von Andrew S. Tanenbaum für Lehrzwecke entwickelt (hatte selbst nie eine große Bedeutung, war aber Inspiration für Linux) Unix-Philosophie • Es gibt viele, kleine Programme, die genau eine Sache machen, und die dafür gut. Small is beautiful. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 4 von 95 • Programme sollen so geschrieben sein, dass sie gut zusammen arbeiten. • Als universelle Schnittstelle dienen Textströme. • Alles ist eine Datei. Everything is a file. • Daten sollen in Textdateien gespeichert werden. Siehe auch Unix-Philosophie auf Wikipedia Geschichte von Unix 2 Geschichte von Linux • Ab 1991 von Linus Torvalds, ursprünglich nur für x86-Prozessoren entwickelt • Der Öffentlichkeit in einem Usenet-Posting am 25. August 1991 vorgestellt • Ursprünglicher Name Freax, später wurde daraus Linux • Entwicklung: • 1992: Linux-Kernel unter GNU GPL vertrieben, erste freie LinuxDistributionen • 1993: 100+ Entwickler arbeiten am Linux-Kernel • 1994: Version 1.0 (netzwerkfähig, graphische Oberfläche) • 1995-jetzt: Portierung auf andere Platformen • 1996: Version 2.0 (mehrere Prozessoren parallel benutzbar) Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 5 von 95 • 2001: Version 2.4 (64GB RAM, Journaling-Dateisystem) • 2003: Version 2.6 • Jetzt: Version 4.2.2 Siehe auch: Geschichte von Linux auf Wikipedia Linux und Unix im Alltag Linux: • Embedded Systems und Spezialhardware (z.B. Netzwerkswitches) • Smartphones (z.B. Android) • Großteil der Internetserver • Circa 75% der Rechner der Fakultät für Mathematik Unix: • Nach wie vor kommerzielle Varianten im Einsatz (IBM AIX, HP UX, …) • Apple Mac OS X (seit 2001, basierend auf BSD und Mach-Kernel) • Smartphones (Apple iPhone, neuere BlackBerry-Modelle auf QNX-Basis) UNIX GUI dazumals UNIX GUI ungefähr 1990, mit twm, xman, xlogo, xterm, … Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 6 von 95 Linux GUI heute Gnome GUI aus 2013 Urheberrecht und Lizenz • Berner Übereinkunft zum Schutz von Werken der Literatur und Kunst • Der, der etwas schafft, ist der Urheber; hat Urheberrechte („Copyright“) an seinem Werk. Kann in den meisten Ländern nicht abgeben werden (Ausnahme: „Public Domain“ in USA). • Urheberrecht impliziert, dass andere nur das mit dem Werk machen dürfen, was der Urheber erlaubt (das Werk verwenden, duplizieren, ändern, …) • Hier kommt die Lizenz ins Spiel: Sie regelt – im Rahmen der Gesetze –, was andere mit dem Werk machen dürfen (Weitergabe, Vervielfältigung, …), ohne dass man den Urheber fragen muss. Für uns interessant in Bezug auf Software: • Closed Source Software: „proprietäre“ Software, meist ohne Quellcode, darf man nur benutzen (nicht weitergeben, vervielfältigen) • Open Source Software: kostenlos, Quellcode einsichtig, darf man kopieren, ändern und weitergeben (eventuell mit Einschränkungen) Closed Source Software • Der Quellcode, der Entwicklungsprozess und die zukünftige Ausrichtung sind geheim • Keine Mitsprache bei Änderungen und zukünftigen Features • Abhängigkeit von der Softwarefirma • Eingebaute Algorithmen sind verborgen: unmöglich um Fehler zu analysieren, Forschung zu Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 7 von 95 betreiben, … • Support (Unterstützung) ist normalerweise kostenpflichtig. • Man kann das Programm nicht kaufen, sondern man erwirbt nur eine Lizenz, die die Benützung erlaubt. • • Man darf das Programm auch nicht an andere weitergeben. • Manchmal ist diese Funktionsumfang) Lizenz kostenlos erhältlich (bzw. ein Programm mit reduziertem Wird das Programm nicht mehr weiterentwickelt oder hört die Firma auf zu existieren, gibt es keine Möglichkeit die Software weiterzuentwickeln. Open Source vs. Freie Software • Begriff „Open Source“ erst 1998 eingeführt, weil im Englischen „Free Software“ nicht nur „Freie Software“, sondern auch „Kostenlose Software“ bedeuten kann • Einige Open Source Lizenzen besagen, dass man den Quellcode und das Programm bekommt und damit machen darf, was man will. Insbesondere darf man auch Erweiterungen vornehmen und das Produkt kommerziell verwerten. Beispiele: BSD, Apache 2.0, CC Diese Lizenzen können zum Beispiel unter der GPL re-lizensiert werden, umgekehrt geht das nicht! • Begriff „Freie Software“ oft für strengere Lizenzen wie GPL und LGPL verwendet • Gängiger Überbegriff F(L)OSS: Free/Libre Open Source Software Freiheiten von Freier Software 1. The freedom to run the program, for any purpose (freedom 0). 2. The freedom to study how the program works, and change it so it does your computing as you wish (freedom 1). Access to the source code is a precondition for this. 3. The freedom to redistribute copies so you can help your neighbor (freedom 2). 4. The freedom to distribute copies of your modified versions to others (freedom 3). By doing this you can give the whole community a chance to benefit from your changes. Access to the source code is a precondition for this. „free“ as in „free speech“, not as in „free beer“! Siehe The Free Software Definition Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 8 von 95 „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Bedingungen 3.0 Abweichendes Copyright von Inhalten: • Die „Geschichte von Unix“-Grafik steht unter der CC BY-SA 3.0 • Der Unix Screenshot steht unter der CC BY-SA 3.0 • Tux-Logo von Larry Ewing, Simon Budig, Anja Gerwinski • Gnu-Logo von Aurelio A. Hecker, Shaddy Zeineddine; unter der Free Art License Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 9 von 95 Foliensatz 2 Betriebssystem am Beispiel Linux Inhalt • Installation von Linux • Programmvergleich Linux/Windows/OS X • Aufbau des Betriebssystems Linux • Linux-Distributionen Installation von Ubuntu Linux 1 Zwei Möglichkeiten: 1. Lade die Installations Installationsanleitung. CD („Desktop version“) herunter, boote von ihr und folge der Ist keine Partition frei, mache ein Backup und verkleinere bestehende Partitionen, damit Platz (min. 10GB) für neue entsteht. 2. Virtualisieren: Installiere VirtualBox, erzeuge eine virtuelle Festplatte (~10GB), starte vom Image der CD wie in Punkt 1 und installiere Ubuntu. Installation von Ubuntu Linux 2 Was ist bei einer Installation zu beachten? • Sprache: Nachträglich können meist Pakete für zusätzliche Sprachen installiert werden. Diese umfassen Lokalisierungen für die Anwendungen, Wörterbücher, Dokumentation, … • Lokalisierung: Ort, Zeit und Zeitzone. Es ist üblich, die Uhrzeit über das Internet zu synchronisieren (mittels NTP). • Partitionierung: Bei Installation in einer virtuellen Maschine am besten die Standardeinstellungen verwenden. Ansonsten je nach Anwendungsfall eine oder mehr Partitionen: • / ist die Systempartition, ~20GB, am Anfang der Platte, unbedingt nötig • /boot ist die Bootpartition, ~200MB, wichtig beim Booten via (U)EFI • /home für Benutzerdaten, optional, so groß wie möglich • swap unter 2GB RAM sollte es eine Swap-Partition geben; kann auch nachträglich als Datei in / erzeugt und eingebunden werden (also nicht als Partition). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 10 von 95 Installation von Ubuntu Linux 3 • Nach der Installation muss das System neu gestartet werden und danach ist es benutzbar. Bei der Installation werden die wichtigsten Programme installiert, d.h. man hat Web-Browser, E-MailProgramme, Bildbetrachtungs- und Bildbearbeitungsprogramme, Media-Player und vieles mehr zur Verfügung. • Falls bestimmte Funktionalitäten nicht vorhanden sein sollten, können diese über den Paketmanager einfach nachinstalliert werden. Unter Ubuntu hat man dazu die graphische Oberfläche Ubuntu Software Center zur Verfügung bzw. das Programm apt-get in einem Terminal. • Wird ein Befehl in einem Terminal eingegeben, der nicht bekannt ist, aber über ein (oder mehrere) Paket installiert werden könnte, wird eine entsprechende Meldung ausgegeben: $ fortune The program 'fortune' is currently not installed. You can install it by typing: sudo apt-get install fortune-mod $ sudo apt-get install fortune-mod # Zur Installation des Pakets Programmvergleich Linux/Windows/OS X 1 Office-Suite » Linux: LibreOffice, OpenOffice, Calligra » Windows: MS Office, LibreOffice, OpenOffice, Calligra » OS X: Apple Productivity Apps, MS Office, LibreOffice, OpenOffice, Calligra Browser » Linux: Chromium (oder Google Chrome), Firefox, Opera » Windows: Chromium (oder Google Chrome), Firefox, Opera, Internet Explorer » OS X: Safari, Chromium (oder Google Chrome), Firefox, Opera Mailprogramm » Linux: Thunderbird, KMail, Evolution » Windows: Thunderbird, Outlook » OS X: Apple Mail, Thunderbird, Outlook Programmvergleich Linux/Windows/OS X 2 Bildbearbeitung » Linux: Gimp » Windows: Adobe Photoshop, Gimp » OS X: Adobe Photoshop, Gimp Vektorgrafiken » Linux: Inkscape, Karbon (Teil von Calligra) » Windows: Adobe Illustrator, Inkscape » OS X: Adobe Illustrator, Inkscape 3D Grafiken » Linux: Blender, Maya » Windows: Blender, Maya, 3DS MAX, SketchUp » OS X: Blender, Maya, SketchUp Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 11 von 95 Programmvergleich Linux/Windows/OS X 3 Videoplayer » Linux: VLC, mplayer » Windows: VLC, MPC-HC, Windows Media Player » OS X: VLC, QuickTime Desktop Publishing » Linux: Scribus » Windows: Scribus, QuarkXPress, Adobe FrameMaker, Adobe InDesign » OS X: Scribus, QuarkXPress, Adobe FrameMaker, Adobe InDesign Hardware Ein Computersystem besteht aus Hardware und Software. Hardware bezeichnet alle physischen Teile: • Prozessor (CPU = Central Processing Unit) • Speicher für Daten • RAM = Arbeitsspeicher: Schneller Zugriff, aber Daten nicht permanent gespeichert • Festplatte: Vergleichsweise langsamer Zugriff, Daten permanent gespeichert • Externe Medien: USB-Stick, DVD, Netzwerk, … • Mainboard mit Grafikkarte, Soundkarte, Erweiterungssteckplätzen, … • Eingabegeräte (Tastatur, Maus, Touchpad, …) • Ausgabegeräte (Bildschirm mittels Grafikkarte, Lautsprecher mittels Soundkarte, Drucker, …) Software • Die Software bestimmt, was der Prozessor mit den Daten machen soll. Sie liegt entweder in Form eines kompilierten Programmes vor oder als Quelltextdatei, die von einem Interpreterprogramm abgearbeitet wird. Beispiele von Software: Webbrowser, E-Mail-Programm, Shell-Skripte, … • Der Kernel eines Betriebssystems ist ein spezielles Programm, welches beim Starten des Systems geladen wird. Er organisiert das Zusammenspiel von Hardware und aller anderen Software. Als einzige Software hat er vollen Zugriff auf die Hardware. • Das Gesamtsystem, auf dem die Software läuft, heißt Plattform (Hardware + Betriebssystem). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 12 von 95 Aufbau des Betriebssystems Linux 1. Kernel: • Verwaltung der Hardware (Gerätetreiber, Dateisystem, Arbeitsspeicher, Interrupts, …), erstes geladenes Programm (nach Boot-Loader) • Verwaltung der Software (Prozesse, Multitasking, …) • Abstrahierung des Dateisystems, API/ABI-Schnittstellen, … 2. Init-System: • Konfiguration und Management des Systemstarts • Starten und Monitoring von Hintergrundprozessen („Daemonen“) 3. Shell (Kommandozeileninterpreter) • Dialog mit Kernel mittels Hilfsprogrammen • Bietet auch Skript-Sprache für kleine Programme (bash, zsh, …) 4. Systemprogramme und -bibliotheken • Zum Beispiel coreutils (ls, cd, cp, rm, mv, …) • Zusätzliche Utilites und solche mit einer GUI Linux Kernel • Abstraktionsschicht zwischen Hardware und anderen Programmen • Dateisystem (gleicher Zugriff, egal, wo Daten physisch liegen – Festplatte, USB-Stick, Netzwerkserver, …; ist auch Schnittstelle zum Zugriff auf Geräte) • Speicher (Prozesse glauben, sie hätten eigenen Speicherbereich; Speicherzuweisung und eventuell Auslagerung von Speicherblöcken) • Verwaltung von Prozessen (Prozess = Instanz eines Programmes; Schnittstelle für ProzessErzeugung; automatisches Scheduling; Multitasking) automatische • Ermöglicht Mehrbenutzerbetrieb (mehrere Benutzer gleichzeitig am selben System, private Datenbereiche, unterschiedliche Rechte, Sicherheitskonzept, …) • … und bietet vieles mehr (Netzwerkprotokolle, jede Menge Gerätetreiber, …)! Init-System • Das Init-System ist das erste vom Kernel nach dem Booten gestartete Programm und verantwortlich für den weiteren Start des Betriebssystems. • Es konfiguriert das System (z.B. die Netzwerkschnittstellen) und lädt alle Dienste (Daemonen – Disk and Execution Monitors), die im Hintergrund laufen sollen (z.B. einen Webserver), und schließlich die Login-Programme (entweder nur die textbasierten Login-Programme oder auch die graphische Oberfläche). • Es gibt mehrere verschiedene Init-Systeme, früher SysV-Init mit den Init-Skripten. Um den Start zu optimieren, verwenden moderne Distributionen andere init-Programme, meist systemd. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 13 von 95 Shell Die Shell ist ein interaktiver Kommandozeileninterpreter. • Es gibt mehrere Shells (z. B. dash, ksh, csh, zsh, …), wir verwenden die bash (Bourne-again Shell), die Standard-Loginshell der meisten Linux-Distributionen. • Um Zugriff auf eine Shell zu erhalten, braucht man ein Terminal. Im Normalfall gibt es sechs „ echte“ Terminals (wechseln zwischen ihnen mit Strg+Alt+F1 - Strg+Alt+F6). Auf der grafischen Oberfläche (Strg-Alt-F7) bekommt man eine Shell mittels eines „Terminal“-Programmes (z.B. gnome-terminal unter Gnome oder konsole unter KDE). • Das Prinzip ist, dass Text eingetippt und die Eingabe mit der Eingabetaste bestätigt wird. Das veranlasst die Shell, die entsprechenden Zeichen zu interpretieren, zu verarbeiten und die Befehle abzuarbeiten. Anschließend wird die Ausgabe dem Benutzer präsentiert und man kann erneut Befehle eintippen. Den Umgang mit der Shell muss man beherrschen, wenn man Linux effektiv und effizient benutzen will! Mehrbenutzerbetrieb („Multi-User“) • Ursprünglicher Grund für UNIX: Mehrere Benutzer sollen über Terminals an einem zentralen Großrechner arbeiten können („Time Sharing“). Es werden mehrere Benutzer mit jeweils mehreren Prozessen parallel verwaltet und die Ressourcen verteilt. Davon geblieben ist die Einteilung in Benutzer und Gruppen sowie das Multitasking. • Jeder, der am Rechner arbeiten möchte, muss sich gegenüber dem Betriebssystem authentifizieren (meist mit Benutzername und Passwort). Damit bekommt man eine Identität und hat bestimmte Rechte: • Jeder Benutzer hat Zugriff auf seine eigenen Daten. • Jedes Gruppenmitglied hat Zugriff auf die Daten der Gruppe. • Der Administrator („root“) hat Zugriff ohne Einschränkungen. Start des Betriebssystems • Das BIOS (Basic Input Output System) bzw. das UEFI (Unified Extensible Firmware Interface) – gespeichert auf einem Chip direkt am Motherboard – initialiert die Hardware und läd den BootLoader von einer Partition einer Festplatte, von einem USB Gerätes, von einer CD, … • Der Boot-Loader (unter Linux meist grub2) übergibt die Kontrolle an ein Betriebssystem, in unserem Fall dem Linux-Kernel. Der Boot-Loader grub2 bietet die Möglichkeit, verschiedene Betriebssystem zu laden (Linux, Windows, *BSD); diese Funktionalität bietet aber UEFI auch von sich aus. • Der Linux-Kernel bereitet die Hardware vor und übergibt dann an das Init-System, welches das System konfiguriert. • Sobald die initiale Konfiguration des Systems abgeschlossen ist, werden die Login-Programme gestartet und der Benutzer kann sich einloggen. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 14 von 95 Linux-Distribution 1 Eine Distribution besteht aus mehreren Teilen, nämlich • dem Linux-Kernel, der in einer Linux-Distribution immer vorhanden sein muss; • Bibliotheken, Systemprogrammen, Init-System, Default-Konfigurationen, etc. – das sind Teile, die den Anwender im Normalfall nicht betreffen, jedoch für die Administration wichtig sind; • und Anwendungsprogrammen, die für den Benutzer wichtig sind. Linux wird oft auch GNU/Linux genannt, da viele der Systemprogramme und -bibliotheken aus dem GNU Projekt stammen (z.B. coreutils). Linux-Distribution 2 • Als Linux-Distribution bezeichnet man eine gewisse Zusammenstellung dieser drei Komponenten. Es wird eine Auswahl getroffen und es werden bestimmte Techniken oder Mechanismen verwendet (z. B. Init-System, Hardware-Erkennung, Paketverwaltungssystem, …) und ausgewählte Anwendungen vorinstalliert. • Hauptaufgabe ist es, ein funktionierendes Repository getesteter Anwendungsprogramme zur Verfügung zu stellen und (automatische) Updates für die gesamte Software auszuliefern. • Beispiele von Distributionen: Debian (eine der ersten Distributionen, Allroundsystem), Ubuntu (basiert auf Debian, Fokus auf Benutzer, weit verbreitet), Red Hat (für Server, kommerzielle Ausrichtung), Fedora (für Software-Entwickler). • Auch Systeme wie Android oder Open webOS basieren auf dem Linux-Kernel, haben aber mit klassischen Linux-Distributionen nicht viele Gemeinsamkeiten. Siehe auch Linux-Distribution auf Wikipedia Linux-Distribution 3 • Ein Repository ist ein Verzeichnis für Software, meist spezifisch für jede Distribution. Es umfasst jeden Typ von Software (Kernel, Administration, Anwendung) und zusätzlich auch Dokumentation sowie Default-Konfigurationen. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 15 von 95 • Die Software wird in Form von Paketen bereitgestellt und zwischen diesen Paketen sind Abhängigkeiten definiert. Das heißt in der Praxis, dass ein Paket für ein Programm zusätzlich die Anwesenheit von weiteren Paketen benötigt. So wird zum Beispiel sichergestellt, dass bei der Installation eines Audio-Players die nötigten Audio-Codecs installiert werden. • Die zwei verbreitetsten Paketformate sind deb („Debian package“; von Debian, Ubuntu und anderen Debian-Derivaten verwendet) und rpm („RPM Package Manager“; z.B. von Red Hat und openSUSE verwendet). Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Bedingungen 3.0 Abweichendes Copyright von Inhalten: • Die Grafik „Linux-Distribution“ steht unter der CC BY-SA 3.0 Lizenz. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 16 von 95 Foliensatz 3 Grundlagen Inhalt • Benutzung X.org • Benutzung Bash • Aufbau eines Befehls / Manpage • Allgemeine Befehle X.org 1 • X.org ist ein Programm, das die graphische Oberfläche verwaltet, ein sogenannter Display-Server. Es kommuniziert mit der Grafikkarte und stellt eine Brücke zu einem Fenstermanager („windowmanager“, z.B. Enlightenment, Fluxbox, Compiz, Mutter, KWin …) über ein Protokoll her. • Der Festermanager verwaltet die Programmfenster (Rahmen, Platzierung, …) und bietet Möglichkeiten zum Minimieren, Maximieren, Wechseln,… von Programmfenstern. Der Inhalt der Programmfenster wird nicht vom Fenstermanager gestaltet, sondern dazu wird (fast immer) ein GUIToolkit (z.B. Qt, GTK, …) verwendet. • Die Desktop-Umgebung (z.B. Gnome, KDE, XFCE, …) ist wiederum unabhängig vom Fenstermanager und bietet ein einheitliches Look and Feel sowie zusätzliche Funktionalitäten wie ein „Startmenu“, einen Dateimanager, Standardprogramme (Movieplayer, Audioplayer, Bildbetrachter, …) und dergleichen. X.org 2 • Ein Display-Manager (z.B. XDM, KDM, GDM, LightDM, …) bietet die Möglichkeit zum graphischen Login und dem Anmelden an Rechnern im Netzwerk über XDMCP (X Display Manager Control Protocol). • X.org kann sogar über das Netzwerk/Internet Applikationsfenster auf anderen X-Instanzen darstellen. • freedesktop.org vereinheitlicht Fenstermanager und Desktop-Umgebungen durch Standards (z.B. Notifikationen, „System Tray Icons“, …) und Software (xdg-utils, LightDM, …). Tipps zur Bedienung, neben dem „Üblichen“: • Text mit Maus markieren → Text wird automatich in die Zwischenablage kopiert • Mittlere Maustaste drücken → Text aus der Zwischenablage einfügen • Mittlere Maustaste auf Titelleiste → Fenster wird in den Hintergrund geschickt • Alt-Taste + primäre Maustaste irgendwo im Fenster → Fenster verschieben • Alt-Taste + sekundäre Maustaste irgendwo im Fenster → Fenstergröße ändern Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 17 von 95 X.org 3 • Die X.org Software ist eine Weiterentwicklung von X für Unix. In der Zeit als X entwickelt worden ist, gab es im Vergleich zu heute noch ganz andere Hardware, welche die Entwicklung stark beeinflusst hat. Mit X.org hat man gezeigt, dass dieses System für moderne Anwendungszwecke anpassbar ist, aber mittlerweile kommt man an die Grenzen des Machbaren. • Deshalb wird derzeit ein Ersatz für X mit dem Namen Wayland entwickelt. Mit Wayland versucht man, die Komplexität zu verringern, in dem man sich auf das Wesentliche konzentriert. Wayland selbst ist nur eine Protokollspezifikation, die angibt, wie ein Display-Server mit Klienten zu kommunizieren hat. Die Referenzimplementierung des Display-Servers nennt sich Weston. • Gleichzeitig wird von Ubuntu ein Display-Server unter dem Namen Mir entwickelt. Nachdem sogar von Seiten Xubuntu bzw. Kubuntu die Unterstützung für Mir ausbleibt, wird sich in den nächsten Jahren zeigen, wie es mit Mir weitergeht. bash - Grundlagen 1 Die bash (Bourne Again Shell) ist die Standard-Shell auf Linux-Systemen und die, mit der wir uns befassen. Zur Wiederholung: Eine Shell dient dem Ausführen von Befehlen und der effizienten Manipulation von Textströmen. Für die Eingabezeile wird die readline Bibliothek genutzt, daher gibt es einige Hilfsmittel für den Anwender: • Befehls-History: Pfeiltaste rauf & runter • History-Search: Strg-r sucht rückwärts in der History • Navigation in der Zeile: • • Strg-Links / Alt-b → Cursor ein Wort nach links • Strg-Rechts / Alt-f → Cursor ein Wort nach rechts • Strg-a / Strg-e → Cursor zum Anfang/Ende der Zeile Die Tabulator-Taste vervollständigt (angefangene) Befehle, Pfade und Dateinamen. Zusammen mit dem Paket bash-completion werden auch Argumente und Optionen vieler Befehle vervollständigt. bash - Grundlagen 2 Es gibt drei grundlegende Typen von Befehlen: • Shell-interne Befehle, diese entsprechen keinem Programm (abhängig von der Shell, welche Befehle intern sind) • Alias, das ist ein Synonym für einen Befehl (nur in der Shell gültig) • (Systemweite) Programme und Shell-Skripte Welcher Befehl gewählt wird, hängt vom Pfad (der in der Variable $PATH gespeichert ist) ab und lässt sich mittels type (oder dem Programm which) bestimmen. Jeder Befehl hat einen Namen, eine bestimmte Syntax für Optionen/Parameter und benutzt meist Daten-Ströme (Standardeingabe stdin, Standardausgabe stdout und Standardfehlerausgabe stderr). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 18 von 95 Anatomie eines Befehls $ name [OPTIONEN] [ARGUMENTE]... Beispiel: $ ls -l -h --color=none change* copy* total 10.1K -rw-r--r-- 1 root root 1.8K Aug 11 2011 changelog.Debian.gz -rw-r--r-- 1 root root 8.3K Aug 11 2011 copyright Ein Befehl hat auch einen Rückgabewert („exit value“ oder „exit status“; eine Zahl), welcher signalisiert, ob es einen Fehler gab (0 → fehlerfreie Ausführung, sonst nicht fehlerfreie Ausführung). Er steht in der Shell-Variablen $? zur Verfügung. Beispiel: $ rm not_existing_file rm: cannot remove `not_existing_file': No such file or directory $ echo $? # Datei erfolgreich gelöscht? 1 $ echo $? # Ausführung von echo-Befehl okay? 0 Anatomie eines Befehls - Optionen/Argumente • Die Optionen und Argumente, die nach dem Befehlsnamen angegeben werden, folgen keiner allgemein gültigen Regel. • Üblicherweise beginnen Optionen mit einem Bindestrich und meist gibt es short options (z.B. -f) und/oder long options (z.B. --force). Oft können short options auch kombiniert werden (z.B. -r -f → -rf). • Einzelne Optionen/Argumente sind durch Leerzeichen voneinander getrennt. Kommt ein Leerzeichen in einer Option/einem Argument vor, kann man Anführungszeichen verwenden. Beispiel: $ $ $ $ $ rm -r --force / find . -iname '*test*' -exec cat {} \; ip addr show eth0 touch drei verschiedene dateien touch "eine datei mit leerzeichen im namen" Anatomie eines Befehls - Manpage • Manpages (Befehl man) erklären, was ein Befehl macht und wie er aufgerufen werden kann bzw. welche Optionen/Parameter er unterstützt. • Unterstrichene Ausdrücke bedeuten meist, dass diese durch konkrete Werte ersetzt werden müssen. „|“ gibt Alternativen an, „[…]“ optionale Argumente (Defaults beachten!), „…“ bedeutet, dass dieses Argument öfters vorkommen darf. • Beendet wird das Programm mit q, mit /<WORT> und n/N kann man suchen. Beispiele für die Synopsis eines Befehls: Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 19 von 95 find [-H] [-L] [-P] [-D debugopts] [-Olevel] [path...] [expression] ls [OPTION]... [FILE]... Mehrere alternative Aufrufmöglichkeiten stehen untereinander: mount mount mount mount [-lhV] -a [-fFnrsvw] [-t vfstype] [-O optlist] [-fnrsvw] [-o option[,option]...] device | dir [-fnrsvw] [-t vfstype] [-o options] device dir Ausführen eines Befehls Was passiert, wenn ein Programm oder Shell-Skript ausgeführt wird? • Bash kopiert sich („fork“) - Kopie des bash-Prozesses ist Kind-Prozess. • Der Kind-Prozess ersetzt sich selbst mit dem auszuführenden Programm („exec“). Es werden dabei alle Umgebungsvariablen des Eltern-Prozesses übernommen. Wichtig: Ein Kind-Prozess kann nichts am Eltern-Prozess ändern, es gibt nur den Rückgabewert und Signale. Siehe auch Bash and the process tree Wichtige bash-Befehle • type → Typ des Befehls (intern, Programm, …) • echo [Argumente...] → Schreibt Argumente nach stdout • cd → Wechseln des Arbeitsverzeichnisses • pwd → Ausgabe des aktuellen Arbeitsverzeichnisses nach stdout • exit → Beenden der Shell Tastenkombinationen und wichtig „Kürzel“: • Strg-c → Unterbrechen/Beenden eines aktiven Befehls (Signal INT) • Strg-d → Beenden der Shell (nur, wenn noch keine Zeichen eingetippt wurden) • ~ steht für das eigene Home-Verzeichnis • . steht für das aktuelle Verzeichnis • .. steht für das Elternverzeichnis des aktuellen Verzeichnisses Variablen können mittels name=inhalt (kein Leerzeichen!) zugewiesen und der Inhalt mit $name (z.B. echo $name) wieder ausgelesen werden. Allgemeine Befehle - Benutzer (whoami, id) Jeder muss sich am System authentifizieren, bevor er Programme ausführen kann. Alle von einem Benutzer gestarteten Prozesse laufen (fast immer) mit seinen Rechten und unter seinem Namen. whoami - Gibt aus, wer man laut System ist » $ whoami thomas id - Zeigt Benutzer- und Gruppeninformationen an. » Zeigt mehr Informationen als whoami an, zum Beispiel auch die Gruppen, in denen der Benutzer Mitglied ist. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 20 von 95 » Verwendet den aktuellen Benutzer oder den via Parameter angegebenen. » $ id uid=1515(thomas) gid=1515(thomas) groups=1515(thomas),4(adm),20(dialout),24(cdrom), 46(plugdev),116(lpadmin),118(admin),124(sambashare),129(vboxusers) $ id root uid=0(root) gid=0(root) groups=0(root) Allgemeine Befehle - Benutzer (w, who, last) w - Listet auf, wer eingeloggt ist und was derjenige macht » w <login name> schränkt die Ausgabe auf einen bestimmten Benutzer ein. » $ w 13:56:13 up 4 days, 2:19, 3 users, load USER TTY FROM LOGIN@ leitner pts/1 2001:62a:4:2f00: 13:56 sascha pts/2 2001:62a:4:2f00: 08:05 sascha pts/4 2001:62a:4:2f00: 11:00 average: 0.03, 0.06, 0.05 IDLE JCPU PCPU WHAT 0.00s 0.34s 0.00s w 5:49m 0.52s 0.47s ssh name@baka 2:46m 0.08s 0.08s -zsh who - Zeigt nur an, wer gerade eingeloggt ist » $ who leitner pts/1 2012-10-09 14:01 (2001:62a:4:2f00:8ce:4ac0:c4ee:ecb2) sascha pts/2 2012-10-09 08:05 (localhost) sascha pts/4 2012-10-09 11:00 (2001:62a:4:2f00:6ef0:49ff:fe25:fa5b) last - Zeigt die Benutzer an, die zuletzt eingeloggt waren » $ last david pts/1 2001:62a:4:2f00: Wed Oct 10 10:37 - 10:50 leitner pts/1 2001:62a:4:2f00: Tue Oct 9 14:01 - 14:02 sascha pts/3 eduroam-239-013. Mon Oct 8 12:22 - 12:50 wtmp begins Mon Oct 1 08:37:10 2012 (00:12) (00:01) (00:28) Allgemeine Befehle - Pager (less, more) less und more sind zwei sogenannte Pager, Programme, die es ermöglichen, Dateien oder die Ausgabe von anderen Programmen seitenweise darzustellen. Dabei ist less vorzuziehen, da es deutlich mehr kann als more („less is more than more“). Wichtigste Tastenkombination für less: • Bild rauf/Bild runter oder Strg-b/Strg-f → eine Bildschirmseite nach oben/unten scrollen • Pfeil rauf/Pfeil runter oder k/j → eine Zeile nach oben/unten scrollen • /MUSTER → nach dem Muster suchen, danach mit n/N zur nächsten/vorigen Fundstelle springen • q → Programm beenden Allgemeine Befehle - Sonstige (uptime, date) uptime - Zeigt an, wie lange das System läuft und wie sehr es ausgelastet ist. » Diese Auslastung wird über die letzten 1, 5 und 15 Minuten berechet und gibt an, wieviele Prozesse durchschnittlich aktiv gelaufen sind. Als Faustregel gilt, dass die Auslastung kleiner gleich der Anzahl an ausführenden CPU Threads sein sollte. » $ uptime 11:22:35 up 66 days, 23:01, 125 users, load average: 2.03, 2.00, 1.94 date - Gibt das Datum in einem konfigurierbaren Format aus Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 21 von 95 » Mit der Option -d kann man ein beliebiges Datum, nicht nur das aktuelle, formatieren. » Wichtige Formatsequenzen sind %H (Stunde 00..23), %M (Minute 00..59), %S (Sekunde 00..59), %d (Tag 01..31), %m (Monat 01..12) und %Y (Jahr) » $ date Tue Oct 9 17:41:43 CEST 2012 $ date +"%Y-%m-%d foo %H:%M:%S" 2012-10-09 foo 17:42:03 $ date -d "2010-07-02 15:30:12" +"%Y-%m-%d foo %H:%M:%S" 2010-07-02 foo 15:30:12 Allgemeine Befehle - Sonstige (script) script - Aufzeichnen aller Ein- und Ausgaben in einer Datei » Das ist vor allem für die Übungen sehr nützlich (wie auch in der Manpage angemerkt). » $ script hardcopy Script started, file is hardcopy $ whoami thomas $ exit exit Script done, file is hardcopy $ cat hardcopy Script started on Tue 09 Oct 2012 06:08:07 PM CEST $ whoami thomas $ exit exit Script done on Tue 09 Oct 2012 06:08:42 PM CEST Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Bedingungen 3.0 Seite 22 von 95 Foliensatz 4 Dateisystem Inhalt • Dateisysteme in Linux • Virtual Filesystem Switch (VFS) • Filesystem Hierarchy Standard (FHS) • Befehle für Verzeichnisse, Dateien und Dateisysteme • Zugriffsrechte auf Dateien • Harte und symbolische Links Was ist ein Dateisystem? • Ein Dateisystem kontrolliert, wie Daten auf einem Speichermedium angeordnet werden, damit diese Daten später wieder gefunden und gelesen werden können. Wichtige Dateisysteme: • • Windows: FAT, NTFS • Linux/Unix: Ext2-4, ReiserFS, XFS, JFS, ZFS, Btrfs (in Entwicklung) • Netzwerk: NFS, SMB/CIFS (vorrangig Windows), Lustre (Supercomputing) Weiters wird unter Linux auch die Abstraktionsschicht im Kernel als Dateisystem bezeichnet, genauer gesagt als virtuelles Dateisystem. Speichermedien und Partitionen 1 • Jedes Medium (USB-Stick, Festplatte, DVD) ist einfach eine Folge von Bits, hat keine Struktur; oft in Blöcke unterteilt, die nur auf einmal gelesen werden können. • Die üblichen Dateisysteme organisieren die Daten in einem hierarchischen System bestehend aus Verzeichnissen und Dateien. • Ein physisches Medium kann mit einem einzigen Dateisystem versehen sein oder mehrere Teile (Partitionen) besitzen, mit eventuell unterschiedlichen Dateisystemen. Das ist z.B. für das Aufteilen eines Systems in eine Betriebssystem-Partition und eine Daten-Partition nützlich. Es gibt unterschiedliche Varianten, Partitionen auf einem physischen Medium zu kennzeichnen. Früher wurde auf x86-Rechnern ein MBR (Master Boot Record) und die darin enthaltene Partitionstabelle verwendet, der Nachfolger nennt sich GPT (GUID Partition Table). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 23 von 95 Speichermedien und Partitionen 2 • Partitionen einer Festplatte können (als Administrator) mittels fdisk -l /dev/[sdX|hdX] angezeigt werden. Partitionen einer Platte /dev/[sdX|hdX] heißen /dev/[sdX|hdX][1,2,3,...], wobei X ein Kleinbuchstabe ist. Dies ist jedoch nur eine gängige Konvention, es könnte auch anders sein! • Ein gutes CLI-Programm für die Bearbeitung von Partitionen ist parted (es gibt auch eine GUIVariante namens gparted). • Ausgabe von fdisk für eine MBR-basierte Festplatte: $ fdisk -l /dev/sda Disk /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x000b57a2 Device Boot /dev/sda1 * /dev/sda2 /dev/sda3 /dev/sda5 Start 16065 34668270 43070326 43070328 End 34668269 43054199 312576704 312576704 Blocks 17326102+ 4192965 134753189+ 134753188+ Id 83 82 f 83 System Linux Linux swap / Solaris W95 Ext'd (LBA) Linux Speichermedien und Partitionen 3 • Ausgabe von fdisk für eine GPT-basierte Festplatte: $ fdisk -l /dev/sda Disk /dev/sda: 477 GiB, 512110190592 bytes, 1000215216 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: 7DC1C01A-22A6-4216-AA7A-68CE77861CA4 Device /dev/sda1 /dev/sda2 /dev/sda3 /dev/sda4 /dev/sda5 Start End Sectors Size Type 2048 411647 409600 200M EFI System 411648 102811647 102400000 48,8G Microsoft basic 283414528 1000214527 716800000 341,8G Microsoft basic 102813696 200469945 97656250 46,6G Microsoft basic 200469946 283413887 82943942 39,6G Microsoft basic data data data data Partition table entries are not in disk order. Speichermedien und Partitionen 4 Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 24 von 95 Linux Virtual Filesystem (VFS) Der Linux-Kernel bietet eine Abstraktion von den Spezifika eines Dateisystems und dem Medium, auf dem es liegt, das sogenannte virtuelle Dateisystem (bietet sowohl Abstraktion Richtung spezifische Dateisysteme als auch Richtung Benutzer/Applikationen). Der Pfad, unter welchem eine Datei erreicht werden kann, gibt daher keinen Aufschluss darauf, wo die Datei physisch tatsächlich liegt. • Es gibt ein einziges, zentrales Wurzelverzeichnis, das mit / bezeichnet wird und „root“ heißt. • Verzeichnisse und Unterverzeichnisse werden mit / voneinander getrennt. • Spezifische Dateisysteme eingehängt. werden unter Verzeichnisnamen in dieses virtuelle Dateisystem Nähere Information zum VFS: Kernel Hackers‘ Guide: A tour of the Linux VFS und The „Virtual File System“ in Linux Verzeichnisse • Jeder Prozess hat ein assoziiertes Arbeitsverzeichnis. Startet man einen neuen Prozess von der Shell aus, so bekommt dieser das Arbeitsverzeichnis der Shell (genauer: das Arbeitsverzeichnis wird vom Elternprozess vererbt). • Pfade können absolut oder relativ angegeben werden. Absolute Pfade beginnen immer mit dem Wurzelverzeichnis, d.h. mit /. Alles andere sind relative Pfade, welche ausgehend vom Arbeitsverzeichnis aufgelöst werden. • Die speziellen Verzeichnisnamen . und .. stehen für das aktuelle Verzeichnis bzw. das Elternverzeichnis. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 25 von 95 Dateien • GROSZ- und kleinschreibung in Dateinamen machen (in der Regel, hängt vom spezifischen Dateisystem ab) einen Unterschied. • Versteckte Dateien/Verzeichnisse beginnen mit einem Punkt (z.B. .profile) • Dateien können auch für Geräte stehen, Kerneleinstellungen, Statusinformationen, … • Dateiendungen haben i.a. keine Bedeutung, Linux orientiert sich am tatsächlichen Inhalt (Befehl file). Verzeichnisse für Prozesse, System- und Es gibt verschiedene Dateitypen (mit deren Kurzbezeichnung): • - → Reguläre Datei: Beinahe jede Datei • d → Verzeichnis: Sammlung von Dateien • c → „Character device“: Für ungepufferte, direkte Ein-/Ausgabe (z.B. Terminal) • b → „Block device“: Für gepufferte Ein-/Ausgabe (z.B. Festplatten) • p → „Named pipe“: Für Interprozesskommunikation (IPC) • s → Socket: Erlaubt auch Interprozesskommunikation, flexibler als named pipes • l → Link: Spezielle Datei, zeigt auf eine andere Datei/ein anderes Verzeichnis Filesystem Hierarchy Standard (FHS) Damit Unix-ähnliche Betriebssystem zueinander kompatibler sind und die Interoperabilität von Computerprogrammen gefördert wird, gibt es den Filesystem Hierarchy Standard. Dieser legt die Lage und Bezeichnung von wichtigen Verzeichnissen und Dateien fest. Beispiele: • /bin/ → Verzeichnis mit grundlegenden Systembefehlen für alle Benutzer • /bin/ls → Datei ls ist das Programm zum Zeigen eines Verzeichnisinhalts • /home/<BENUTZERNAME>/ → Benutzerdaten eines Benutzers • /home/Name/Dokumente/ → Dokumentenverzeichnis für den Benuzter „Name“ • /proc/cpuinfo → Virtuelle Textdatei, die Infos über die CPU(s) enthält • /media/ → Verzeichnis mit eingebundene Wechselmedien wie (DVD, USB-Stick, Digitalkamera, …) • /media/cdrom/file.odf → ODF Dokument auf einer CD-ROM Referenz: Filesystem Hierarchy Standard bzw. Manpage hier Befehle für Verzeichnisse 1 (pwd, cd) pwd - Zeigt das aktuelle Arbeitsverzeichnis an. » „print working directory“, builtin-Befehl » $ pwd /home/thomas/work/praxis_website cd - Wechselt das aktuelle Verzeichnis. » „change directory“, builtin-Befehl; erster Parameter ist Zielverzeichnis » Ohne Parameter nach $HOME (Umgebungsvariable) » Ist der Parameter -, wechselt man in das letzte Verzeichnis. Tipp: Besser als cd - sind popd und pushd (builtin-Befehle). » $ cd /; pwd / Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 26 von 95 $ cd /home/thomas/work/praxis_website $ cd; pwd /home/thomas Befehle für Verzeichnisse 2 (ls) ls - Listet Verzeichnisinhalte auf. » „listing“, listet alle Dateien im aktuellen oder angegebenen Verzeichnis auf » Viele Optionen, z.B.: -l → langes Format‘; -h → Größen sinnvoller ausgeben; -a → alles, auch versteckte Dateien, anzeigen; -t → nach Zeit sortieren; -d → Verzeichnis statt Inhalte » $ ls -lt total 36 -rw-rw-r-drwxrwxr-x drwxr-xr-x drwxrwxr-x drwxrwxr-x drwxrwxr-x -rw-rw-r--rw-rw-r-drwxrwxr-x 1 2 7 2 2 7 1 1 4 thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas thomas 3694 4096 4096 4096 4096 4096 147 245 4096 Oct 10 20:01 unterlagen.page Oct 9 17:23 scripts Oct 8 16:19 src Oct 8 16:14 ext Oct 2 12:56 tmp Oct 2 12:56 out Sep 30 12:18 webgen.config Sep 29 09:05 notizen.org Mar 5 2012 out_old » Hinweis: Die Bedeutung der ersten vier Spalten wird später bei „Benutzer, Gruppen, Rechte“ erklärt. Ab der 5. Spalte sieht man die Dateigröße, das Datum der letzten Modifikation und den Namen. Befehle für Verzeichnisse 3 (mkdir, rmdir) mkdir - Erstellt ein oder mehrere Verzeichnisse. » „make directory“, Parameter sind die zu erstellenden Verzeichnisse » Mit der Option -p werden auch Elternverzeichnisse erstellt » $ ls example/test ls: cannot access example/test: No such file or directory $ mkdir -p example/test $ ls example test rmdir - Löscht ein oder mehrere Verzeichnisse. » „remove directory“; Parameter sind die zu löschenden Verzeichnisse » Funktioniert nur, wenn das Verzeichnis leer ist! » Mit der Option -p werden auch (leere) Elternverzeichnisse gelöscht » $ rmdir example rmdir: failed to remove `example': Directory not empty $ rmdir -p example/test $ ls example ls: cannot access example: No such file or directory Befehle für Dateien 1 (touch, cat, tac) touch - Legt eine Datei an. » Falls die Datei schon existiert, wird die Zugriffs- und Modifikationszeit auf die aktuelle Zeit gesetzt. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 27 von 95 » -t [[CC]YY]MMDDhhmm[.ss] gibt das zu benutzende Datum an. » $ touch file1 $ ls -l file1 -rw-rw-r-- 1 thomas thomas 0 Oct 11 10:37 file1 $ touch -t 201001010001 file1 $ ls -l file1 -rw-rw-r-- 1 thomas thomas 0 Jan 1 2010 file1 cat - Gibt den Inhalt einer oder mehrerer Dateien aus. » „concatenate“; Parameter sind die Dateien. » tac macht das gleiche, nur rückwärts (z.B. für die Ausgabe von Log-Dateien) » $ echo -e "hallo\ndu" > file1 $ cat file1 hallo du $ tac file1 du hallo Befehle für Dateien 2 (mv, cp, rm) mv - Verschiebt eine Datei. » „move“, wird auch zum Umbennen von Dateien verwendet. » Hier wird entweder nur der Pfad geändert (im selben Dateisystem, sehr schnell), oder eine Kopie mit anschließendem Löschen gemacht. » $ mv file1 file2 cp - Kopiert eine oder mehrere Dateien. » „copy“, bei mehr als zwei Parametern muss der letzte ein Verzeichnis sein. » Der Inhalt einer Datei wird in eine neue, unabhängige Datei geschrieben. » Nützliche Optionen: -a → archivieren (Attribute identisch), -r → rekursiv kopieren, -i → beim Überschreiben nachfragen » $ cp -a file2 file1 rm - Löscht eine oder mehrere Dateien. » „remove“, Parameter sind die zu löschenden Dateien. » Der Eintrag im Verzeichnis wird gelöscht. Die Daten könnten weiterhin erreichbar sein, wenn mehrere Dateinamen auf dieselbe Datei verweisen (harte Links). » $ rm file1 file2 Befehle für Dateien 3 (stat, file) stat - Liefert Details zu einer Datei. » $ stat file1 File: `file1' Size: 9 Blocks: 8 IO Block: 4096 regular file Device: 806h/2054d Inode: 1485015 Links: 1 Access: (0664/-rw-rw-r--) Uid: ( 1515/ thomas) Gid: ( 1515/ thomas) Access: 2012-10-11 10:41:25.635363400 +0200 Modify: 2012-10-11 10:41:24.539366907 +0200 # Zeitstempel Änderung Inhalt Change: 2012-10-11 10:41:24.539366907 +0200 # Zeitstempel Änderung Metadaten Birth: file - Erkennt Dateiformate. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 28 von 95 » Das sind nicht die Dateitypen von Linux! » Das Programm benutzt mehrere Algorithmen, um das Dateiformat einer Datei zu erkennen. In der Regel ist die Ausgabe korrekt. » $ file tutorial.html tutorial.html: HTML document text $ file 20090708.txt 20090708.txt: ASCII text, with CRLF, CR, LF line terminators, with overstriking $ file dokument1 dokument1: PDF document, version 1.4 Befehle für Dateien 4 (split) split -Spaltet eine Datei in Teile auf. » Die Dateien können mit cat wieder zusammengefügt werden. » Syntax: split [Optionen] Datei [Präfix] (Präfix ist standardmäßig ‚x‘) » Optionen: -l N → N Zeilen pro Ausgabedatei, -b N → N Bytes pro Ausgabedatei, -n N → N Ausgabedateien erzeugen, -d → numerischen Suffix verwenden » $ split -n 3 -d /etc/passwd passwd $ split -l 10 /etc/passwd passwd $ ls -l passwd* -rw-r--r-- 1 thomas thomas 823 Dez -rw-r--r-- 1 thomas thomas 823 Dez -rw-r--r-- 1 thomas thomas 823 Dez -rw-r--r-- 1 thomas thomas 344 Dez -rw-r--r-- 1 thomas thomas 459 Dez -rw-r--r-- 1 thomas thomas 642 Dez -rw-r--r-- 1 thomas thomas 575 Dez -rw-r--r-- 1 thomas thomas 449 Dez $ cat passwdac | wc -l 10 7 7 7 7 7 7 7 7 09:57 09:57 09:57 09:57 09:57 09:57 09:57 09:57 passwd00 passwd01 passwd02 passwdaa passwdab passwdac passwdad passwdae Sonstige Befehle (find) find - Sucht nach Dateien in einem Verzeichnisbaum. » Sehr mächtiges Werkzeug, sollte man sich gut ansehen! » Syntax: find [OPTIONEN] [PFAD...] [AUSDRUCK] » Ein Ausdruck besteht aus Optionen, Tests und Aktionen, separiert mit Operatoren: • • Optionen (beeinflussen die gesamte Suche): • -mindepth → minimale Suchtiefe • -maxdepth → maximale Suchtiefe. Tests (selektieren Dateien): • -name PATTERN → Dateien, deren Namen dem Muster entsprechen. • -iname PATTERN → Wie -name, aber Groß-/Kleinschreibung egal. • -type TYP → Dateien eines bestimmten Linux-Dateityps. • -perm [-/]MODE → Dateien nach Zugriffsrechten filtern. • -size N → Dateien nach Größe filtern. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 29 von 95 Sonstige Befehle (find) find… » • • Aktionen (machen etwas mit gefundenen Dateien): • -print → Namen der Datei ausgeben, danach Zeilenumbruch. • -print0 → Namen der Datei ausgeben, danach Null-Zeichen. • -delete → Datei löschen. • -exec BEFEHL ; → Befehl auf Datei ausführen ({} wird mit Dateiname ersetzt) Operatoren: • -or/-not/-and → Logische Verknüpfung (default ist -and). • ( AUSDRUCK ) → Gruppieren von Anweisungen. » Von der Shell verwendete Zeichen (z.B. (, ), ;, …) müssen mit dem Maskierungszeichen („escape character“) \ versehen werden, damit die Shell sie nicht interpretiert. Verwenden von Dateisystemen 1 • Wie erwähnt, müssen Dateisysteme in das VFS eingehängt („gemountet“) werden, damit sie verwendet werden können. Wenn ein Dateisystem nicht mehr gebraucht wird, kann es ausgehängt werden. • Ein Dateisystem kann unter einem beliebigen Verzeichnis (dem Mountpoint) eingehängt werden. Die vorher unter diesem Verzeichnis verfügbaren Dateien und Verzeichnisse sind dann solange nicht mehr erreichbar, bis das Dateisystem wieder ausgehängt wird. Achtung: Neue Dateisysteme nicht unter Systemverzeichnisse (z.B. /bin/, /etc/, …) einhängen! • Um ein Dateisystem einzuhängen braucht man das Gerät, auf dem es liegt (z.B. das DVD-Gerät oder eine Festplattenpartition) und ein Verzeichnis. Falls der Typ des Dateisystems (z.B. FAT, EXT4, …) nicht erkannt wird, muss auch diesen zusätzlich angeben. • Bei aktuellen Linux-Distributionen werden Wechselmedien wie USB-Sticks und -Festplatten sowie DVDs automatisch erkannt und, falls möglich, eingehängt (in automatisch erstellten Verzeichnissen unter /media/). Verwenden von Dateisystemen 2 • Für jeden Typ von Dateisystem werden Programme zum Erstellen bzw. Bearbeiten zur Verfügung gestellt. Z.B. EXT2-4: mke2fs (auch z.B. als mkfs.ext4 benutzbar), e2fsck, debugfs, dumpe2fs. • Die Funktionalität der Programme variert aber stark, weil nicht alle Dateisysteme gleich gut unterstützt werden bzw. sie sich in den Features unterscheiden. Befehle für Dateisysteme 1 (mount) mount - Hängt Dateisysteme in das VFS ein und listet sie auf. » Ohne Parameter werden die eingebundenen Dateisysteme aufgelistet (Hinweis: mit mount | column -t bekommt man eine schönere Ausgabe) Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 30 von 95 » Üblicherweise kann nur der Administrator beliebige Dateisysteme einhängen. » $ mount /dev/sda1 on / type ext3 (rw,errors=remount-ro) proc on /proc type proc (rw,noexec,nosuid,nodev) sysfs on /sys type sysfs (rw,noexec,nosuid,nodev) udev on /dev type devtmpfs (rw,mode=0755) none on /run/shm type tmpfs (rw,nosuid,nodev) /dev/sda5 on /scratch type ext3 (rw,nosuid) rpc_pipefs on /run/rpc_pipefs type rpc_pipefs (rw) //share2/profiles on /profiles type cifs (rw) Befehle für Dateisysteme 2 (mount) mount… » $ mount | column -t /dev/sda1 on proc on sysfs on udev on none on /dev/sda5 on rpc_pipefs on //share2/profiles on / /proc /sys /dev /run/shm /scratch /run/rpc_pipefs /profiles type type type type type type type type ext3 proc sysfs devtmpfs tmpfs ext3 rpc_pipefs cifs (rw,errors=remount-ro) (rw,noexec,nosuid,nodev) (rw,noexec,nosuid,nodev) (rw,mode=0755) (rw,nosuid,nodev) (rw,nosuid) (rw) (rw) » In der obigen Ausgabe sieht man zum Beispiel, dass das EXT3-Dateisystem auf dem Gerät /dev/sda1 (also der ersten Partition auf der ersten Festplatte) unter /, dem Wurzelverzeichnis eingehängt ist. Weiters sieht man mehrere „virtuelle“ Dateisysteme (wie z.B. sysfs) und auch ein Netzwerkdateisystem (CIFS). Befehle für Dateisysteme 3 (mount, umount) mount… » Im folgenden Beispiel wird ein NTFS-Dateisystem mit einigen Optionen unter /media/windows eingebunden. » $ mount -o ro,noexec -t ntfs /dev/sdb1 /media/windows umount - Hängt Dateisysteme aus dem VFS aus. » Als Parameter sind ein oder mehrere Mountpoints anzugeben. » Wenn das Dateisystem noch in Verwendung ist, kann es nicht ausgehängt werden! » $ umount /media/windows Befehle für Dateisysteme 4 (df) df - Zeigt die Festplattenbelegung an. » „disk free“, Option -h („human readable“) nützlich. » Eine Zeile pro eingehängtem Dateisystem. » $ df -h Filesystem /dev/sda1 udev tmpfs none none /dev/sda6 Size 14G 3.8G 1.6G 5.0M 3.9G 79G Used Avail Use% Mounted on 8.1G 5.0G 62% / 4.0K 3.8G 1% /dev 1.1M 1.6G 1% /run 0 5.0M 0% /run/lock 2.3M 3.8G 1% /run/shm 72G 2.3G 97% /home Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 31 von 95 /dev/sda4 9.6G 273M 8.9G 3% /data Befehle für Dateisysteme 5 (du) du - Zeigt den Platzverbrauch von Dateien/Verzeichnissen an. » „disk usage“, als Parameter können Dateien/Verzeichnisse angegeben werden » Standardeinheit der Größen ist 1024 Byte » Verzeichnisse werden rekursiv behandelt » Nützliche Optionen: --apparent-size → tatsächliche Größe anzeigen, -h → Größen sinnvoller ausgeben, -s → nur die Zusammenfassung, -c → Gesamtgröße ausgeben » $ du -sc src tmp 1176 src 168 tmp 1344 total $ du -sch src tmp 1.2M src 168K tmp 1.4M total $ du --apparent-size -sch src tmp 988K src 159K tmp 1.2M total Dateibesitzer und Zugriffsrechte 1 • Jede Datei gehört einem Benutzer (dem Besitzer) und einer Gruppe. • Jedem Benutzer/jeder Gruppe ist eine eindeutige Nummer zugeordnet: die UID („User-ID“) dem Benutzer und die GID („Group-ID“) der Gruppe. Im Dateisystem selbst sind nur die UID/GID gespeichert! • Diese Zuordnung kann auf jedem Linux-System anders sein (d.h. ein Benutzer auf System A muss nicht die selbe UID haben wie der gleiche Benutzer auf System B). • Zusätzlich sind für jede Datei Zugriffsrechte definiert: Ein Set für den Besitzer (symbolisch u), eines für die Gruppe (symbolisch g) und eines für den Rest (symbolisch o, das sind alle außer dem Besitzer und den Gruppenmitgliedern). Es gibt drei verschiedene Arten von Zugriffsrechten: • Lesen (symbolisch: r, numerisch: 4) • Schreiben (symbolisch: w, numerisch: 2) • Ausführen/Verzeichnis öffnen (symbolisch: x, numerisch: 1) Manche Dateisysteme bieten darüber hinaus zusätzliche Dateiattribute an (z.B. EXT2/3/4-Attribute, POSIX ACLs). Dateibesitzer und Zugriffsrechte 2 • Die Darstellung der Zugriffsrechte erfolgt immer in der Reihenfolge Lesen, Schreiben und Ausführen für den Besitzer, die Gruppe und den Rest. • Falls ein Zugriffsrecht nicht gesetzt ist, wird in der symbolischen Schreibweise ein - an dessen Stelle geschrieben. Zum Beispiel bedeutet rwxr-xr--, dass der Besitzer alle Rechte hat, die Gruppe darf Lesen und Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 32 von 95 Ausführen und der Rest darf nur Lesen. • Die numerische Schreibweise bedient sich dem Oktalsystem, d.h. den Ziffern von 0 bis 7. Die Werte der gesetzten Rechte werden dabei addiert. Berechnung: r → 4 = 2^2, w → 2 = 2^1, x → 1 = 2^0 In der Oktalschreibweise würden die Zugriffsrechte beim obigen Beispiel 754 sein. Besitzer Gruppe Rest symbolisch rwx r-x r-- Bits 111 101 100 Zugriffsrechte bei Verzeichnissen • • Die Zugriffsrechte werden für Verzeichnisse wie folgt interpretiert: • Lesen bedeutet, dass der Verzeichnisinhalt (i.e. die Dateinamen) angezeigt werden darf. • Schreiben bedeutet, dass der Verzeichnisinhalt geändert werden darf (i.e. Einträge dürfen angelegt bzw. gelöscht werden) • Ausführen bedeutet, dass auf Dateien im Verzeichnis generell zugegriffen werden darf. Ob man die jeweiligen Dateien dann lesen/schreiben/ausführen darf, hängt wiederum von den Zugriffsrechten der Dateien selbst ab. Hat man auf ein Verzeichnis das Lese-, aber nicht das Ausführrecht, so kann man zwar den Verzeichnisinhalt ausgeben, aber auf keine Dateien zugreifen. Im umgekehrten Fall (Ausführ-, aber kein Leserecht) kann man sich den Verzeichnisinhalt nicht anzeigen lassen, könnte aber auf bekannte Dateien zugreifen. Zugriffsrechte - SUID/SGID/Sticky-Bit 1 Zusätzlich zu den genannten Zugriffsrechten gibt es noch drei spezielle Rechte: • „Set-User-ID“ bzw. SUID-Bit (symbolisch: s, numerisch: 4) Eine ausführbare Datei wird mit den Rechten des Besitzers ausgeführt, nicht mit den Rechten des aufrufenden Benutzers. • „Set-Group-ID“ bzw. SGID-Bit (symbolisch: s, numerisch: 2) Eine ausführbare Datei wird mit den Rechten der zugehörigen Gruppe ausgeführt, nicht mit den Rechten der primären Gruppe des aufrufenden Benutzers. Auf ein Verzeichnis gesetzt, erhalten neu angelegte Dateien nicht die primäre Gruppe des anlegenden Benutzers, sondern die Gruppe des Verzeichnisses. • „Restricted Deletion Flag“ oder „Sticky-Bit“ (symbolisch: t, numerisch: 1) Verbietet in einem Verzeichnis einem unpriviligierten Benutzer das Löschen von Dateien/Verzeichnissen, wenn er nicht deren Besitzer ist. Wird üblicherweise z.B. auf das /tmp -Verzeichnis gesetzt. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 33 von 95 Auf eine Datei angewandt, macht es jetzt nichts mehr. Früher würde das Programm in den SwapSpeicher geschrieben, damit es bei mehrmaligem Aufruf schneller ausgeführt wird. Zugriffsrechte - SUID/SGID/Sticky-Bit 2 • In der symbolischen Schreibweise werden diese Rechte wie folgt dargestellt: Ausführen SUID-Bit Besitzer SGID-Bit Gruppe Sticky-Bit Rest x - x - x - x x s s s s t t - s S s S t T Angewandt auf das obige Beispiel ergibt das in der symbolischen Schreibweise rwsr-xr-T, falls die SUID- und Sticky-Bits gesetzt sind. • In der Oktalschreibweise werden die Werte der drei Rechte addiert und als vierte Ziffer den anderen dreien vorangestellt, z.B. ergibt das 6754 für das obige Beispiel, falls die SUID- und SGID-Bits gesetzt sind. Siehe auch info coreutils 'Mode Structure' Dateibesitzer und Zugriffsrechte - Anzeigen Den Besitzer, die Gruppe sowie die zugehörigen Rechte von Dateien kann man sich mittels ls -l anzeigen lassen: $ ls -ltd * -rw-rw-r-- 1 thomas thomas 3694 Oct 10 20:01 unterlagen.page drwxrwxr-x 2 thomas thomas 4096 Oct 9 17:23 scripts drwxr-xr-x 7 thomas thomas 4096 Oct 8 16:19 src drwxrwxr-x 2 thomas thomas 4096 Oct 8 16:14 ext drwxrwxrwt 2 thomas thomas 4096 Oct 2 12:56 tmp drwxrwxr-x 7 thomas thomas 4096 Oct 2 12:56 out -rw-rw-r-- 1 thomas thomas 147 Sep 30 12:18 webgen.config -rw-rw-r-- 1 thomas thomas 245 Sep 29 09:05 notizen.org $ ls -l /usr/bin/passwd -rwsr-xr-x 1 root root 42824 Apr 9 2012 /usr/bin/passwd • 1. Spalte: Linux-Dateityp (erstes Zeichen) und Zugriffsrechte. • 2. Spalte: Link-Zähler (wird später bei „Harte und symbolische Links“ erklärt) • 3. Spalte: Besitzer • 4. Spalte: Gruppe Die Rechte können mit chmod geändert werden, die Gruppe mit chgrp und der Besitzer mit chown. Dateibesitzer und Zugriffsrechte - Befehle (chmod) chmod - Ändert die Zugriffsrechte. » Zwei Aufrufvarianten: • chmod [OPTION]... OKTAL DATEI...: Mittels Oktalschreibweise. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 34 von 95 • chmod [OPTION]... [ugoa...][+-=][rwxXst] DATEI...: Mittels symbolischer Schreibweise. • u → Besitzer, g → Gruppe, o → Rest, a → Alle • + → hinzufügen, - → löschen, = → exakt auf die Rechte setzen • rwxst → klar (siehe oben), X → x setzen, falls auf ein Verzeichnis angewandt oder irgendein Benutzer schon das Recht hat » Die Option -R erlaubt das rekursive Setzen der Zugriffsrechte. » $ chmod a=rwx datei; ls -l datei -rwxrwxrwx 1 thomas thomas 0 Oct 17 $ chmod o-rwx datei; ls -l datei -rwxrwx--- 1 thomas thomas 0 Oct 17 $ chmod a-x,o+r datei; ls -l datei -rw-rw-r-- 1 thomas thomas 0 Oct 17 $ chmod 6744 datei; ls -l datei -rwsr-Sr-- 1 thomas thomas 0 Oct 17 19:15 datei 19:15 datei 19:15 datei 19:15 datei Dateibesitzer und Zugriffsrechte - Befehle (chown, chgrp) chown - Ändert den Besitzer (und optional auch die Gruppe) einer Datei. » Syntax: chown [OPTION]... [BESITZER][:[GROUP]] DATEI... » Aus Sicherheitsgründen darf nur der Administrator darf den Besitzer ändern! » Option -R für rekursives Ändern. » $ chown root datei chown: changing ownership of `datei': Operation not permitted $ sudo chown root datei; ls -l -rw-rw-r-- 1 root thomas 0 Oct 17 19:29 datei $ sudo chown thomas:adm datei; ls -l -rw-rw-r-- 1 thomas adm 0 Oct 17 19:29 datei chgrp - Ändert die Gruppe einer Datei. » Syntax: chgrp [OPTION]... GRUPPE DATEI... » Option -R für rekursives Ändern. » $ sudo chgrp staff datei; ls -l -rw-rw-r-- 1 thomas staff 0 Oct 17 19:29 datei Dateibesitzer und Zugriffsrechte - Befehle (umask) umask - Zeigt und ändert die Maske der Standarddateiberechtigungen. » Ist ein builtin-Befehl! » Wird für die Zugriffsrechte benutzt, wenn eine neue Datei angelegt wird. » Die Maske wird von den Zugriffsrechten (normalerweise 666 für Dateien und 777 für Verzeichnisse) abgezogen! » Die Option -S gibt die Maske in symbolische Schreibweise aus. » $ umask 0002 $ umask -S u=rwx,g=rwx,o=rx $ umask 022 $ umask 0022 $ umask u=rwx,g=rx,o= Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 35 von 95 $ umask 0027 $ touch file; ls -l file; rm -f file -rw-r----- 1 thomas thomas 0 Oct 17 20:04 file Harte und symbolische Links • Alle Informationen (Besitzer, Gruppe, Zugriffsrechte, Anzahl und Speicherort der Datenblöcke, …) zu einer Datei, bis auf den Namen, werden im VFS in einem sogenannten „inode“ („index node“) verwaltet. D.h. einer Datei entspricht immer ein inode. • Zugriff auf eine Datei erhält man, indem man in einem Verzeichnis einen Namen mit dem inode der Datei verbindet. Dieses Zuordnen eines Namens zu einer Datei bezeichnet man als „linken“ und so einen Eintrag als harten Link (oder Hardlink). Harte Links sind auf Grund der engen Verbundheit mit dem Dateisystem immer nur innerhalb eines physischen Dateisystems möglich! Siehe z.B. Dateiformat von Verzeichnissen im EXT4-Dateisystem • Es ist möglich, mehrere harte Links auf die selbe Datei zu setzen, auch in unterschiedlichen Verzeichnissen des selben Dateisystems. Aber man kann nur einen harten Link auf ein Verzeichnis setzen! Harte und symbolische Links 2 • Neben den harten Links gibt es auch noch die sogenannten symbolischen Links (oder Softlinks). • Im Unterschied zu harten Links verweisen symbolische Links nur auf eine andere Datei/ein anderes Verzeichnis. Das bedeutet, das beim Anlegen eines symbolischen Links eine neue Datei erstellt wird, dessen Inhalt der Pfadname auf die verwiesene Datei ist (kurze Pfadnamen – derzeit bis zu 60 Bytes – werden aus Platz/Geschwindigkeitsgründen direkt im inode gespeichert). Dieser Pfadname kann absolut (vom Wurzelverzeichnis ausgehend) oder relative (zum Verzeichnis, in dem der symbolische Link liegt) sein. Wenn das Ziel des symbolischen Links nicht (mehr) existiert, dann verweist der Link „ins Leere“. Man spricht dann von einem „dangling or broken link“. • Symbolische Links sind im Gegensatz dateisystemübergreifend erlaubt. zu harten Links auch auf Verzeichnissen und Harte und symbolische Links - Befehle (ln) ln - Legt harte oder symbolische Links an. » Meistgenutzte Syntax: ln [-s] ZIEL [LINK_NAME] » Die Option -s erlaubt das Anlegen von symbolischen statt harten Links. » $ touch datei; ln datei hardlink; ln -s datei softlink; ls -il * 1485109 -rw-rw-r-- 2 thomas thomas 0 Oct 18 07:51 datei 1485109 -rw-rw-r-- 2 thomas thomas 0 Oct 18 07:51 hardlink 1485447 lrwxrwxrwx 1 thomas thomas 5 Oct 18 07:52 softlink -> datei $ echo inhalt > datei; cat datei hardlink softlink Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 36 von 95 inhalt inhalt inhalt $ rm datei; cat hardlink softlink inhalt cat: softlink: No such file or directory $ cp hardlink datei; ln softlink softlink.2; ls -l * 1484535 -rw-rw-r-- 1 thomas thomas 7 Oct 18 07:53 datei 1485109 -rw-rw-r-- 1 thomas thomas 7 Oct 18 07:53 hardlink 1485447 lrwxrwxrwx 2 thomas thomas 5 Oct 18 07:52 softlink -> datei 1485447 lrwxrwxrwx 2 thomas thomas 5 Oct 18 07:52 softlink.2 -> datei Mit Hilfe von cp -l kann man auch massenhaft harte Links erzeugen. Harte und symbolische Links - Befehle (readlink) readlink - Liest den Verweise eines symbolischen Links aus. » Mit der Option -f wird der kanonische Dateiname (vollständiger Pfad mit aufgelösten symbolischen Links) zurückgegeben. » $ readlink datei $ readlink -f datei /home/thomas/work/praxis_website/tmp/link/datei $ readlink softlink datei $ readlink -f softlink /home/thomas/work/praxis_website/tmp/link/datei Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Bedingungen 3.0 Seite 37 von 95 Foliensatz 5 Arbeiten mit der Bash Inhalt • Wie die Bash eine Eingabe verarbeitet • Befehle miteinander kombinieren • Ein- und Ausgabe umleiten • Auswertungsunterdrückung • Expansionen • Wichtige Hilfsprogramme Wie die Bash eine Eingabe verarbeitet • Der eingegebene Text wird in Wörter (auch Token genannt) durch die Meta-Zeichen | & ; ( ) < > space tab aufgeteilt, die Auswertungsunterdrückung wird dabei beachtet. • Die Wörter werden analysiert und zu einfachen bzw. komplexen Befehlen zusammengefasst. • Die verschiedenen Expansionen werden der Reihe nach durchgeführt. • Ein- und Ausgabeumleitungen werden angewandt. • Die einzelnen Befehle werden ausgeführt. Auf die einzelnen Teile dieser Verarbeitungsschritte werden wir jetzt näher eingehen. Bash Shortcuts • „Strg-l“ → Bildschirm löschen und Cursor in die erste Zeile setzen • „Strg-k“ → Vom Cursor bis zum Zeilenende alles ausschneiden • „Strg-y“ → Letzten ausgeschnitten Text einfügen • „Strg-_“ → Letzte Eingabe rückgängig machen • „Strg-x Strg-e“ → Aktuelle Befehlszeile im Editor öffnen und danach ausführen • „Alt-Strg-e“ → Eine Befehlszeile wie die Bash expandieren • „Alt-.“, „Alt-_“ → Letztes Wort der letzten Befehlszeile einfügen • „Strg-x~“ → Benutzernamenvervollständigung anzeigen Mehr Shortcuts findet man unter der Überschrift „READLINE“ in man bash. Auswertungsunterdrückung (Quoting) • Die Auswertungsunterdrückung (Quoting) erlaubt es, die spezielle Bedeutung von Zeichen oder Wörtern zu unterdrücken. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 38 von 95 Spezielle Bedeutung haben z.B. die Zeichen | & ; ( ) < > space tab und Wörter der Form $WORT. • Drei Möglichkeiten: • Maskierungszeichen \: Das Zeichen nach dem Maskierungszeichen behält seine ursprüngliche Bedeutung bei. Beispiele: • \\ → Zeichen \ • \n → Zeilenumbruch • \r → Cursor zurück zum Zeilenanfang bewegen • \ → Leerzeichen (z.B. in Dateinamen) • '...': Starkes Quoting; alles innerhalb von einfachen Anführungszeichen bleibt genau so erhalten. • "...": Schwaches Quoting; die Zeichen $, `, ! und \ (nur für $ ` ! ") behalten ihre spezielle Bedeutung, alle anderen Zeichen bleiben erhalten. Auswertungsunterdrückung - Beispiele $ VAR=hallo $ echo "$VAR\n$VAR" hallo\nhallo $ echo -e $VAR\\n$VAR hallo hallo $ echo '$VAR' $VAR $ echo -e "Hallo\rHe" Hello Befehle kombinieren • Ein einfacher Befehl besteht aus optionalen Variablenzuweisungen, Ein- und Ausgabeumleitungen und Wörtern. Das erste Wort gibt den auszuführenden Befehl an, die restlichen sind die Argumente. Das sieht z.B. so aus: $ X=Hallo ruby -e 'puts ENV["X"]' >test Dabei ist X=Hallo eine Variablenzuweisung, ruby der auszuführende Befehl, -e und puts ENV["X"] die Argumente und >test eine Ausgabeumleitung. • Die bash-Shell erlaubt es, mehrere einfache Befehle auf unterschiedliche Arten miteinander zu komplexen Befehlen zu kombinieren: • Pipelines (umleiten von Ausgabe und Eingabe) • Listen (verbinden von Befehlen mit Operatoren) • Verbundbefehle • Am häufigsten werden bei der „normalen“ Arbeit mit der Shell wahrscheinlich die Pipelines verwendet. • Der Rückgabewert der Befehle spielt bei deren Kombination meist eine Rolle. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 39 von 95 Pipelines • Pipelines verbinden die Standardausgabe (stdout) eines Befehls mit der Standardeingabe (stdin) eines anderen Befehls. • Das Konzept geht auf die ersten Anfänge der elektronischen Datenverarbeitung zurück und wurde von Douglas McIlroy erfunden. • Die Ausgabe wird unmittelbar weitergegeben und das konkrete Verhalten hängt von den jeweiligen Befehlen ab. Jeder Befehl wird als eigener Prozess ausgeführt, also in einer Subshell. • Die Syntax für eine Pipeline sieht so aus: [ ! ] command [ [|⎪|&] command2 ... ] Also ein oder mehrere Befehle, getrennt durch | (genannt Pipe, umleiten der Ausgabe) oder |& (umleiten der Fehlerausgabe). Der Rückgabewert der Pipeline ist der Rückgabewert des letzten Befehls. Falls am Anfang der Pipeline ein Rufzeichen steht, wird der Rückgabewert logisch negiert. Pipelines - Beispiele • Alle installierten Benutzer-Befehle auflisten: $ man -k . | grep '(1)' | less Hier wird • • nach allen Manpage-Einträgen gesucht, welche mindestens ein beliebiges Zeichen enthalten (man -k .); • danach werden mit grep '(1)' die Zeilen herausgefiltert, die die Zeichenkette ‚(1)‘ beinhalten (also jene Befehle, die in der Manpage-Gruppe 1 sind); • und zum Schluss wird das Ergebnis mit dem Pager less seitenweise dargestellt. Zählen der Dateien in einem Verzeichnis: $ ls -1 /usr/include/ | wc -l 231 Listen • Eine Liste ist eine Folge einer oder mehrerer Pipelines, separiert durch einen der Operatoren ; & && || und optional terminiert durch ;, & oder einem Zeilenumbruch. Pipeline1 [ [ ; ⎪ & ⎪ && ⎪ || ] Pipeline2 ... ] [ ; | & ] Die Operatoren && und || haben gleichen Vorrang, gefolgt von ; und &, die auch gleichen Vorrang haben. • Operator ;: Die Befehle werden hintereinander ausgeführt. Der Rückgabewert ist der Rückgabewert des letzten Befehls. • Operator &: Der vorangegangene Befehl wird im „Hintergrund“ ausgeführt, der Rückgabewert ist 0. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 40 von 95 • Operator &&: Befehl2 wird nur dann ausgeführt, wenn Befehl1 den Rückgabewert 0 hat. Der Rückgabewert ist der Rückgabewert des letzten, ausgeführten Befehls. • Operator ||: Befehl2 wird nur dann ausgeführt, wenn Befehl1 einen Rückgabewert ungleich 0 hat. Der Rückgabewert ist der Rückgabewert des letzten, ausgeführten Befehls. Listen - Beispiele • Verzeichnis erstellen und sofort etwas hineinkopieren, falls das Erstellen erfolgreich war: $ mkdir foo && cp source foo/ • Unter Ubuntu die Paketlisten aktualisieren und alle neuen Pakete einspielen: $ apt-get update && apt-get upgrade • Eine Datei löschen und bei einem Fehler eine entsprechende Nachricht ausgeben: $ rm datei || echo Das Löschen ist fehlgeschlagen. • Kombination mehrerer Operatoren: $ echo sofort | cut -b 3-; sleep 1 && echo zum schluss & echo in der mitte fort [1] 15291 in der mitte $ zum schluss Verbundbefehle • (Liste): Die Liste wird in einem eigenen Shell-Prozess ausgeführt (d.h. unter anderem, dass gesetzte Variablen die aktuelle Shell nicht beeinflussen). Der Rückgabewert ist der Rückgabewert der Liste. • { Liste; }: Die Liste wird in der aktuellen Shell ausgeführt. Wichtig: Die Liste muss mit ;, & oder einem Zeilenumbruch terminiert werden und die geschwungenen Klammern müssen mit Leerzeichen von der Liste separiert sein! Der Rückgabewert ist der Rückgabewert der Liste. • ((Ausdruck)): Der Ausdruck stellt eine Rechnung dar und diese Rechnung wird von der Bash ausgeführt. Wenn das Ergebnis der Rechnung 0 ist, ist der Rückgabewert 1 und sonst 0. Mehr Informationen in der Manpage von bash unter „ARITHMETIC EVALUATION“. • [[ Ausdruck ]]: Der logische Ausdruck (ein Test) wird evaluiert und der Rückgabewert ist das Ergebnis der Evaluation. Mehr Informationen in der Manpage von bash unter „CONDITIONAL EXPRESSION“. Verbundbefehle - Beispiele • Liste in eigenem Shell-Prozess: $ X=5; (echo -n $X; X=7; echo -n $X); echo $X 575 • Liste im aktuellen Shell-Prozess: $ X=5; {echo -n $X; X=7; echo -n $X}; echo $X Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 41 von 95 {echo: command not found 7}7 $ X=5; { echo -n $X; X=7; echo -n $X; }; echo $X 577 • Rückgabewert von Berechnungen verwenden: $ X=5 && (( X - 5 == 0 )) && echo yes || echo no yes $ X=6 && (( X - 5 == 0 )) && echo yes || echo no no • Rückgabewert von logischen Ausdrücken verwenden: $ X=hallo && [[ $X = hallo ]] && echo yes || echo no yes $ X=hallo && [[ $X = 'nicht hallo' ]] && echo yes || echo no no Expansionen • Die bash unterstützt mehrere Arten von Expansionen – wir werden einen kurzen Blick auf die Klammernexpansion, die Pfadexpansion, die Variablenexpansion und die Befehlssubstitution werfen. Abschließend werden wir auch noch die History-Expansion betrachten. • Diese Expansionen werden vor dem Ausführen der Befehle, aber nach der Unterteilung in einfache und komplexe Befehle, in der folgenden vordefinierten Reihenfolge durchgeführt: • Klammernexpansion, • Variablenexpansion, • Befehlssubstitution und • Pfadexpansion Die Ergebnisse der Variablenexpansion und Befehlssubstitution werden nochmal in Wörter unterteilt, wobei als Worttrennzeichen der Inhalt der Variable $IFS benutzt wird. • Mehr zu diesem Thema findet man unter „EXPANSION“ in man bash. Klammernexpansion • Die Klammernexpansion (brace expansion) erlaubt das Generieren beliebiger Zeichenfolgen. Dabei werden keine speziellen Zeichen anderer Expansionen interpretiert, der Mechanismus basiert rein auf Textbasis. • Ein Muster für die Klammernexpansion besteht aus einem optionalen Präfix, einer Menge von entweder zwei oder mehr Zeichenfolgen, die mit Beistrichen getrennt in geschwungenen Klammern stehen, oder einer Sequenz, und einem Suffix. Muster können auch geschachtelt werden. Sequenzen haben die Form x..y[..Inkrement]. Also: Präfix{Zeichenfolge1, Zeichenfolge2, Zeichenfolge3}Suffix • Beispiele: $ echo a{d,b,c}e ade abe ace Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 42 von 95 $ echo a{00..10..2} a00 a02 a04 a06 a08 a10 $ echo a{b,c{1..3},d}z abz ac1z ac2z ac3z adz Pfadexpansion • Bei der Pfadexpansion (pathname expansion) wird ein Muster mit passenden Dateinamen ersetzt. Das erlaubt die schnelle und einfache Behandlung von vielen Dateien auf einmal. • Ein Muster kann folgende, spezielle Zeichen beinhalten: • • *: Passt auf jeden Dateinamen. • ?: Passt auf genau ein Zeichen. • [...]: Passt auf genau die Zeichen in den Klammern. Mit einem Bindestrich kann man Bereiche von Zeichen angeben (z.B. a-z). Beispiele: $ echo folien_* folien_00.page folien_01.page folien_02.page folien_03.page folien_05.page $ echo *.template folien-print.template folien.template titelfolie.template $ echo folien_?[3-5]* folien_03.page folien_04.page folien_05.page folien_04.page Variablenexpansion • Bei der Variablenexpansion wird der Wert einer Variablen, eventuell verändert, zurückgegeben. • Die wichtigsten Varianten sind: • ${Variable}: Einfach den Wert zurückgeben. • ${Variable:Offset[:Länge]}: Alle (oder maximal ‚Länge‘) Zeichen ab Offset (0-basierend) zurückgeben. • ${Variable#Präfix}: Das Präfix vom Wert löschen, falls der Wert mit dem Präfix beginnt. Das Präfix wird wie bei der Pfadexpansion behandelt. Mit zwei # wird das längste (sonst das kürzeste) Präfix gelöscht. • ${Variable%Suffix}: Das Suffix vom Wert löschen, falls der Wert mit dem Suffix endet. Das Suffix wird wie bei der Pfadexpansion behandelt. Mit zwei % wird das längste (sonst das kürzeste) Suffix gelöscht. • ${Variable/Muster/Zeichenfolge}: Im Wert wird der längster Treffer für das Muster (expandiert wie bei der Pfadexpansion) durch die Zeichenfolge ersetzt. Mit zwei / vor dem Muster werden alle Treffer ersetzt, sonst nur der erste. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 43 von 95 Variablenexpansion - Beispiele • Beispiele: $ VAR=TechnischePraxis $ echo ${VAR} TechnischePraxis $ echo ${VAR:10} Praxis $ echo ${VAR:10:3} Pra $ echo ${VAR#*i} schePraxis $ echo ${VAR##*i} s $ echo ${VAR%i*} TechnischePrax $ echo ${VAR%%i*} Techn $ echo ${VAR/T*he/Andere} AnderePraxis Befehlssubstitution • Die Befehlssubstitution erlaubt das Ersetzen eines Befehls mit dessen Ausgabe. • Es gibt zwei Formen: `Befehl` oder $(Befehl). Bei komplizierteren Befehlen ist die zweite Form vorzuziehen, weil bei der ersten Form manche Zeichen maskiert werden müssen. • Beispiele: $ VAR=$(echo a b); echo $VAR a b $ cat $(echo a b c) cat: a: No such file or directory cat: b: No such file or directory cat: c: No such file or directory $ cat "$(echo a b c)" cat: a b c: No such file or directory Bash-History-Expansion 1 • Mit Hilfe der Bash-History-Expansion kann man Teile vergangener Befehlszeilen in der aktuellen Befehlszeile nutzen. Die History-Expansion wird gleich nach der Eingabe durchgeführt, noch vor allen anderen Expansionen. • Ereignisbezeichner: • • !n → Befehlszeile n • !-n → Aktuelle Befehlszeile minus n • !! → Letzte Befehlszeile • ^alt^neu^ → In der letzten Befehlszeile die Zeichenfolge „alt“ durch „neu“ ersetzen Wortbezeichner (mit : von Ereignisbezeichner trennen, außer bei ^$*): Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 44 von 95 • n → n-tes Wort • ^ → Erstes Wort • $ → Letztes Wort • x-y → Bereich von Worten; -y → 0-y; x- → x-$ • * → Alle bis auf das nullte Wort (der Befehl) Bash-History-Expansion 2 • • Shell-Variablen: • HISTSIZE → Anzahl der Befehlszeilen, die im Speicher gehalten werden • HISTFILESIZE → Anzahl der Befehlszeilen, die maximal in die History-Datei geschrieben werden • HISTCONTROL → Mit Doppelpunkten getrennte Optionen: ignorespace → Befehlszeilen, die mit einem Leerzeichen beginnen, werden nicht gespeichert; ignoredups → Befehlszeilen, die ident zur vorangegangen Befehlszeile sind, werden ignoriert; ignoreboth → beide Optionen aktivieren Shell-Optionen: • histappend → Zeilen an die History-Datei anhängen (statt die History-Datei zu überschreiben) history - Bash-History anzeigen und manipulieren » Ohne Optionen wird die Bash-History angezeigt » Optionen: -c → History löschen, -d OFFSET → Zeile Offset löschen, -a → Aktuelle History-Zeilen an die History-Datei anhängen Bash-History-Expansion - Beispiele • Beispiele: $ echo hallo wie gehts? hallo wie gehts? $ !! echo hallo wie gehts? hallo wie gehts? $ echo !!* echo hallo wie gehts? hallo wie gehts? $ echo !$ echo gehts? gehts? $ history 3 38083 echo hallo wie gehts? 38084 echo gehts? 38085 history 3 Ein- und Ausgabeumleitung • Mit der Ein- und Ausgabeumleitung ist es möglich, als Eingabe für einen Befehl den Inhalt einer Datei zu verwenden oder die Ausgabe in eine Datei zu schreiben. • Die Umleitungsangaben können bei einem einfachen Befehl irgendwo stehen, bei einem komplexen Befehl nur danach. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 45 von 95 • <Datei: Die angegebene Datei wird als Standardeingabe (stdin) verwendet. • >Datei: Die angegebene Datei wird als Standardausgabe (stdout) verwendet. Falls die Datei noch nicht existiert, wird sie angelegt. Falls sie existiert, wird der Inhalt zuvor gelöscht. • >>Datei: Die angegebene Datei wird als Standardausgabe verwendet, ohne den Inhalt der Datei zuvor zu löschen (d.h. die Ausgabe wird hinten angehängt). • Mit Hilfe von n<&Wort bzw. n>&Wort können die Ziele der Eingabe- bzw. Ausgabedatenströme dupliziert werden. Zum Beispiel bedeutet 2>&1, dass die Fehlerausgabe das selbe Ziel haben soll wie die Standardausgabe. Mehr Information in der Manpage von bash unter „REDIRECTION“ bzw. im Kapitel I/O Redirection des Advanced Bash-Scripting Guide. Ein- und Ausgabeumleitung - Beispiele • Dateien suchen und die gefundenen Dateien für die spätere Bearbeitung in eine Datei schreiben: $ find /usr/include -printf %P\\n > found_files $ find /usr/src/linux-headers-3.2.0-25/include/ -printf %P\\n >> found_files • Eine Pipeline mit Daten einer Datei füttern: $ ( grep /usb/ | sort | uniq | wc -l ) < found_files 48 • Die Ausgabe und/oder die Fehlerausgabe ignorieren: $ find /usr/include non_existing_directory 2>&1 >/dev/null find: `non_existing_directory': No such file or directory $ find /usr/include non_existing_directory >/dev/null 2>&1 $ find /usr/include non_existing_directory &>/dev/null • Zusatz: Die Standardeingabe in der aktuellen Shell schließen (äquivalent zum Befehl exit): $ exec 0<&- Named Pipes (FIFO) • Wir haben bei den Linux-Dateitypen unter anderem den speziellen Typ Named Pipe kennengelernt. Dateien dieses Typs funktionieren nach dem First in, first out-Prinzip (so wie die Pipelines), d.h. alles was „auf der einen Seite“ hineingeschrieben wird, kommt sofort ohne Zwischenspeicherung „auf der anderen Seite“ heraus. • Named Pipes werden oft benutzt, um Hintergrundprozessen, die schon beim Systemstart geladen worden sind, Daten zu schicken. • Solange nicht beide Seiten, also sowohl die Eingabeseite als auch die Ausgabeseite, einer Named Pipe benutzt werden, blockiert der Kernel den Datentransfer. Die Reihenfolge der Befehle spielt dabei keine Rolle. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 46 von 95 Named Pipes (FIFO) - Befehle (mkfifo) mkfifo - Erstellt eine Named Pipe. » Parameter ist der Name der zu erstellenden Datei » $ mkfifo fifo; ls -l fifo prw-rw-r-- 1 thomas thomas 0 Oct 23 19:37 fifo $ echo hallo > fifo & [1] 21452 $ cat fifo hallo [1]+ Done echo hallo > fifo $ tail -f fifo | sed 's/NAME/Tux/g' & [1] 21582 $ echo Hallo, ich bin NAME. > fifo Hallo, ich bin Tux. $ echo NAME ist ein schöner Name, NAME, NAME, NAME, ... > fifo Tux ist ein schöner Name, Tux, Tux, Tux, ... Bearbeiten von Pfaden (basename, dirname) basename - Entfernt die führenden Verzeichnisse und optional ein Dateisuffix. » Parameter sind der Pfad und optional das Suffix. » $ basename /usr/include/ include $ basename /usr/include/fstab.h; basename /usr/include/fstab.h .h fstab.h fstab dirname - Entfernt die letzte Komponente vom Pfad. » Parameter ist der Pfad. » $ dirname /usr/include/ /usr $ dirname /usr/include/fstab.h /usr/include Einen Pfad in Verzeichnis, Dateiname ohne Dateiendung und Dateiendung aufsplitten: $ FILE=/usr/include/fstab.h $ DIRNAME=$(dirname "$FILE"); BASENAME=$(basename "$FILE") $ FILENAME="${BASENAME%.*}"; EXTNAME="${BASENAME##*.}" $ echo "$FILE $DIRNAME $FILENAME $EXTNAME" /usr/include/fstab.h /usr/include fstab h Zeilen selektieren (head, tail) head - Gibt nur den Anfang einer oder mehrerer Dateien aus. » Optionen: -n [-]K → nur die ersten K Zeilen ausgeben, bzw. bei -K alle bis auf die letzten K Zeilen (default 10). » $ head -n 2 /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh tail - Gibt nur das Ende einer oder mehrerer Dateien aus. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 47 von 95 » Optionen: -n [+]K → nur die letzten K Zeilen ausgeben, bzw. bei +K alle Zeilen ab der K-ten Zeile (default 10); -f → neue Zeilen ausgeben, sobald sie in der Datei erscheinen. » $ tail -n 2 /etc/passwd ntp:x:120:132::/home/ntp:/bin/false sshd:x:121:65534::/var/run/sshd:/usr/sbin/nologin Beide Befehle kombinieren um einen Bereich von Zeilen zu wählen: $ tail -n +5 /etc/passwd | head -n 2 # Zeilen 5 und 6 sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh Zeilen sortieren (sort) sort - Sortiert die Zeilen einer oder mehrerer Dateien. » Standardmäßig wird alphabetisch sortiert, vom Zeilenanfang weg. » • -n → numerisch sortieren • -h → menschenlesbare Zahlen vergleichen (1G, 10K, …) • -r → Sortierrichtung umdrehen • -u → gleiche Zeilen nur einmal ausgeben • -t Zeichen → Feldtrennzeichen (default: Übergang von nicht-leer auf leer) • -k POS1[,POS2] → Felder POS1 bis POS2 (oder bis Zeilenende) verwenden » $ sort /etc/passwd | head -n 3 avahi-autoipd:x:105:112:Avahi autoip daemon,,,:/var/lib/avahi-autoipd:/bin/false avahi:x:106:113:Avahi mDNS daemon,,,:/var/run/avahi-daemon:/bin/false backup:x:34:34:backup:/var/backups:/bin/sh $ sort -t : -k 3 /etc/passwd | head -n 3 root:x:0:0:root:/root:/bin/bash libuuid:x:100:101::/var/lib/libuuid:/bin/sh uucp:x:10:10:uucp:/var/spool/uucp:/bin/sh $ sort -n -t : -k 3 /etc/passwd | head -n 3 root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh Teile einer Zeile auswählen (cut) cut - Gibt nur bestimmte Teile einer Zeile aus. » Nützliche Optionen: • -d Zeichen → Trennzeichen (default ist Tabulator) • -f Liste → nur die angegebenen Felder • --output-delimiter Zeichen → Trennzeichen für Ausgabe • -c Liste/-b Liste → nur die angegebenen Zeichen/Bytes Die Liste ist eine Folge von Bereichen, separiert mit Beistrichen: • N → N-tes Byte, Zeichen oder Feld, beginnend bei 1 • N- → ab N-tem Byte, Zeichen oder Feld • N-M → vom N-ten bis zum M-ten Byte, Zeichen oder Feld • -M → vom ersten bis zum M-ten Byte, Zeichen oder Feld » $ cut -d: -f 1-3,1 /etc/passwd | head -1 Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 48 von 95 root:x:0 $ cut -d: -f 1-3,1 --output-delimiter=- /etc/passwd | head -1 root-x-0 $ cut -c 1-4,6 /etc/passwd | head -1 rootx Zeilen von Dateien zusammenfügen (paste) paste - Fügt Zeilen von Dateien spaltenweise zusammen. » Es ist das Gegenstück zu cut. » Optionen: -d Zeichen → die Zeichen als Separatoren verwenden anstatt des Tabulators » $ cut -d: -f1,2 /etc/passwd | head -n 5 > a $ cut -d: -f3- /etc/passwd | head -n 5 > b $ paste -d: a b root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync Sonstige Befehle für Textdateien (uniq) uniq - Zeigt wiederholte Zeilen an oder lässt sie weg. » Syntax: uniq [OPTION]... [Eingabe [Ausgabe]]. » Ohne Optionen werden wiederholte Zeilen nur einmal ausgeben. » Optionen: -u → nur einzigartige Zeilen ausgeben, -d → nur wiederholte Zeilen ausgeben, -f N → die ersten N Felder ignorieren (Felder werden von Leerzeichen/Tabulatoren getrennt) » $ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort -k 2 | uniq -f 1 -c 2 root /bin/bash 19 avahi-autoipd /bin/false 18 backup /bin/sh 1 sync /bin/sync 1 sshd /usr/sbin/nologin $ cut -d: -f1,7 --output-delimiter ' ' /etc/passwd | sort | uniq -u 1 sync /bin/sync 1 sshd /usr/sbin/nologin Sonstige Befehle für Textdateien (nl, wc) nl - Nummeriert Zeilen. » Es gibt viele Optionen, wie die Zeilen nummeriert werden sollen → Manpage! » $ nl /etc/passwd | tail -n +5 | head -n 2 5 sync:x:4:65534:sync:/bin:/bin/sync 6 games:x:5:60:games:/usr/games:/bin/sh wc - Zählt Zeilen, Wörter, Zeichen und Bytes einer oder mehrerer Dateien. » Standardmäßig wird die Anzahl der Zeilen, Wörter und Bytes Ausgabenreihenfolge ist immer: Zeilen, Wörter, Zeichen, Bytes. ausgegeben. Die » Optionen: -l → Anzahl der Zeilen ausgeben, -w → Anzahl der Wörter ausgeben, -c → Anzahl der Bytes ausgeben, -m → Anzahl der Zeichen ausgeben » $ wc notizen.org 22 111 755 notizen.org $ wc -c -m notizen.org Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 49 von 95 749 755 notizen.org Sonstige Befehle für Textdateien (expand, unexpand) expand - Konvertiert Tabulator zu Leerzeichen. » Optionen: -t x → Tabulator alle x Zeichen verwenden (Standard 8) » $ echo -e "hd\tt" | expand -t 4 hd t $ echo -e "hd\tt" | expand -t 8 hd t unexpand - Konvertiert Leerzeichen zu Tabulatoren. » Optionen: -t x → Tabulator alle x Zeichen verwenden (Standard 8) » $ echo hd $ echo hd $ echo hd $ echo hd t -e "hd\tt" | t -e "hd\tt" | t -e "hd\tt" | t -e "hd\tt" | expand -t 8 | unexpand -t 8 expand -t 8 | unexpand -t 4 expand -t 4 | unexpand -t 4 expand -t 4 | unexpand -t 8 Sonstige Befehle (which, tee) which - Sucht nach einem Befehl. » Sucht nach dem als Argument übergebenen Befehl im aktuellen Pfad » Optionen: -a → Alle gefundenen Befehle anzeigen » $ which ruby /home/thomas/.rvm/rubies/ruby-2.0.0-p247/bin/ruby $ which -a ruby /home/thomas/.rvm/rubies/ruby-2.0.0-p247/bin/ruby /home/thomas/.rvm/bin/ruby /usr/bin/ruby /home/thomas/.rvm/bin/ruby tee - Schreibt die Ausgabe auf das Terminal und in Dateien. » Nützlich, wenn die Eingabe gleichzeitig verarbeitet und in Dateien geschrieben werden soll » Optionen: -a → Ausgabe an die Dateien anhängen » $ echo "Hinzugefügte Zeile" | sudo tee -a /etc/motd > /dev/null $ cat /etc/passwd | tee >(sha256sum) >(md5sum) >(sha1sum) > /dev/null a11724cdd8d53db9ef919d19fec2d41b97da6be6 b29c74c00f7941e99cc59e882b2d6589 48437f19c39134b2d878fe195d59ebbcc4fab13c81dd8afe28f2da4bb7bbd1b2 $ wget -O- http://mat.univie.ac.at/praxis/wisem13/uebung/find.tar.bz2 | tee f.tbz2 | tar xjv Standardeingabe in Befehlsargumente umwandeln - xargs xargs - Wandelt die Standardeingabe in Argumente für einen Befehl um. » Teilt die Standardeingabe in Wörter (Trennzeichen sind Leerzeichen und Zeilenumbruch) und übergibt diese Wörter einem Befehl als Argumente. » Sehr nützlich z.B. in Verbindung mit find. » Optionen: -I Ersetzungszeichenkette → die angegebene Zeichenkette wird durch ein Argument Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 50 von 95 ersetzt (und das Trennzeichen ist nur mehr der Zeilenumbruch), -n Zahl → Anzahl der Argument pro Befehlausführung, -0 → Trennzeichen ist das Null-Byte. » $ echo -e "a b a b c d e f $ echo -e "a b Das ist jetzt: Das ist jetzt: c\nd e f" | xargs -n 2 echo c\nd e f" | xargs -I{} echo Das ist jetzt: {} a b c d e f » $ find /tmp -name core -type f -print0 | xargs -0 /bin/rm -i Bash-Optionen setzen (shopt) shopt - Zeigt Shell-Optionen an oder setzt sie. » Ist ein builtin-Befehl! » Optionen: -p → alle Shell-Optionen und deren Werte anzeigen, -s → Option aktivieren, -u → Option deaktivieren » Einige nützliche Optionen: • autocd → Verzeichnis als Befehl verstehen und hineinwechseln • cdspell → Kleine Fehler in Verzeichnisnamen werden automatisch korrigiert • dotglob → Versteckte Pfade (i.e. solche, die mit einem Punkt beginnen) werden bei der Pfadexpansion berücksichtigt • failglob → Muster, auf die kein Pfad passt, verursachen einen Fehler • hostcomplete → Hostnamen vervollständigen • nullglob → Muster, auf die kein Pfad passt, werden zu einem Leerwort expandiert anstatt zu sich selbst Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Bedingungen 3.0 Seite 51 von 95 Foliensatz 6 Reguläre Ausdrücke, Texteditoren Inhalt • Was sind Reguläre Ausdrücke? • Syntax von regulären Ausdrücken • Befehle, die reguläre Ausdrücke nutzen • Texteditoren Reguläre Ausdrücke • Reguläre Ausdrücke (kurz Regex oder Regexp) sind Zeichenketten, die eine Menge von Zeichenketten beschreiben. Sie werden z.B. zum Analysieren von Zeichenketten benutzt (Mustererkennung) oder um Zeichenketten innerhalb eines Textes zu finden und eventuell zu bearbeiten (suchen und ersetzen). • Reguläre Ausdrücke werden nicht nur auf der Kommandozeile in einigen Programmen (bash, grep, sed, awk, vim, …) benutzt, sie sind auch in nahezu allen Programmiersprachen (z.B. Ruby, Perl, Java, C, …) verfügbar und sehr hilfreich. • Es gibt viele unterschiedliche Implementierungen von regulären Ausdrücken, wir behandeln die Grundsyntax (erweiterte reguläre Ausdrücke), die praktisch von allen Implementierungen unterstützt wird. Es gibt auch einen POSIX-Standard für reguläre Ausdrücke (siehe man 7 regex). Reguläre Ausdrücke - Struktur • Bei der Analyse eines Regex ist es sinnvoll, den Regex zuerst als Ganzes zu betrachten und ihn dann in seine Teile zu zerlegen, wobei jeder Teil ein selbständiger Regex ist. • Ein regulärer Ausdruck besteht aus Zeichen, von denen einige eine spezielle Bedeutung haben (ähnlich wie die speziellen Zeichen der Shell). • Um die Analyse durchführen zu können, muss man die Bedeutung der speziellen Zeichen verstehen und wissen, wie sie angewendet werden können. • Grob gesagt besteht ein Regex aus • einer oder mehreren Alternativen (durch | getrennt) und • jede Alternative aus mehreren, sequentiell abgearbeiteten Stücken. Ein Stück ist entweder • ein gewöhnliches Zeichen, eine Zeichenklasse, eine Gruppierung oder eine Referenz, welche optional von einem Quantor gefolgt werden können, oder • ein Anker. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 52 von 95 Reguläre Ausdrücke - Zeichen • Jedes (gewöhnliche) Zeichen steht grundsätzlich für sich selbst, außer es hat eine spezielle Bedeutung. • Das Zeichen . (der Punkt) steht für ein beliebiges Zeichen. • Unter anderem haben folgende Zeichen eine spezielle Bedeutung und müssen deshalb mit Hilfe von \ maskiert werden: . * + ? [ ] ( ) | \ ^ $ Das heißt, . steht für ein beliebiges Zeichen, \. für den Punkt. Reguläre Ausdrücke - Zeichenklassen • Zeichenklassen sind eine Zusammenfassung verschiedener Zeichen, die an genau einer Stelle stehen können, und werden mit Hilfe von eckigen Klammern definiert (z.B. [abcd]). Zeichenbereiche können durch einen Bindestrich angegeben werden (z.B. [a-zA-Z0-9]). Steht an erster Stelle ein Zirkumflex ^, wird die Zeichenklasse invertiert (d.h. an der Stelle darf jedes Zeichen außer denen in der Zeichenklasse stehen). • Es gibt auch vordefinierte Zeichenklassen. Diese können sowohl innerhalb der eckigen Klammern als auch außerhalb verwendet werden, zB.: • \d → eine Ziffer (entspricht [0-9]) • \D → obige Klasse negiert • \w → ein alphanumerisches Zeichen oder der Unterstrich (entspricht [a-zA-Z0-9_]) • \W → obige Klasse negiert • \s → „Whitespace“, d.h. Leerzeichen, Tabulator, Zeilenumbruch, Wagenrücklauf, … • \S → obige Klasse negiert Reguläre Ausdrücke - Quantoren • Quantoren geben an, wie oft der Ausdruck vor ihnen wiederholt werden soll: • ? → Ausdruck kann einmal oder keinmal vorkommen (entspricht {0,1}) • + → Ausdruck kommt einmal oder mehrmals vor (entspricht {1,}) • * → Ausdruck kommt keinmal, einmal oder mehrmals vor (entspricht {0,}) • {n} → Ausdruck kommt genau n-mal vor • {n,} → Ausdruck kommt mindestens n-mal vor • {,m} → Ausdruck kommt maximal m-mal vor • {n,m}→ Ausdruck kommt mindestens n-mal und maximal m-mal vor Quantoren sind gierig, d.h. sie versuchen immer die maximale Anzahl an übereinstimmenden Zeichen zu finden. In vielen Implementierungen kann man ein ? an einen beliebigen Quantor anhängen, um die Quantoren genügsam zu machen, damit sie die minimale Anzahl an übereinstimmenden Zeichen finden. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 53 von 95 Reguläre Ausdrücke - Gruppierungen, Referenzen • Ausdrücke kann man mit runden Klammern (...) gruppieren. Will man Ausdrücke gruppieren, um z.B. darauf einen Quantor anzuwenden, ohne die Gruppierung später zu verwenden, so benutzt man (?:...). Das erzeugt eine sogenannte non-capturing Gruppierung. • Auf Gruppierungen kann man sich später mit Hilfe von Referenzen beziehen (außer auf die noncapturing Gruppierungen). Für Referenzen benutzt man \1, \2, usw. für die erste Gruppe, die zweite Gruppe usw. Reguläre Ausdrücke - Alternativen, Anker • Es gibt auch die Möglichkeit, den regulären Ausdruck in zwei Alternativen aufzuteilen. Dazu benutzt man |. Will man nur einen Teil des Ausdrucks in zwei Alternativen aufteilen, so muss Gruppierungen verwenden. • Zu guter Letzt gibt es sogenannte Anker, die es erlauben, einen regulären Ausdruck an eine bestimmte Stelle zu fixieren: • \A → Anfang der Zeichenkette • ^ → Anfang der Zeichenkette oder Zeilenanfang (nach Zeilenumbruch) • $ → Ende der Zeichenkette oder Zeilenende (vor Zeilenumbruch) • \Z → Ende der Zeichenkette (vor optionalen Zeilenumbruch) • \z → Ender der Zeichenkette • \b → Wortrand (Wortanfang oder Wortende) • \B → kein Wortrand (kein Wortanfang und kein Wortende) Reguläre Ausdrücke - Beispiele Als Beispielzeichenkette verwenden wir folgenden Text: STRING1 STRING2 Mozilla/4.0 (compatible; MSIE 5.0; Windows NT; DigExt) Mozilla/4.75 [en](X11;U;Linux2.2.16-22 i586) • .* → alles • \[en\] → die Zeichenfolge [en] • [A-Z]+ → Folgen von Großbuchstaben • \w+;\s? → Wort, gefolgt von einem Strichpunkt und optionalem Whitespace • \d{3,} → Ziffernfolgen mit mindestens drei Ziffern • (\w)\1 → doppelte Wortzeichen • (l).*?\1 → das Zeichen „l“, gefolgt von beliebigen Zeichen bis zum nächsten „l“ • ^\w+ → alle Wörter, die am Zeilenanfang vorkommen • \b[a-z]+\b → kleingeschriebene Wörter • i(ll|bl)[ae] → das Zeichen „i“, gefolgt von „ll“ oder „bl“, gefolgt von „a“ oder „e“ Siehe auch man pcresyntax, man pcrepattern, Regulärer Ausdruck auf Wikipedia, RegExr bzw. Online Regex Tester. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 54 von 95 Befehle (grep) grep - Filtert Zeilen aus Dateien mittels regulärem Ausdruck. » Standardmäßig werden die gefundenen Zeilen ausgegeben, ist konfigurierbar. » Der Rückgabewert ist 0, falls Zeilen gefunden wurden und sonst 1 (bei Fehler 2). » Optionen: -E → erweiterte reguläre Ausdrücke verwenden, -i → Groß-/Kleinschreibung ignorieren, -r → Verzeichnisse rekursiv durcharbeiten, -n → Zeilenummer anzeigen, -H → Dateiname anzeigen, -q → nichts ausgeben, --color → gefunden Zeichenketten farbig markieren. » $ grep root /etc/passwd root:x:0:0:root:/root:/bin/bash $ grep '^\w+:x:15' /etc/passwd $ grep -E '^\w+:x:15' /etc/passwd thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/bash Befehle (sed) sed - Hilfswerkzeug zum Filtern und Transformieren von Text. » Mit Hilfe einer eigenen Skriptsprache kann man Text filtern und transformieren. Das Programm ermöglicht dadurch einen sehr universellen Einsatz. » Optionen: -e Skript → Angabe des Skripts, das benutzt werden soll, -n → Ausgabe nur, wenn explizit angegeben, -r → erweiterte, reguläre Ausdrücke benutzen. » $ grep bash /etc/passwd | sed -ne 's/\/bash$/\/zsh/' $ grep bash /etc/passwd | sed -ne 's/\/bash$/\/zsh/p' root:x:0:0:root:/root:/bin/zsh thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/zsh $ grep bash /etc/passwd | sed -ne '1s/\/bash$/\/zsh/p' root:x:0:0:root:/root:/bin/zsh thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/bash $ sed -re '/bin\/(false|sh)/d;1d;s/\/bash$/\/zsh/' /etc/passwd sync:x:4:65534:sync:/bin:/bin/sync thomas:x:1515:1515:thomas,,,:/home/thomas:/bin/zsh sshd:x:121:65534::/var/run/sshd:/usr/sbin/nologin $ sed -ne '5,6p' /etc/passwd # einfacher als die Kombination aus head und tail sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh » Für mehr Informationen/Beispiele siehe info sed Examples und sed Einzeiler Textdateien editieren Ein wichtiges Handwerkszeug auf der Kommandozeile ist ein guter Texteditor. • Nano: Kompakter, einfach zu bedienender Editor. Standard in Ubuntu. • Emacs: Sehr mächtiger Editor; programmierbar in Lisp für Erweiterungen; gut für Terminal und GUI. • Vi/Vim: Ebenfalls sehr mächtiger, aber gewöhnungsbedürftiger Editor; schnell, relativ alt, sehr gut für Terminals (aber auch GUI), nahezu überall installiert. Standard in den meisten Linux Distributionen. Der Default-Editor unter Ubuntu kann mit Hilfe des folgenden Befehls geändert werden: $ sudo update-alternatives --config editor Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 55 von 95 Textdateien editieren - Nano Das Interface von Nano besteht aus drei Teilen: • Statuszeile oben • Dem zu editierenden Text in der Mitte • Menü mit Shortcuts unten (^ steht für die Strg-Taste und M- für die Alt-Taste) Die wichtigsten Tastenkombinationen: • Strg-O → Speichern der Datei • Strg-X → Beenden von Nano • Strg-G → Hilfe anzeigen Textdateien Editieren - Emacs Seit 1976 (Richard Stallman), über 1000 Funktionen + Makros. Emacs basiert auf Lisp und kann mit zahlreichen Modulen erweitert werden. Aktuelle Version ist 24.5. Es gibt keine verschiedenen Modi wie bei Vim, sondern die Strg-Taste (C-) und die Alt-Taste (M-) werden für Befehle genutzt: • C-x b → Buffer wechseln oder neuen Buffer erzeugen (mehrere gleichzeitig, in mehreren Fenstern) • C-x C-f/C-x C-s → Datei öffnen/speichern • C-x C-c → Beenden (bei nicht gespeicherten Dateien wird nachgefragt) • C-s/C-r → Vorwärts/Rückwärts suchen • C-f/C-b bzw. M-f/M-b → Ein Zeichen bzw. Wort vorwärts/rückwärts • C-Space → Startmarkierung setzen • C-w/M-w → Bereich von Startmarkierung bis Cursor ausschneiden/kopieren • C-y → Kopierten/Ausgeschnittenen Text einfügen • C-_ → Undo Dreimaliges Drücken der Escape-Taste bricht eine angefangene Aktion ab. Textdateien editieren - Vim Ursprungsform ist vi, 1976 von Bill Joy geschrieben. Mehr Funktionalität bietet Vim, z.B. viele Plugins und eine graphische Oberfläche (GVim). Vim arbeitet mit mehreren Betriebsmodi: • Normaler Modus: Man kann lesen, suchen, editieren, … In diesen Modus kommt man immer, wenn man die Escape-Taste drückt. Tastendrücke (auch Buchstaben) sind (Navigations-/Editier-)befehle! • Kommandozeilenmodus: Eingabe von beliebigen Befehlen. • Eingabemodus: Einfügen von Text an der Stelle des Cursors. • Visueller Modus: Es können Bereiche (Zeichen, Zeilen, Blöcke) markiert werden und dann Befehle auf diesen Bereichen ausgeführt werden (z.B. Kopieren, Löschen, blockweises Einfügen, …). Vim besitzt einen eingebauten Übungsmodus, der mit Hilfe des Befehls vimtutor gestartet werden kann! Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 56 von 95 Links: Vim Tips Wiki, Best Vim Tips, Buchempfehlung: Practical Vim Vim - Normaler Modus Cursor bewegen: Pfeiltasten oder • h/j/k/l → Zeichen nach links, Zeile hinunter, Zeile hinauf, Zeichen nach rechts • 0 → Zum Zeilenanfang • ^ → Zum ersten Zeichen der Zeile, dass kein Leerzeichen ist • $ → Zum Zeilenende • w/b → Zum Anfang des nächsten/vorherigen Wortes • e → Zum Ende des nächsten Wortes • gg/G → Zur ersten bzw. letzten Zeile des Textes springen Befehle werden kombiniert nach dem Schema „[Zahl=Wiederholungen] Befehl<Objekt/Bewegung>“: • d[i]w → Wort löschen, dd → ganze Zeile löschen (ebenso mit c für ändern) • 5dw → 5 Wörter löschen, 4j → 4 Zeilen runter • u → Undo, Strg-r → Redo Vim - Kommandozeile Benutzen der Kommandozeile mittels : (also :, dann Befehl und Enter-Taste): • :<Zahl> → Zu Zeilennummer springen • :$ → Zur letzten Zeile • :r <Dateiname> → Datei öffnen • :e → Neue Datei anlegen • :w → Speichern • :q → Buffer schließen/Beenden, :q! → Beenden ohne zu speichern • :wq → Speichern & Beenden • :help bzw. :h → Hilfe in neuem „Fenster“/Buffer anzeigen (z.B. :h j Hilfe zum Befehl j) Man kann auch Ranges vor dem Befehl angeben, z.B.: • % → Alle Zeilen • . → Die aktuelle Zeile (ist Standard für die meisten Befehle) • 1 → Die erste Zeile • $ → Die letzte Zeile • n,m → Die Zeilen n bis m (wobei auch . und $ verwendet werden kann) Vim - Suchen und Ersetzen Suchen und Ersetzen (siehe auch Vim Wikia: Search and replace): • /<regex> → Vorwärts nach dem regulären Ausdruck suchen • ?<regex> → Rückwärs nach dem regulären Ausdruck suchen • n/N → Vorwärts/Rückwärts weitersuchen • :s/muster/ersatz/[g|c] → Ersetzt den Text, auf den Muster (ein regulärer Ausdruck) passt, mit dem Ersatztext. „g“ steht für „auch mehrmals in der selben Zeile“, „c“ steht für Bestätigen. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 57 von 95 Wie die meisten Befehle wird standardmäßig nur die aktuelle Zeile verwendet, daher Ranges verwenden! Vim - Eingabemodus Wechseln in den EingabeModus: • i → Einfügen vor dem Cursor • I → Einfügen am Zeilenanfang • a → Einfügen nach dem Cursor • A → Einfügen am Zeilenende • r → Ein Zeichen ersetzen • R → Überschreiben ab dem Cursor • c → Ändern (z.B. c[i]w → Wort ändern, cc → Zeile ändern) • o/O → Neue Zeile nach/vor aktueller Zeile einfügen Zurück in den normalen Modus kommt man mit der Escape-Taste, man hält sich meist nur kurz im Eingabemodus auf. Vim - Visueller Modus Mit v (Zeichen markieren), V (Zeilen markieren) oder Strg-V (Block=Rechteck markieren) wird der visuelle Modus aktiviert: • y → Bereich kopieren („yank“) • d oder x → Bereich löschen/ausschneiden • I/A → Text vor/nach Block einfügen Im normalen Modus: • p/P → Kopierten/Ausgeschnitten Text nach/vor Cursor einfügen nano vs vim vs Emacs Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 58 von 95 XKCD Comic 378 Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ • gleichen Bedingungen 3.0 Das XKCD-Comic zu „Real Programmers“ steht steht unter der CC BY-NC 2.5 Lizenz. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 59 von 95 Foliensatz 7 Programme, Prozesse, Speicher Inhalt • Programme • Prozesse • Speichermanagement Programme • Ein Programm besteht aus Dateien, die Anweisungen für den Prozessor enthalten. Normalerweise haben die Programme keine Dateierweiterung (wie z.B. .exe unter Windows). • Es gibt auch Bibliotheken – Sammlungen von Anweisungen –, die von Programmen verwendet werden können. Diese Bibliotheken findet man üblicherweise in /lib und /usr/lib und haben die Dateiendung .o oder .so. • Unix-ähnliche Systeme verwenden meist das ELF-Format für ausführbare Binärprogramme und Bibliotheken. • Darüber hinaus erlaubt der Linux-Kernel das Ausführen von Textdateien (müssen mit dem sogenannten Shebang beginnen) und durch das binfmt_misc Kernelmodul auch das direkte Ausführen von beliebigen Programmtypen, wie z.B. Java JAR-Dateien. Programme - ELF Beispiel ELF-Binärprogramm ls: $ file /bin/ls /bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=0x214a38d0db472db559f0dabf0ae97f82fea83e03, stripped $ readelf -h /bin/ls ELF Header: Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 Class: ELF64 Data: 2's complement, little endian Version: 1 (current) OS/ABI: UNIX - System V ABI Version: 0 Type: EXEC (Executable file) Machine: Advanced Micro Devices X86-64 Version: 0x1 Entry point address: 0x4045a4 Start of program headers: 64 (bytes into file) Start of section headers: 104048 (bytes into file) Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 60 von 95 Flags: ... 0x0 Programme - Skripts • Ein ausführbares Skript muss mit dem sogenannten Shebang beginnen, das ist die Zeichenfolge #!. Der Rest der Zeile gibt den Pfad zum Programm (und optional Argumente) an, mit dem das Skript ausgeführt werden soll (z.B. /bin/sh, /usr/bin/env ruby, …). • Dadurch können Skripte transparent und genauso einfach wie echte Binärprogramme ausgeführt werden. Die Shell selbst (Shell-Skripts) und viele Programmiersprachen (z.B. Ruby, Python, Perl, …) verwenden diesen Mechanismus. • Beispiel für ein ausführbares Skript in der Programmiersprache Ruby: $ file scripts/hallo_welt.rb hallo_welt.rb: a ruby script, ASCII text executable $ cat scripts/hallo_welt.rb #!/usr/bin/env ruby puts "Hallo Welt!" $ scripts/hallo_welt.rb Hallo Welt! Programme - Andere Binärdateien • Quelltextdateien einiger Programmiersprachen werden in ein Zwischenformat übersetzt, das nicht direkt auf der CPU ausführbar, dafür aber sehr portabel ist. Zu diesen Programmiersprachen gehört z.B. Java. Dieses Zwischenformat wird dann von einer „virtuellen Maschine“, einem speziellen Binärprogramm, interpretiert (bei Java ist das die JVM). • Das binfmt_misc Kernelmodul erlaubt das Registrieren solcher Binärformate und damit die transparente Ausführung von Programmen in diesen Formaten. • Beispiel: Registriertes Java-JAR-Format $ ls /proc/sys/fs/binfmt_misc/ cli jar python2.7 register status wine $ cat /proc/sys/fs/binfmt_misc/jar enabled interpreter /usr/bin/jexec flags: offset 0 magic 504b0304 $ hexdump -n 4 -e '4/1 "%02X " 1/ "\n"' \ > /usr/lib/jvm/java-7-openjdk-common/jre/lib/charsets.jar 50 4B 03 04 Prozesse • Ein Prozess ist eine Instanz eines Programms. Es kann daher ein Programm mehrmals gestartet werden und es so mehrere Instanzen eines Programmes gleichzeitig geben. Auch können mehrere verschiedene Programme gleichzeitig ausgeführt werden (Multitasking). • Zu einem Prozess gehört die Prozessumgebung (auch Prozesskontext genannt), welche unter Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 61 von 95 anderem folgende Inhalte umfasst: • • Die Prozess-ID (PID) und die Elternprozess-ID (PPID) • Ein gewisser Speicherbereich • Die UID des Besitzers des Prozesses • Die EUID (effektive UID), welche den Zugang zu Ressourcen regelt • Die Umgebungsvariablen Der Kernel stellt über das proc-Dateisystem Informationen zu jedem Prozess in dem Verzeichnis /proc/PID dar. Prozesse - Lebenszyklus 1 • Beim Booten des Betriebssystem wird der sogenannte init-Prozess gestartet. Er ist die Wurzel des Prozessbaums. • Das Starten eines neuen Prozesses funktioniert über das fork-Modell: • Der aktuelle Prozess benutzt den Systemaufruf fork(), um eine Kopie von sich selbst mit neuer PID und neuer Prozessumgebung anzulegen (manche Inhalte der Prozessumgebung, wie die Umgebungsvariablen, werden vererbt, andere, wie der Speicherbereich, nicht). • Der aktuelle Prozess (der Elternprozess) bekommt als Rückgabewert des Systemaufrufs die PID des Kindprozesses, der Kindprozess den Wert 0 zurück. • Der Kindprozess kann jetzt entweder den Code des Elternprozesses weiter ausführen oder neuen Programmcode mittels des Systemaufrufs exec() (oder einer seiner Varianten) ausführen. Prozesse - Lebenszyklus 2 • Um die Zuordnung eines Kindprozesses zu einem Elternprozess zu gewährleisten, gibt es die Parent PID (PPID). Dadurch entsteht ein Prozessbaum, an dessen Wurzel der init-Prozess steht. • Wenn ein Prozess beendet wird, endet die Ausführung des Prozesses, aber es bleibt etwas von dem Prozess noch übrig, unter anderem der Rückgabewert. Der Elternprozess ist dafür verantwortlich, auf seine Kindprozesse zu warten (mittels des Systemaufrufs wait() und seiner Varianten). Terminiert ein Kindprozess und wurde kein wait() ausgeführt, so ist der Kindprozess zu einem Zombieprozess geworden. Solche Zombieprozesse werden nach der Terminierung des Elternprozesses an den init-Prozess übergeben, der automatisch auf sie wartet und sie damit entfernt. Prozesse - Berechtigungen • Jeder Prozess hat mehrere, verschiedene UIDs/GIDs (siehe Manpage credentials(7)): die reale, effektive, gespeicherte und (nur unter Linux) Dateisystem-UID/GID. • Die reale UID/GID beschreibt den Besitzer des Prozesses (üblicherweise der Benutzer, der den Prozess gestartet hat). • Die effektive UID/GID wird allgemein für Zugriffsrechte benutzt, die Dateisystem-UID/GID für den Zugriff auf Dateien (ist aber fast immer ident mit der effektiven UID/GID). Ein unpriviligierter Benutzer darf die effektive UID/GID nur auf die reale, effektive oder Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 62 von 95 gespeicherte UID/GID setzen! • In der gespeicherten UID/GID wird die vorherige, effektive UID/GID beim Setzen einer neuen gespeichert. Das wird unter anderem dazu benutzt, um kurzzeitig (z.B. während sicherheitskritischer Operationen) die effektive UID/GID auf einen unpriviligierten Benutzer zu setzen und danach auf die gespeicherte UID/GID zurückzukehren. Prozesse - Scheduling, Interrupts und Prioritäten 1 • Da auf einer CPU nicht mehrere Prozesse gleichzeitig ausgeführt werden können, müssen die Prozesse für kurze Zeitabschnitte hintereinander ausgeführt werden. • Die Hardware kann mittels Interrupts die Ausführung von Prozessen unterbrechen und kurzzeitig die Kontrolle an das Betriebssystem übergeben. Solche Interrupts werden zum Beispiel durch IOAktivitäten ausgelöst (Maus, Tastatur, Festplatte, …), aber es gibt auch periodische Interrupts. Das Betriebssystem wertet den Interrupt aus und reicht die Informationen an die entsprechenden Prozesse weiter. • Ein periodischer Interrupt wird vom Kernel dazu genutzt, um allen Prozessen Rechenzeit gerecht zur Verfügung zu stellen (Scheduling, preemptives Multitasking). Es gibt dabei mehrere auswählbare Strategien, je nachdem ob es sich um ein Serversystem, ein Desktopsystem oder z.B. ein Echtzeitsystem handelt. Anmerkung: Es gibt auch kooperatives Multitasking, d.h. jeder Prozess muss sich selbst unterbrechen, damit ein anderer Prozess ausgeführt werden kann. Funktionierte das nicht, friert das System ein. Prozesse - Scheduling, Interrupts und Prioritäten 2 • Um unabhängig vom Scheduling Prozessen mehr oder weniger Rechenzeit zu geben, ist jedem Prozess eine sogenannte Scheduling-Priorität (der nice-Wert) zugeordnet. Diese reicht von -20 bis 20 mit einem Standardwert für normale Benutzer von 0. • Je negativer die Scheduling-Priorität ist, desto mehr Rechenzeit bekommt der Prozess. Umgekehrt: je positiver, desto weniger Rechenzeit. Bei eine Scheduling-Priorität von 20 läuft der Prozess praktisch nur mehr dann, wenn kein anderer Prozess Rechenzeit braucht. • Ein normaler Benutzer kann seine Prozesse nur herabstufen, d.h. ihnen geringere Priorität mittels einem höheren Wert für die Scheduling-Priorität einräumen (er ist freundlicher – nicer – zu anderen Prozessen). Der root-Benutzer darf beliebigen Scheduling-Prioritäten setzen. • Die Scheduling-Priorität kann entweder beim Starten eines Programmes mit Hilfe von nice festgelegt werden oder im nachhinein mittels renice. Prozesse - Signale • Eine Möglichkeit, mit Prozessen zu kommunizieren, ist das Schicken von Signalen. Damit kann man Prozessen z.B. mitteilen, dass sie sich beenden sollen. • Signale können von einem Prozess abgefangen und verarbeitet/ignoriert werden. Wird nichts davon gemacht, wird die Standardaktion für das Signal ausgeführt. • Ein Signal hat einen Namen und eine Nummer. Ein Liste aller Signale findet man in der Manpage Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 63 von 95 (man 7 signal). Hier ist eine Tabelle der oft benötigten Signale: • Name Nummer Bemerkung HUP 1 Hangup (Prozess wird beendet) INT 2 Interrupt (Prozess wird beendet) KILL 9 Prozess beenden (kann nicht abgefangen/ignoriert werden) TERM 15 Prozess beenden CONT 18 Gestoppten Prozess wieder starten STOP 19 Prozess stoppen (kann nicht abgefangen/ignoriert werden) Mit Hilfe des Befehls kill werden Signale an Prozesse gesendet. Hintergrundprozesse in der Bash • Die Bash hat auch Befehle zur Steuerung von (Kind)Prozessen (genannt Jobs, siehe auch „JOB CONTROL“ in der Manpage). Dabei können Jobs angehalten bzw. wieder gestartet werden und es besteht auch die Möglichkeit, Jobs im Hintergrund laufen zu lassen. • Der Abschluss eines Befehls mit & lässt den Befehl im Hintergrund laufen. Ein im Vordergrund laufender Prozess kann mit „Strg-z“ angehalten werden (Signal STOP). Es kann natürlich nur ein Prozess im Vordergrund laufen, aber beliebig viele können im Hintergrund laufen oder angehalten sein. • Alle aktuellen Jobs können über den Befehl jobs angezeigt. Soll ein angehaltener Job fortgesetzt werden, kann er mit dem Befehl bg im Hintergrund, mit dem Befehl fg im Vordergrund fortgesetzt werden. Mit Hilfe von %Job (wobei Job die angezeigte Jobnummer ist) kann ein bestimmter Job angegeben werden. • Prozesse, die im Hintergrund laufen, können zwar weiterhin auf das Terminal schreiben (abhängig von der „tostop“ Terminal-Einstellung), aber nicht mehr vom Terminal lesen (sobald ein Hintergrundprozess versucht vom Terminal zu lesen, wird vom Kernel das Signal TTIN geschickt und der Prozess angehalten). Befehle für Prozesse 1 (ps) ps - Zeigt Prozessinformationen an. » Viele unterschiedliche Ausgabe- und Prozessselektionsmöglichkeiten, z.B.: • ps → Informationen zu eigenen Prozessen im aktuellen Terminal • ps ax → Informationen zu allen Prozessen • Zusätzlich mit l oder u → Selektion wie oben, nur noch mehr Informationen » $ ps l F UID 0 1515 0 1515 curses 0 1515 0 1515 PID PPID PRI NI VSZ RSS WCHAN STAT TTY TIME COMMAND 2383 2344 20 0 17788 1164 poll_s Ss+ pts/1 0:00 tmux attach 2387 2385 20 0 4392 612 wait Ss+ pts/3 0:00 sh -c weechat2388 2389 2385 2387 20 20 0 32512 13852 wait Ss 0 344108 37176 poll_s Sl+ pts/4 pts/3 0:00 -bash 0:00 weechat-curses Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 64 von 95 0 1515 0 1515 $ ps u USER thomas thomas curses thomas thomas thomas thomas 4447 4942 2385 2388 20 20 0 0 32472 13764 n_tty_ Ss+ 9744 1044 R+ pts/0 pts/4 0:00 -bash 0:00 ps l PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND 2383 0.0 0.0 17788 1164 pts/1 Ss+ 07:29 0:00 tmux attach 2387 0.0 0.0 4392 612 pts/3 Ss+ 07:29 0:00 sh -c weechat2388 2389 4447 4949 0.0 0.0 0.0 0.0 0.1 32512 13852 pts/4 0.4 344108 37176 pts/3 0.1 32472 13764 pts/0 0.0 18176 1276 pts/4 Ss Sl+ Ss+ R+ 07:29 07:29 08:19 08:31 0:00 0:00 0:00 0:00 -bash weechat-curses -bash ps u Befehle für Prozesse 2 (pstree, kill) pstree - Zeigt die Prozesshierarchie an. » Ohne Argument wird vom init-Prozess aus angezeigt, sonst von dem Prozess mit der angegebenen PID. » Optionen: -p → PID anzeigen, -a → Befehlsargumente anzeigen, -n → numerisch, nicht nach Namen sortieren, -s → Elternprozesse des angegeben Prozesses anzeigen. » $ pstree -aps $$ init,1 └─tmux,2385 attach └─bash,2388 └─pstree,5329 -aps 2388 kill - Sendet ein Signal an einen oder mehrere Prozesse. » Signale können entweder über die Nummer oder den Namen angegeben werden. » Prozesse werden über die PID angegeben. » Nur eine Option wichtig: -signal (also z.B. numerisch -9 oder mit Namen -KILL) » $ kill -9 2389 Befehle für Prozesse 3 (pgrep, pkill, top) pgrep, pkill - Sucht Prozesse oder schickt ihnen ein Signal. » Gesucht wird nach Prozessen, auf deren Namen der reguläre Ausdruck passt. » Optionen: -f → Die gesamte Kommandozeile eines Befehls verwenden, nicht nur den Namen, -u → Nur Prozesse mit der angegebenen effektiven UID » $ pgrep bash 2388 4447 $ pkill -9 bash top - Zeigt Prozesse interaktiv an. » Zeigt alle Prozesse an und aktualisiert die Liste laufend. » Mit Hilfe von < und > kann man die Sortierung ändern, R dreht die Sortierreihenfolge um, q beendet man das Programm, h zeigt die Hilfe an. Befehle für Prozesse 4 (nice, renice) nice - Programm mit anderer Scheduling-Priorität laufen lassen. » Argumente sind der Programmname und die Parameter für das Programm. » Option -n gibt die Änderung in Relation zur aktuellen Priorität an (default 10). » Ohne Optionen und Argumente wird die aktuelle Priorität ausgegeben. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 65 von 95 » $ nice 0 $ nice nice 10 $ nice -n 3 nice 3 $ nice -n -3 nice nice: cannot set niceness: Permission denied 0 renice - Scheduling-Priorität laufender Programme ändern. » Erstes Argument (mit optionalen -n davor) ist die neue Priorität, danach kommen die PIDs. » $ sleep 10 & [1] 5727 $ renice 10 5727 5727 (process ID) old priority 0, new priority 10 Speichermanagement 1 • Der Arbeitsspeicher (RAM) wird vom Kernel verwaltet und den Prozessen zugeteilt. Dabei benutzt der Kernel das Konzept eines virtuellen Speichers. Virtuelle Speicheradressen werden von der CPU mit Unterstützung des Kernels auf physische Adressen abgebildet, damit die CPU direkt mit ihnen umgehen kann. Falls einer virtuellen Speicheradresse noch keine physische zugeordnet ist, informiert die CPU durch einen page fault (ein spezieller Interrupt) den Kernel, der die Daten dann in den physischen Speicher lädt. • Beim Starten eines Programmes, wird der Prozess in den Arbeitsspeicher geladen, der viel schneller als permanente Medien wie Festplatten ist. Der Kernel reserviert dabei einen genügend großen Bereich für den Prozess. • Jeder Prozess glaubt, den ganzen Speicher für sich alle zu haben, und für den Prozess spielt es keine Rolle, wo seine Daten im physischen Speicher geladen sind bzw. ob sie überhaupt schon geladen sind. • Gemeinsam benutzte Ressourcen wie Bibliotheken oder der Programmcode von einem Programm, das mehrmals gestartet worden ist, werden einmal geladen und die Prozesse greifen transparent durch den virtuellen Speicherbereich darauf zu. Speichermanagement 2 • Der Kernel kann auch nicht benötigten Speicher auf die Festplatte in eine Swap-Partition oder Swap-Datei auslagern. Sobald der Speicher wieder benötigt wird (angezeigt durch einen page fault), lädt der Kernel diesen Speicher wieder. • Zusätzlich benutzt der Kernel den freien physischen Arbeitsspeicher zum Zwischenspeichern (cachen) von schon einmal geladenen Daten von der Festplatte und anderen Daten. Damit ist der wiederholte Zugriff auf diese Daten viel schneller. • Durch das Benutzen eines virtuellen Speicherbereichs erhöht sich auch die Sicherheit, weil Prozesse nicht außerhalb davon Speicher manipulieren können. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 66 von 95 Befehle für Speichermanagement (free, swapon, swapoff) free - Zeigt den freien und benutzten Speicher an. » Optionen: -b/-k/-m/-g → Anzeige in Byte, Kilobyte (default), Megabyte oder Gigabyte » $ free total Mem: 7969624 -/+ buffers/cache: Swap: 3905532 used 3488688 2024076 0 free 4480936 5945548 3905532 shared 0 buffers 291712 cached 1172900 swapon, swapoff - Aktiviert bzw. deaktiviert Swap-Speicher. » Nur der root-Benutzer kann Änderungen vornehmen. » Option -s von swapon zeigt die aktuellen Swap-Speicher an. » $ swapon -s Filename /dev/sda5 $ sudo swapoff /dev/sda5 $ swapon -s Filename $ sudo swapon /dev/sda5 Type partition Size Used 3905532 0 Priority -1 Type Size Priority Used Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Bedingungen 3.0 Seite 67 von 95 Foliensatz 8 Shell-Programmierung Inhalt • Aufbau Shell-Skript • Tests • Eingabe- und Ausgabebefehle • Verzweigungen • Schleifen • Funktionen • Wichtige Shell-Variablen und Geräte • Hilfreiche (Bash-)Befehle Shell-Skript • Ein Shell-Skript ist einen Textdatei, die von der Shell interpretiert wird. Um ein möglichst portables Shell-Skript zu schreiben, darf man nur die POSIX-konforme Syntax und die POSIX-konformen Befehle verwenden. • Die Datei /bin/sh ist ein Link auf die Standardshell der Linux-Distribution (im Fall von Ubuntu ein Link auf /bin/dash) und diese Shell wird üblicherweise für die Ausführung von Shell-Skripten verwendet. • Alles, was man auf der Kommandozeile eingeben kann, kann man auch in einem Skript verwenden. Umgekehrt gilt das gleiche. Daher ist es möglich, zuerst direkt auf der Kommandozeile Befehle zu kombinieren und auszuprobieren und später daraus ein Skript zu machen. Eine gute Dokumentation, die kurz und bündig ist, aber viele Beispiele umfasst, ist der Advanced BashScripting Guide. Shell-Skript - Aufbau • • In einem Shell-Skript werden meist überwiegend Shell-Befehle benutzt. Zu den Shell-Befehlen gehören unter anderem: • Variablenzuweisungen • Tests (test, [ ... ], [[ ... ]]) • Verzweigungen (if, case) • Schleifen (for, while, until) • Ein- und Ausgabebefehle (read, echo, printf) • Funktionen (function) Darüber hinaus können natürlich auch alle anderen Programme wie head, tail, cut, … verwendet Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 68 von 95 werden. • Um ein Skript ausführbar zu machen, muss das Executable-Bit auf die Datei gesetzt werden und in der ersten Zeile muss ein entsprechender Shebang stehen (für portable Skripte #!/bin/sh, sonst #!/bin/bash). Oder man ruft das Skript direkt mit Hilfe der Bash auf, also bash skript.sh. Shell-Skript - Stellungsparameter • Einem Shell-Skript können beim Aufruf wie jedem anderen Befehl Argumente übergeben werden. Die Shell stellt für das Arbeiten mit den Argumenten die Stellungsparameter sowie einige spezielle Parameter zur Verfügung. • $1, $2, $3, … sind die Stellungsparameter. In $1 ist das erste Argument, in $2 das zweite Argument und so weiter. Man kann ihnen keinen Wert direkt zuordnen (nur über den Bash-Befehlset). • Von den speziellen Parametern sind $*, $@ und $# für das Arbeiten mit den Stellungsparametern wichtig. Shell-Skript - Spezielle Parameter • Den sogenannten speziellen Parametern kann kein Wert zugewiesen werden und sie werden von Shell speziell behandelt: • $*: Expandiert zu den Stellungsparametern. Werden doppelte Anführungszeichen benutzt ("$*"), so wird zu einem einzigen Wort expandiert. Die Werte der Stellungsparameter sind durch das erste Zeichen von $IFS (normalerweise das Leerzeichen) getrennt (also "$1 $2 $3 ..."). • $@: Expandiert zu den Stellungsparametern. Werden doppelte Anführungszeichen benutzt ("$@"), so expandiert jeder Parameter zu einem eigenen Wort (also "$1" "$2" "$3" ...). • $#: Expandiert zur Anzahl der Stellungsparameter. • $?: Expandiert zum Rückgabewert des letzten, im Vordergrund ausgeführten Befehls. • $$: Expandiert zur PID der Shell (auch wenn in einer Subshell verwendet). • $!: Expandiert zur PID des letzten, im Hintergrund gestarteten Befehls. • $0: Expandiert zum Namen der Shell oder des Shell-Skripts. Shell-Skript - Befehle für Stellungsparameter (set, shift) set - Setzt oder löscht Shell-Optionen bzw. setzt Stellungsparameter. » Wir gehen nicht näher auf die Shell-Optionen ein. » Syntax: set -- Parameter1 Parameter2 ... » $ set -- Param1 "Param 2" $ echo $1 Param1 $ echo $2 Param 2 shift - Entfernt die ersten N Stellungsparameter und rückt die anderen nach. » Falls kein Argument angegeben ist, wird als Anzahl N=1 benutzt. » Das heißt, der Parameter $N+1 wird zu $1, $N+2 wird zu $2 und so weiter. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 69 von 95 » Hat als Rückgabewert 0, wenn N nicht negativ und kleiner als $# ist. » $ set -- Param1 "Param 2" "Param 3" $ echo $1 Param1 $ shift 2 $ echo $1 Param 3 Shell-Skript - Beispiele Hier ein Beispiel für ein einfaches Shell-Skript: #!/bin/sh # # Wir werden jetzt einige Stellungsparameter und spezielle Parameter testen. # Dazu dieses Skript mit mindestens drei Argumenten aufrufen. echo Alle Parameter mit \$*: \""$*"\" echo Alle Parameter mit \$@: \""$*"\" echo Anzahl der Parameter: $# echo $1 echo $2 echo $3 shift 3 echo Anzahl der Parameter: $# echo $1 $2 $3 • In der ersten Zeile ist der Shebang. Dieser muss immer vorhanden sein! • Danach folgen drei Zeilen mit Kommentaren (Shell-Kommentare beginnen mit dem Hash-Zeichen # und gehen dann bis zum Zeilenende). • Anschließend sind die auszuführenden Befehle. Tests - Befehle • Die Bash besitzt drei verschiedene Möglichkeiten, um Tests auszuführen: • test: Eingebauter Bash-Befehl, der es ermöglicht, Zeichenketten oder Zahlen miteinander zu vergleichen bzw. Dateien zu überprüfen. Üblicherweise gibt es auch einen eigenständigen Befehl (in Ubuntu /usr/bin/test). • [ ... ]: Das ist nur eine andere Syntax für den test-Befehl. Man muss dabei die schließende Klammer immer zwingend angeben. Auch dafür gibt es einen eigenständigen Befehl (in Ubuntu /usr/bin/[). • [[ ... ]]: Das ist eine Bash-Erweiterung der obigen Syntax, die die Verwendung angenehmer macht. Dieser Befehl ist eigentlich ein reserviertes Wort der Bash und wird daher von der Bash etwas anders verarbeitet als normale Befehle. Daher muss man Operatoren wie < und && nicht maskieren. Abgesehen davon können die gleichen Tests wie bei den obigen Varianten verwendet werden. Bezüglich der Unterschiede der drei Möglichkeiten siehe auch BashFAQ/031. • Verwendet wird wie üblich der Rückgabewert: 0 (wahr) bzw. 1 (falsch). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 70 von 95 Tests 1 Hier eine Auflistung der wichtigsten Tests: • • Dateiexistenz und Dateitypen: • -e Datei → Existiert die Datei? • -d Datei → Existiert die Datei und ist sie ein Verzeichnis? • -f Datei → Existiert die Datei und ist sie eine normale Datei? • -L Datei → Existiert die Datei und ist sie ein symbolischer Link? • -s Datei → Existiert die Datei und ist sie nicht leer? Zeichenketten: • -z String → Wahr, falls die Länge der Zeichenkette 0 ist. • -n String → Wahr, falls die Länge der Zeichenkette nicht 0 ist. • String1 = String2 → Wahr, falls beide Zeichenketten gleich sind. • String1 != String2 → Wahr, falls beide Zeichenketten nicht gleich sind. • String1 < String2 → Wahr, falls String1 lexikographisch vor String2 kommt. • String1 > String2 → Wahr, falls String1 lexikographisch nach String2 kommt. Tests 2 • Arithmetische Operatoren: Syntax: Argument1 OPERATOR Argument2 • -eq → Wahr, falls Argument1 gleich Argument2 ist. • -ne → Wahr, falls Argument1 ungleich Argument2 ist. • -lt → Wahr, falls Argument1 kleiner Argument2 ist. • -le → Wahr, falls Argument1 kleiner gleich Argument2 ist. • -gt → Wahr, falls Argument1 größer Argument2 ist. • -ge → Wahr, falls Argument1 größer gleich Argument2 ist. • Für einen Übersicht aller möglichen Tests siehe „CONDITIONAL EXPRESSIONS‘ in der Manpage der Bash oder help test. • Nützlich für Tests sind auch folgende zwei Bash-Befehle: • true → Hat als Rückgabewert immer 0 (wahr) • false → Hat als Rückgabewert immer 1 (falsch) Tests - Beispiele • Überprüfen, ob eine Datei existiert und eine reguläre Datei ist: $ [[ -f Datei ]] && echo ja || echo nein • Vergleichen von Zeichenketten: $ STR1="" $ STR2="hallo" $ STR3="HALLO" Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 71 von 95 $ [ $STR1 = "" ] && echo ja || echo nein -bash: [: =: unary operator expected nein $ [ "$STR1" = "" ] && echo ja || echo nein ja $ [[ "$STR1" = "" ]] && echo ja || echo nein ja $ [[ $STR2 < $STR3 ]] && echo ja || echo nein ja Ausgabebefehle (echo, printf) echo - Gibt die Argumente aus. » Optionen: -n → Keinen Zeilenumbruch ausgeben, -e → Auswertung von einigen maskierten Zeichen erlauben (z.B. \n – neue Zeile, \r – Wagenrücklauf, \t – Tabulator), -E → explizit die Auswertung von maskierten Zeichen unterdrücken. » Der Rückgabewert ist immer 0 außer ein Schreibfehler tritt auf. » $ echo a b c a b c $ echo -e "a\tb" a b printf - Formatiert die Argumente basierend auf einem Format. » Syntax: printf [-v Variable] Format [Argumente] » Option -v Variable → die Ausgabe wird der Variablen zugewiesen und nicht auf der Standardausgabe ausgegeben » Format ist eine Formatspezifikation gemäß man 1 printf. » $ printf "%s %5.2f\n" Hallo 5.3236 Hallo 5.32 $ printf "%7.2f\n" 5.333 4.888 5.33 4.89 Eingabebefehle (read) read - Liest eine Zeile von der Standardeingabe und teilt sie in Felder. » Syntax: read [Optionen] [Name ...] » Optionen: -p Prompt → einen Eingabeprompt anzeigen (ohne Zeilenumbruch), -s → Eingabe vom Terminal nicht ausgeben (z.B. für Passworteingabe), -t Timeout → nach einer bestimmten Anzahl von Sekunden die Eingabe abbrechen. » Die eingelesenen Felder werden den angegebenen Variablen zugewiesen, das letzte Feld bekommt alles, was übrig bleibt. Wird kein Variablenname angegeben, wird die Zeile in der Variablen REPLY gespeichert. » $ echo "a b c" | read a b c $ echo $a$b$c $ echo "a b c" | (read a b c && echo $a$b$c) abc $ read -p "Bitte um Eingabe: " -t 5 VAR && echo $VAR || echo Abbruch # keine Eingabe Bitte um Eingabe: Abbruch $ read -p "Bitte um Eingabe: " -t 5 VAR && echo $VAR || echo Abbruch Bitte um Eingabe: Hallo du Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 72 von 95 Hallo du if Verzweigung • if Liste; then Liste; [ elif Liste; then Liste; ] ... [ else Liste; ] fi • Eine if-Verzweigung wird in „Wenn - dann“-Fällen verwendet, d.h. wenn man auf Grund eines Rückgabewerts den Programmablauf entweder in die eine oder in die andere Richtung lenken will. • Eine Liste ist dabei eine Liste von Befehlen wie in „Arbeiten mit der Bash“ definiert. Die Listen bei if und elif entsprechen den Verzweigungsbedingungen. • • Die if Liste wird ausgeführt und wenn der Rückgabewert 0 ist, wird die then Liste ausgeführt. • Ansonsten wird jede (optionale) elif Liste der Reihe nach ausgeführt und wenn der Rückgabewert 0 ist, die zugehörige then Liste ausgeführt und der Befehl beendet. • Falls das auch nicht der Fall ist und es eine else Liste gibt, wird diese ausgeführt. • Der Rückgabewert ist der Rückgabewert des letzten ausgeführten Befehls oder 0, falls keine Bedingung wahr war. if Verzweigung - Beispiel • Hinweis: Eine Liste kann auch durch einen Zeilenumbruch abgeschlossen werden. Das erlaubt eine schönere Darstellung in einem Shell-Skript. • Als Beispiel werden wir ein Skript schreiben, dass von Fahrenheit in Celsius umrechnet und umgekehrt. Das Skript braucht zwei Argumente: Das erste Argument gibt die Skala für die Temperatur an (Fahrenheit oder Celsius) und das zweite Argument die Grad. Folgende Schritte braucht man für die Berechnung von Celsius aus Fahrenheit: 1. Die Temperatur in Fahrenheit nehmen und davon 32 abziehen. 2. Das Ergebnis durch 1.8 dividieren. 3. Das Ergebnis ist die Temperatur in Celsius. In Formeln zusammengefasst: • °C = (°F - 32) * 5/9 • °F = °C * 9/5 + 32 case Verzweigung • case Wort in [Muster [ | Muster ] ... ) Liste ;; ] ... esac • Eine case-Verzweigung wird verwendet, wenn es für ein Wort mehrere mögliche Werte gibt und abhängig davon bestimmte Befehle ausgeführt werden sollen. • • Das Wort und die Muster werden expandiert und es wird überprüft, ob das expandiert Wort auf ein expandiertes Muster nach den Regeln der Pfadexpansion (siehe „Arbeiten mit der Bash“) passt. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 73 von 95 • • Falls ein Muster passt, wird die entsprechende Liste ausgeführt und kein weiteres Muster wird überprüft (wenn ;; am Ende der Liste benutzt wird, es gibt auch noch andere Möglichkeiten, die wir hier nicht behandeln). • Der Rückgabewert ist 0, wenn kein Muster gepasst hat oder sonst der Rückgabewert des letzten ausgeführten Befehls der Liste. Wir schreiben nun das vorhin erstelle Programm um und verwenden jetzt case anstatt von if. for Schleife • for Name [in Wörter ... ] ; do Liste ; done for (( Ausdruck1 ; Ausdruck2 ; Ausdruck3 )) ; do Liste ; done • Eine for-Schleife wird verwendet, um Befehle eine bestimmte Anzahl an Durchläufen auszuführen. • • In der ersten Variante werden die Wörter expandiert. Dann wird die Variable Name der Reihe nach auf die einzelnen Worte gesetzt und jedes Mal die Liste an Befehlen ausgeführt. Wenn die Expansion nichts ergibt, wird als Rückgabewert 0 zurückgegeben, ansonsten ist der Rückgabewert der des letzten ausgeführten Befehls. • In der zweiten Variante wird zuerst Ausdruck1 arithmetische ausgewertet. Ausdruck2 wird solange ausgewertet, bis der Wert 0 herauskommt. Jedes Mal, wenn bei Ausdruck2 ein Wert ungleich 0 herauskommt (entspricht Rückgabewert 0), wird die Liste ausgeführt und Ausdruck3 arithmetisch ausgewertet. • Der Rückgabewert ist der Rückgabewert des letzten Befehls in der Liste oder 1, falls einer der Ausdrücke ungültig sein sollte. for Schleife - Beispiel • Als Beispiel werden wir ein Skript schreiben, dass alle Benutzernamen und IDs der Benutzer, die in einer Datei definiert sind, auflistet. Das Skript braucht als Argument die Datei, von der es die Daten lesen soll. Die Datei muss dabei dem Format der Datei /etc/passwd folgen. while/until Schleife • while Liste1; do Liste2; done until Liste1; do Liste2; done • Die while-Schleife dient zur Ausführung von Befehlen, solange eine Bedingung wahr ist. Die until -Schleife dient zur Ausführung von Befehlen, bis eine Bedingung wahr ist. • • Bei der while-Schleife werden die Befehle in Liste2 wiederholt ausgeführt, solange der letzte Befehl in Liste1 einen Rückgabewert von 0 hat. • Bei der until-Schleife werden die Befehle in Liste2 solange ausgeführt, bis der letzte Befehl in Liste1 einen Rückgabewert von 0 hat. • Der Rückgabewert ist in beiden Fällen der Rückgabewert des letzten ausgeführten Befehls der Liste2, oder 0, falls von Liste2 kein Befehl ausgeführt worden ist. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 74 von 95 • Wir schreiben nun das vorhin erstelle Programm um und verwenden jetzt while anstatt von for. Funktionen • name () Verbundbefehl function name [()] Verbundbefehl • Eine Shell-Funktion erlaubt das Zuweisen eines Namens zu einem Verbundbefehl und dessen Aufruf über diesen Namen (wie einen einfachen Befehl). Die Verwendung des reservierten Worts function ist optional; falls es nicht verwendet wird, muss das Klammernpaar angegeben werden. • Ruft man eine Funktion auf, so werden innerhalb der Funktion die übergebenen Argumente den Stellungsparametern temporär zugewiesen. • Mit Hilfe des Befehls local kann man eine Variable definieren, die nur innerhalb der Funktion gültig ist. • Der Rückgabewert einer Funktion, wenn sie ausgeführt wird, ist der Rückgabewert des letzten ausgeführten Befehls. • Mit Hilfe von declare [-f | -F] können alle definierten Funktionen aufgelistet werden. Funktionen - Beispiele • Jeder Verbundbefehl ist möglich, normalerweise verwendet man { ... ; }, damit Änderungen an Variablen innerhalb der Funktion auch im Aufrufkontext wirksam sind. $ A=5 $ testit () (A=7; echo Innerhalb: $A) $ echo $A; testit; echo $A 5 Innerhalb: 7 5 $ testit () { A=7; echo Innerhalb: $A ;} $ echo $A; testit; echo $A 5 Innerhalb: 7 7 • Das Verwenden von Stellungsparametern funktioniert wie üblich: $ function add { echo Parameter: $@; echo $(($1 + $2)); } $ add 4 6 Parameter: 4 6 10 Shell-Initialisierungsdateien • Beim Starten einer Shell werden meist bestimmte Initialisierungsdateien gelesen. Welche das sind, hängt von der Art des Aufrufs ab (interaktiv, nicht interaktiv, Login-Shell ja/nein) - siehe „INVOCATION“ in man bash. • Diese Initialisierungsdateien erlauben es, Shells systemweit bzw. benutzerspezifisch vorzukonfigurieren, z.B. durch Setzen von Variablen, Aliases und so weiter. Meist haben Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 75 von 95 verschiedene Shells auch verschiedene Initialisierungsdateien. • Interaktive Login-Shells lesen üblicherweise ~/.bash_profile und ~/.bash_login) /etc/profile und ~/.profile • Eine interaktive Bash-Nicht-Login-Shell liest /etc/bash.bashrc sowie ~/.bashrc. (Bash auch Wichtige Shell-Variablen 1 USER » Name des aktuellen Benutzers. PWD » Das aktuelle Arbeitsverzeichnis. PATH » Der Suchpfad für Programme (eine Liste von absolute Verzeichnispfaden, getrennt durch Doppelpunkte). CDPATH » Der Suchpfad für den cd-Befehl (nützlich, wenn man oft in bestimmte Unterverzeichnisse eines Verzeichnisses wechselt). HOME » Das Benutzerverzeichnis des aktuellen Benutzers. Wichtige Shell-Variablen 2 PS1, PS2 » Definition des primären und sekundären Prompts der Bash. IFS » Feldseparator der Bash (Internal Field Separator, wird zum Teilen von Wörtern verwendet, Standardwert ist <Leerzeichen><Tabulator><Zeilenvorschub>) EDITOR » Angabe des Standard-Texteditors (wird von vielen Programmen genutzt). LANG » Gibt die Sprache, Lokalisierung und die Zeichenkodierung an (z.B. en_US.UTF-8 oder de_AT.UTF8) TERM » Die Art des Terminals, in der die Shell läuft (z.B. screen oder xterm; Ausgabe der Informationen zum aktuellen Terminal mittels infocmp). Wichtige Geräte /dev/null » Beim lesenden Zugriff wird immer ein EOF (End of file) zurückgegeben, alle geschriebenen Daten werden weggeworfen (man 4 null). /dev/zero » Beim lesenden Zugriff wird immer das Byte 0 zurückgegeben, alle geschriebenen Daten werden weggeworfen (man 4 zero). /dev/full » Beim lesenden Zugriff wird immer das Byte 0 zurückgegeben, beim Schreiben tritt immer ein ENOSPC-Fehler auf (zum Testen von Programmen; man 4 zero). /dev/random, /dev/urandom » Beim lesenden Zugriff wird ein zufälliges Byte zurückgegeben. Falls der Entropie-Pool leer ist, blockiert das Gerät /dev/random, aber nicht /dev/urandom (das könnte eventuell Angriffe auf die generierten Zufallszahlen erlauben). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 76 von 95 Hilfreiche Befehle (alias, unalias, unset) alias - Definiert Aliase oder zeigt sie an. » Bash-interner Befehl. » Wird benutzt, um oft eingegebenen Standardoptionen automatisch zu setzen. Befehlen kürzere Namen zuzuordnen oder um » $ alias ls alias ls='ls --color=auto' $ alias z='ls -alF --color=auto' unalias - Entfernt Aliase. » Bash-interner Befehl. » $ unalias z $ alias z -bash: alias: z: not found unset - Löscht Variablen und Funktionen. » Bash-interner Befehl. » Löscht die angegebenen Variablen oder Funktionen. » $ VAR=5; echo $VAR 5 $ unset VAR; echo $VAR Hilfreiche Befehle (source, export) source bzw. . - Führt Befehle von einer Datei in der aktuellen Shell aus. » Bash-interner Befehl. » Syntax: source Dateiname [Argumente] oder . Dateiname [Argumente] » Wird z.B. von Ubuntu für das Setzen von Standardwerten für Startskripte benutzt. » $ echo "$ACTIVE_CONSOLES" $ . /etc/default/console-setup $ echo "$ACTIVE_CONSOLES" /dev/tty[1-6] export - Markiert Variablen für den automatischen Export an Subprozesse. » Bash-interner Befehl. » Wenn eine Variable definiert wird, ist sie nur für die aktuelle Shell und Subshells sichtbar. Erst durch das Markieren mittels export stehen Variablen auch ausgeführten Befehlen zur Verfügung. » Mit der Option -n kann man das Exportieren rückgängig machen. » $ VAR=Wert ; bash -c 'echo $VAR' $ export VAR ; bash -c 'echo $VAR' Wert $ export -n VAR ; bash -c 'echo $VAR' Hilfreiche Befehle (env, trap) env - Führt einen Befehl in einer modifizierten Umgebung aus. » Mit der Option - oder -i wird mit einer leeren Umgebung gestartet. » Der Befehl wird über die PATH Variable lokalisiert. » Nützlich in Shebangs, wenn der genaue Pfad zum Befehl unbekannt/nicht überall gleich ist. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 77 von 95 » $ env ruby -e "puts Hallo Welt" Hallo Welt $ env - VAR=wert /usr/bin/ruby -e "p ENV" {"VAR"=>"wert"} trap - Fängt Signale (und auch andere Ereignisse) ab. » Bash-interner Befehl; Syntax: trap Befehl SIGNAL... » Ist „Befehl“ eine leere Zeichenfolge, so wird der Signal-Handler auf den ursprünglichen Wert zurückgesetzt. » Mit der Option -p kann man sich alle aktuellen Signal-Handler anzeigen lassen. » $ trap "echo Signal HUP empfangen" SIGHUP $ kill -HUP $$ Signal HUP empfangen $ trap -p HUP trap -- 'echo Signal HUP empfangen' SIGHUP Hilfreiche Befehle (sleep, timeout) sleep - Wartet für die angegebene Anzahl an Sekunden. » Man kann auch Suffixe verwenden: s für Sekunden (default), m für Minuten, h für Stunden und d für Tage. » Die verwendete Zahl kann auch Kommastellen beinhalten. » $ date +"%S.%N"; sleep 0.05m; date +"%S.%N" 35.919635622 38.924289758 timeout - Bricht einen Befehl nach einer bestimmten Anzahl an Sekunden ab. » Suffixe wie bei sleep möglich (Sekunden sind default). » Optionen: -s Signal → legt das Signal fest (default TERM), das an den Befehl geschickt werden soll. » Der Rückgabewert ist der Rückgabewert des Befehls, oder 124, falls der Befehl abgebrochen wurde. » $ timeout 2 sleep 3 $ echo $? 124 Hilfreiche Befehle (seq) seq - Gibt eine Sequenz von Zahlen aus. » Sehr nützlich für Schleifen. » Syntax: seq [STARTZAHL] [INKREMENT] ENDZAHL » Die Standardwerte für STARTZAHL und INKREMENT sind 1, wenn sie nicht gesetzt werden. » Optionen: -w → gleiche Breite durch Anfügen von Nullen » $ seq 4 1 2 3 4 $ seq 8 2 12 8 10 12 $ seq -w 8 2 12 Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 78 von 95 08 10 12 Hilfreiche Befehle (exec, locate) exec - Ersetzt die Shell durch einen Befehl. » Bash-interner Befehl. » Wird öfters in Shell-Skripts verwendet, wenn das Skript am Ende einen Befehl ausführen soll, damit kein unnötiger Shell-Prozess existiert. » $ exec vi locate - Sucht Dateien über ihren Namen. » Syntax: locate [OPTIONEN] MUSTER... » Benutzt eine Datenbank, durchsucht also im Gegensatz zu find nicht das Dateisystem. Die Datenbank wird regelmäßig durch einen cron-Job aktualisiert. » Es können Shell-Patterns oder reguläre Ausdrücke benutzt werden. Achtung: Falls kein Pattern benutzt wird, wird automatisch nach „*MUSTER*“ gesucht! » Optionen: -b → Nur in Dateinamen suchen, nicht im ganzen Pfad » $ locate -b '\passwd' /etc/passwd /etc/cron.daily/passwd /etc/pam.d/passwd /usr/bin/passwd /usr/share/bash-completion/completions/passwd /usr/share/doc/passwd /usr/share/lintian/overrides/passwd Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Bedingungen 3.0 Seite 79 von 95 Foliensatz 9 Kryptographische Grundlagen und Anwendungen (GPG, OpenSSH) Inhalt • Kryptographische Grundlagen • Schlüsseltauschprotokolle • Symmetrische Verschlüsselung • Asymmetrische Verschlüsselung • Kryptographische Hashfunktionen • GNU Privacy Guard (GPG) • OpenSSH Kryptographische Grundlagen Wir werden uns jetzt kurz mit den Grundlagen zu Schlüsselaustauschprotokollen, symmetrischer Verschlüsselung, asymmetrischer Verschlüsselung und kryptographischen Hashfunktionen beschäftigen und diese dann in Anwendungen betrachten. Die Sicherheit dieser Verfahren liegt unter anderem in mathematischen Problemen, die nur mit extrem viel Zeitaufwand zu lösen sind. Mit Hilfe einer Kombination dieser Verfahren kann man Daten zwischen zwei Personen oder Programmen sicher austauschen. Z.B. wird eine sichere Verbindung zu einem Server im Groben so aufgebaut: • Der Client authentifiziert den Server anhand von Signaturen (asymmetrischen Verschlüsselung). • Der Client und der Server verwenden ein Schlüsseltauschprotokoll um einen Schlüssel zu generieren. • Der Schlüssel wird für die Verschlüsselung der weiteren Kommunikation mittels symmetrischer Verfahren eingesetzt. Schlüsselaustauschprotokoll • Bevor zwei Parteien ein symmetrisches Verschlüsselungsverfahren verwenden können, müssen sie einen gemeinsamen Schlüssel haben. • Ein Schlüsselaustauschprotokoll beschreibt, wie über ein unsicheres Medium (z.B. das Internet) ein Schlüssel ausgehandelt werden kann, ohne dass lauschende Dritte den Schlüssel bekommen. • Ein bekanntes Verfahren ist der Diffie-Hellman-Schlüsseltausch. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 80 von 95 Diffie-Hellman-Schlüsseltausch • Alice und Bob einigen sich auf eine Primzahl p und einen Erzeuger g der zyklischen Gruppe der Ordnung p. Sowohl p als auch g sind öffentliche Daten, d.h. ein Angreifer kann diese Daten wissen. • Alice und Bob wählen zufällig private Zahlen a und b, die kleiner sind als p. • Alice berechnet nun A = g^a mod p und Bob B = g^b mod p. Anschließend werden A und B ausgetauscht (sind wieder öffentliche Daten). • Alice kann nun K1 = B^a mod p berechnen und Bob K2 = A^b mod p. Auf Grund von K1 = B^a mod p = g^b^a mod p = g^a^b mod p = A^b mod p = K2 haben Alice und Bob den gleichen Wert berechnet, der nun als Schlüssel für ein symmetrisches Verfahren verwendet werden kann. Sicherheit des Diffie-Hellman-Schlüsseltauschs • Die Sicherheit des Verfahrens basiert auf der Annahme, dass es sehr schwierig ist, bei Bekanntsein von g, p, A = g^a mod p und B = g^b mod p den Wert K = g^a^b mod p zu berechnen (ohne zu wissen, was a und b ist). • Eng verwandt ist das Diskrete-Logarithmus-Problem: Ist g, p und A = g^a mod p bekannt, wie kann a berechnet werden? • Weiters muss man sicherstellen, dass ein Angreifer (Mallory) die ausgetauschten Daten nicht modifizieren kann. Könnte er das, so wäre eine Man-in-the-Middle-Attacke möglich, bei der im Prinzip zweimal ein Schlüsseltausch durchgeführt wird: einmal zwischen Alice und Mallory und einmal zwischen Mallory und Bob. Symmetrische Verschlüsselung • Ein symmetrisches Verschlüsselungsverfahren benötigt einen Schlüssel, der beiden Parteien bekannt sein muss. Dies ist auch der große Nachteil dabei. • Der Vorteil von symmetrischen Verfahren ist hingegen die höhere Geschwindigkeit, mit der Daten ver- und entschlüsselt werden können. • Symmetrische Verfahren werden schon seit sehr langer Zeit eingesetzt. Ein bekanntes, mehr als 2000 Jahre altes, aber sehr unsicheres, Verfahren ist die Cäsar-Verschlüsselung (a → c, b → d, c → e, …). • Symmetrischen Verfahren kann man in Blockchiffren und Stromchiffren Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 unterteilen. Bei Seite 81 von 95 Blockchiffren werden Blöcke fixer Länger wieder auf Blöcke fixer Länge abgebildet und Blöcke durch verschiedene Betriebsmodi miteinander verbunden. Stromchiffren verknüpfen Zeichen des Klartextes mit Zeichen eines Schlüsselstroms, brauchen kein Padding wie Blockchiffren und sind (bei längeren Klartexten) schneller, weil der Schlüsselstrom vorab berechnet werden kann. • Bekannte symmetrische Verfahren sind RC4 , DES und AES. Sowohl RC4 als auch DES sollten, wenn möglich, nicht mehr eingesetzt werden (auf Grund von veröffentlichten Angriffen bzw. weil nur kurze Schlüssellängen möglich sind). Asymmetrische Verschlüsselung • Unter asymmetrischer Verschlüsselung bzw. Public-Key-Verschlüsselung versteht man Verfahren, die auf zwei Schlüsseln aufbauen: Einem öffentlichen Schlüssel und einem privaten Schlüssel. Der öffentliche Schlüssel kann (soll) beliebig verteilt werden, der private Schlüssel muss aber sicher verwahrt werden. • • Asymmetrische Verfahren dienen sowohl zum Verschlüsseln (Geheimhaltung) als auch zum Signieren (Authentizität): • Durch die Verschlüsselung mittels des öffentlichen Schlüssels können Daten geheim gehalten werden; nur der Inhaber des privaten Schlüssels kann die Daten entschlüsseln. • Mit dem privaten Schlüssel erstellte Signaturen können von jedem, der den öffentlichen Schlüssel kennt, verifiziert werden. Damit wird sicher gestellt, dass die Daten tatsächlich vom Inhaber des privaten Schlüssels stammen. Bekannte asymmetrische Verfahren sind RSA, DSA und ECDSA. RSA • Das RSA-Verfahren (benannt nach Ronald Rivest, Adi Shamir und Leonard Adleman) wurde schon 1977 veröffentlicht und war das erste veröffentlichte asymmetrische Verfahren. Es wird sowohl zum Verschlüsseln als auch zum Signieren verwendet. • Beim Verschlüsseln werden die Daten üblicherweise nicht direkt mit RSA verschlüsselt, sondern es wird ein symmetrisches Verfahren verwendet; nur der zugehörige Schlüssel wird mit RSA verschlüsselt. So eine Kombination wird als Hybridverfahren bezeichnet. Genauso wird beim Signieren nur ein Hashwert der Daten signiert und nicht die Daten selbst. RSA Schlüsselerzeugung und Verwendung • Erzeugung des Schlüsselpaares: • Wähle zwei zufällige Primzahlen p und q gleicher Größenordnung. • Berechne N = p * q und die Eulersche φ-Funktion von N, φ(N) = (p-1) * (q-1). • Wähle eine zu φ(N) teilerfremde Zahl e und berechne daraus d mittels e * d = 1 mod φ(N). Das Zahlenpaar (e, N) ist der öffentliche Schlüssel und (d, N) der private Schlüssel. • Verwendung: Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 82 von 95 • Verschlüsselung von m: c = m^e mod N, wobei c der Geheimtext ist. • Entschlüsselung von c: m = c^d mod N Wichtig: Es können immer nur Werte m verschlüsselt werden, die kleiner als N sind! Signieren entspricht dem zweiten Schritt und Verifizieren der Signatur dem ersten. Der Beweis benötigt unter anderem den Satz von Euler-Fermat. Sicherheit von RSA • • Die Sicherheit von RSA basiert auf zwei Annahmen: • Die Schwierigkeit beim Entschlüsseln eines Geheimtextes besteht im Ziehen der e-ten Wurzel modulo N. • Die Schwierigkeit beim Finden des privaten Schlüssels besteht beim Berechnen der Eulerschen φ-Funktion von N (ohne Kenntnis der Faktoren p und q). In der Praxis muss noch auf mehr aufgepasst werden, damit RSA sicher ist. Zum Beispiel müssen p und q zusätzliche Auflagen erfüllen und dem Klartext muss ein Padding hinzugefügt werden, um bestimmte Angriffe zu verhindern. Daher sollte man eine geteste und breit eingesetzte Bibliothek verwenden und RSA nicht selbst implementieren. Kryptographische Hashfunktionen • Eine Hashfunktion ist eine Funktion, die eine Zeichenfolge beliebiger Länge auf eine Zeichenfolge fixer Länge abbildet. Dabei kann es zu Kollisionen kommen, wenn zwei unterschiedliche Datensätze den selben Hashwert erzeugen. • Kryptographische Hashfunktionen sind Hashfunktionen, die zusätzliche Merkmale erfüllen, z.B.: • Für einen gegebenen Hashwert soll es schwer sein, die zugehörigen Daten zu finden (Stichwort Einwegfunktionen). • Hat man Daten und den zugehörigen Hashwert, so soll es schwer sein, andere Daten zu finden, die den gleichen Hashwert erzeugen. • Es soll allgemein schwer sein, verschiedene Datensätze zu finden, die den selben Hashwert erzeugen (Kollisionsresistenz). Kryptographische Hashfunktionen - Beispiele • Eine der bekanntesten kryptographischen Hashfunktionen ist MD5 (128 Bit), aber diese sollte nicht mehr verwendet werden, nachdem mittlerweile schon einige Angriffe darauf bekannt sind. • Eine Familie von kryptographischen Hashfunktionen ist unter dem Acronym SHA (Secure Hash Algorithm) bekannt. Diese Familie umfasst SHA-1 (160 Bit; mittlerweile auch schon sehr unsicher!), SHA-2 (mit Längen von 224, 256, 384 und 512 Bit) sowie seit Sommer 2015 SHA-3. • Unter Linux gibt es für die genannten Hashfunktionen die Befehle md5sum, sha1sum, sha256sum, sha224sum, sha384sum und sha512sum. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 83 von 95 Gnu Privacy Guard • Der Gnu Privacy Guard (GnuPG or GPG) ist eine freie Implementierung des OpenPGP-Standard (RFC 4880). Er wird zum Verschlüsseln und/oder Signieren von Daten verwendet. • GPG unterstützt sowohl symmetrische Verschlüsselungsverfahren als auch asymmetrische Verfahren. • Symmetrische Verfahren sind, wie schon erwähnt, schneller beim Ver- und Entschlüsseln und eignen sich z.B. zum Verschlüsseln von persönlichen Daten, da man nur selbst den Schlüssel (z.B. eine Passphrase) wissen muss. • GPG in Kombination mit asymmetrischen Verfahren wird z.B. für das Verschlüsseln und Signieren von E-Mails eingesetzt oder zum Signieren von Softwarepaketen, um vor der Installationen die Authentizität prüfen zu können. • Das Programm gpg ist das CLI-Programm für GPG. Es ist auch über Plugins in die meisten E-MailProgramme integriert und es gibt eine Vielzahl an graphischen Programmen. • Eine gute Einführung zur Verwendung von GPG bietet Das GNU-Handbuch zum Schutze der Privatsphäre. Gnu Privacy Guard - Schlüsselpaar erzeugen • Mit Hilfe von gpg --gen-key kann man ein Private/Public-Schlüsselpaar erstellen. Dabei wird man nach mehreren Informationen wie z.B. Name und E-Mail-Adresse gefragt. Diese Angaben dienen zur Identifikation der Person hinter dem Schlüssel und können auch später noch verändert werden. Achtung: Der Vorgang kann sehr lange dauern, weil viele Zufallszahlen benötigt werden! Als „Trick“, um den Entropiepool des Kernels zu erhöhen, funktioniert z.B. sudo dd if=/dev/sda of=/dev/random. • Gleich nach Erstellung des Schlüsselpaars sollte man ein Widerrufszertifikat erzeugen (und sicher verwahren), mit dem man im Fall des Falles das Schlüsselpaar als ungültig erklären kann. Für die Erzeugung des Zertifikats benutzt man gpg --output revocation.cert --gen-revoke KEY_ID und für das Invalidieren gpg --import revocation.cert. KEY_ID ist dabei entweder die ID des Schlüssels oder z.B. die eingegebene E-Mailadresse. • Siehe auch die Seite E-Mail-Selbstverteidigung des FSF. Gnu Privacy Guard - Schlüssel austauschen • Um mit anderen Personen nun sicher kommunizieren zu können, muss man natürlich deren öffentlichen Schlüssel besitzen bzw. müssen diese den eigenen öffentlichen Schlüssel besitzen. Alle Schlüssel werden bei GPG im sogenannten Schlüsselbund hinterlegt. • Um Schlüssel auszutauschen kann man den eigenen öffentlichen Schlüssel in eine Datei exportieren und diese dann anderen Personen zukommen lassen. Das wird über gpg --output pubkey.gpg --export KEY_ID erledigt. Benutzt man zusätzlich die Option --armor wird die Ausgabedatei im ASCII-Format erzeugt (--armor und --output funktionieren auch bei den meisten anderen Aufrufen von gpg, bei denen eine Ausgabe erzeugt wird). • Eine Datei mit einem öffentlich Schlüssel lässt sich wiederum mittels gpg --import pubkey.gpg in den eigenen Schlüsselbund importieren. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 84 von 95 • Es gibt auch Schlüsselserver, auf die man öffentliche Schlüssel hochladen kann, damit sie dann von anderen Personen leichter gefunden werden können. Um Schlüssel zu suchen wird gpg --search -keys NAME verwendet, um einen öffentliche Schlüssel hochzuladen gpg --send-keys KEY_ID. Dabei wird der Standardschlüsselserver von GPG verwendet. Gnu Privacy Guard - Authentisieren von Schlüsseln • Bei der Erzeugung eines Schlüsselpaars können beliebige Daten eingeben werden und es könnte sich jemand für jemand anderen ausgeben. • Um das zu verhindern, überprüft man den Fingerabdruck des öffentlichen Schlüssels, den man z.B. aus dem Internet herunter geladen hat, mit dem Fingerabdruck, den man von der Person direkt (z.B. über ein Telefon) bekommen hat. Stimmen die Werte überein, so signiert man den öffentlichen Schlüssel mit dem eigenen privaten Schlüssel, um spätere Änderungen entdecken zu können. Um diese Aufgaben zu erledigen, verwendet man gpg --edit-key KEY_ID. Zuerst überprüft man mit dem Befehl „fpr“, ob der Fingerabdruck passt und anschließend verwendet man den Befehl „sign“ zum Signieren. Gnu Privacy Guard - Web of Trust • Eine andere Möglichkeit, einem öffentlichen Schlüssel zu vertrauen, ist über das sogenannte Web of Trust. Dabei vertraut man einem Schlüssel einer Person nicht direkt, sondern dewegen, weil eine oder mehrere vertrauenswürdige Personen ihn signiert haben. • Um der Signatur eines bestimmten Schlüssel zu vertrauen, wird gpg --edit-key KEY_ID und der Befehl „trust“ verwendet. Es gibt vier Vertrauensstufen: • Unbekannt (es ist nichts über die Vertrauenswürdigkeit bekannt) • Kein Vertrauen • Teilweises Vertrauen • Volles Vertrauen Ein Schlüssel gilt dann als vertrauenswürdig, wenn man ihn selbst signiert hat, eine Person vollen Vertrauens ihn signiert hat oder drei Personen, denen man teilweise vertraut, ihn signiert haben. Gnu Privacy Guard - Schlüsselpaare verwalten • Auch nach dem Erstellen eines Schlüsselspaar kann man dessen Information ändern, sowohl beim privaten als auch beim öffentlichen Schlüssel. Dazu wird gpg --edit-key KEY_ID und anschließend der gewünschte Befehl ausgeführt. • Mit Hilfe von „adduid“ kann man eine neu Identität (Name und E-Mailadresse) dem Schlüssel hinzufügen. Ähnlich dazu erlaubt der Befehl „addkey“ das Hinzufügen von zusätzlichen SubSchlüsseln. • Über die Befehle „deluid“ und „delkey“ könnten Identitäten und Sub-Schlüssel gelöscht werden, es ist aber meist besser, über „revuid“ und „revkey“ die Identitäten und Sub-Schlüssel zu widerrufen, vor allem, wenn man den öffentlichen Schlüssel schon verteilt hat. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 85 von 95 • Mit Hilfe von gpg --list-keys können alle öffentlichen Schlüssel, mittels gpg --list-secret-keys alle privaten Schlüssel angezeigt werden. Gnu Privacy Guard - Ver- und Entschlüsselung von Daten • Ver- und entschlüsseln mit symmetrischen Schlüssel: $ echo "test" | gpg --symmetric > test.gpg # Es wird nach einer Passphrase gefragt $ gpg --decrypt test.gpg gpg: CAST5 encrypted data gpg: encrypted with 1 passphrase test gpg: WARNING: message was not integrity protected • Ver- und entschlüsseln mit asymmetrischen Schlüssel: $ echo "test" | gpg --encrypt -r thomas.leitner@univie.ac.at > test.gpg $ gpg --decrypt test.gpg You need a passphrase to unlock the secret key for user: "Thomas Leitner <thomas.leitner@univie.ac.at>" 4096-bit RSA key, ID FD0F6282, created 2013-09-20 (main key ID 0DDDA7A3) gpg: encrypted with 4096-bit RSA key, ID FD0F6282, created 2013-09-20 "Thomas Leitner <thomas.leitner@univie.ac.at>" test • Man kann auch gleichzeitig --encrypt --symmetric verwenden, dann ist eine Entschlüsselung über eine Passphrase oder einen privaten Schlüssel möglich. Gnu Privacy Guard - Erstellen von Signaturen • Signaturen können mittel --sign ohne oder mit Verschlüsselung erstellt werden. Mit der Option -u | --local-user kann der Signaturschlüssel bestimmt werden. Mittels --verify kann eine erstelle Signatur überprüft werden. $ echo "test" | gpg --symmetric --sign -u thomas.leitner@univie.ac.at > test.gpg $ gpg --decrypt test.gpg gpg: CAST5 encrypted data gpg: encrypted with 1 passphrase test gpg: Signature made Mit 25 Nov 2015 08:33:01 CET using RSA key ID 0DDDA7A3 gpg: Good signature from "Thomas Leitner <thomas.leitner@univie.ac.at>" gpg: WARNING: message was not integrity protected • Es gibt auch die Möglichkeit einer Klartextsignatur mittels der Option --clearsign, was vor allem beim Signieren von E-Mails eingesetzt wird. $ echo "test" | gpg --clearsign -u thomas.leitner@univie.ac.at -----BEGIN PGP SIGNED MESSAGE----Hash: SHA512 test -----BEGIN PGP SIGNATURE----Version: GnuPG v1 Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 86 von 95 iQIcBAEBCgAGBQJWVWSrAAoJEHEzUoEN3aejU4cQAJzmsYDp9e0i+SaQ+ZizGccK [...] -----END PGP SIGNATURE----- Gnu Privacy Guard - gpg-agent • Damit die Sicherheit der privaten Schlüssel gewährt ist, sind diese mit einer Passphrase versehen. Allerdings kann es mühsam sein, ständig diese Passphrase einzugeben. Abhilfe schafft das Programm gpg-agent, welches die Passphrase zwischenspeichert. • Das Programm benötigt ein zusätzliches Programm pinentry zur Abfrage der Passphrase. Es gibt dafür Varianten für die Kommandozeile und für GUIs. Über verschiedene Optionen kann festgelegt werden, wie lange Passphrasen gespeichert sind. • Falls gpg-agent nicht schon beim Starten der Shell/Desktop-Umgebung mitgestartet wird, kann es so gestartet werden: $ eval $(gpg-agent --daemon) # Damit die Umgebungsvariable gesetzt werden. $ # jetzt wird gpg-agent automatisch verwendet Secure Shell (SSH) • Um sich auf einem anderen Rechner einzuloggen, wurde früher telnet verwendet und ab circa 1983 vermehrt rlogin bzw. rsh. Beide Programm haben aber einige Sicherheitsprobleme und sollten daher nicht mehr benutzt werden! • Im Jahr 1995 wurde dann die Secure Shell (SSH) entwickelt, um ein sicheres Einloggen auf anderen Rechnern zu gewährleisten. Das Programm wurde ursprünglich frei zur Verfügung gestellt, später aber entwickelte es sich in Richtung einer proprietären Software. • Daher wurde ab 1999 ausgehend von einer freien Version des ursprünglichen Programms die Software OpenSSH entwickelt, die mittlerweile Standard auf Linux- und BSD-Systemen geworden ist. • SSH benutzt ein asymmetrisches Kryptosystem zum Authentifizieren des entfernten Rechners. Weiters wird der Datenverkehr zwischen Client und Server symmetrisch verschlüsselt, wobei der Schlüssel über den Diffie-Hellman-Schlüsseltausch erzeugt wird, und Benutzer können sich entweder mittels Benutzername und Passwort oder mit Hilfe von Public-Key-Authentifizierung anmelden. OpenSSH - Verbindung aufbauen 1 • Mittels des Befehls ssh USER@SERVER kann eine Verbindung zum Server „SERVER“ als Benutzer „USER“ aufgebaut werden. Hat alles funktioniert, ist man eingeloggt und hat eine Shell vor sich. • Wird das erste Mal eine Verbindung zu einem SSH-Server aufgebaut, wird man zum Überprüfen des Host-Schlüssels und zur Speicherung dessen aufgefordert: $ ssh praxis@localhost The authenticity of host 'localhost (127.0.0.1)' can't be established. ECDSA key fingerprint is c0:72:d4:4c:c0:06:e0:f8:2e:8f:88:ce:b6:2b:af:b1. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'localhost' (ECDSA) to the list of known hosts. • Der Host-Schlüssel dient zur Authentifizierung des SSH-Servers, damit sichergestellt ist, dass Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 87 von 95 wirklich mit dem beabsichtigten SSH-Server kommuniziert wird. Alle Host-Schlüssel werden in der Datei ~/.ssh/known_hosts abgelegt. • Technisch: Bei der Authentifizierung des SSH-Servers wird gleichzeitig per Diffie-HellmanSchlüsseltausch ein Schlüssel erzeugt und mit diesem die weitere Verbindung verschlüsselt. Damit kein Man-in-the-middle-Angriff passieren kann, signiert der SSH-Server den DH-Wert des Clients. Damit haben beide Seiten einen gemeinsamen Schlüssel und der Client kann dadurch den Server authentifizieren. OpenSSH - Verbindung aufbauen 2 • Ändert sich der Host-Schlüssel, so wird automatisch eine Warnung angezeigt und ein Einloggen verhindert: $ ssh praxis@localhost @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ @ WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED! @ @@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@ IT IS POSSIBLE THAT SOMEONE IS DOING SOMETHING NASTY! Someone could be eavesdropping on you right now (man-in-the-middle attack)! It is also possible that a host key has just been changed. The fingerprint for the ECDSA key sent by the remote host is 9a:63:2a:e1:26:13:fb:5c:38:af:b5:2e:6f:6a:88:39. Please contact your system administrator. Add correct host key in /home/praxis/.ssh/known_hosts to get rid of this message. Offending ECDSA key in /home/praxis/.ssh/known_hosts:4 remove with: ssh-keygen -f "/home/praxis/.ssh/known_hosts" -R localhost ECDSA host key for localhost has changed and you have requested strict checking. Host key verification failed. • Wie in der Fehlermeldung beschrieben, kann mittels ssh-keygen -R SERVER der falsche HostSchlüssel gelöscht werden. Das darf aber nur gemacht werden, wenn sich der Host-Schlüssel wirklich geändert hat! OpenSSH - Public-Key-Authentifizierung • Für die Authentifizierung des Benutzers bietet OpenSSH mehrere Möglichkeiten, die meist genutzten sind Authentifizierung über ein Passwort bzw. über einen öffentlichen Schlüssel. • Die Verwendung von Public-Key-Authentifizierung ermöglicht ein sicheres und passwortloses Einloggen auf einem Rechner. Daher sollte man diese Authentifizierungsmethode bevorzugen. • OpenSSH unterstützt verschiedene Algorithmen für die Public-Key-Authentifizierung. RSA war der ursprüngliche Algorithmus, später kamen DSA und ECDSA hinzu. • Derzeit kann nur rohe Gewalt angewandt werden, um die Schlüssel zu knacken, egal welcher Algorithmus verwendet wird. Es empfiehlt sich daher immer einen Schlüssel mit möglichst vielen Bits zu verwenden (je länger der Schlüssel, desto schwieriger ist er zu knacken; z.B. RSA 2048 Bit, DSA 1024 Bit, ECDSA 521 Bit). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 88 von 95 OpenSSH - Erzeugen eines Schlüsselpaars • Das Programm ssh-keygen erlaubt das Erzeugen/Verwalten eines Public/Private-Schlüsselpaars. • Mit der Option -t rsa|dsa|ecdsa kann man den Algorithmus auswählen und mit -b Bits die Schlüssellänge. • Beim Erstellen des Schlüsselpaares fragt das Programm nach dem Speicherort und nach einer Passphrase. Man muss nicht zwingend eine Passphrase eingeben, es empfiehlt sich aber, da sonst jeder die Schlüssel verwenden kann, der in Besitz der Dateien kommt. • Der private und der öffentliche Schlüssel werden von ssh-keygen in das Verzeichnis ~/.ssh/ gespeichert, wenn man keinen anderen Speicherort auswählt, und mit Hilfe des Programms sshcopy-id kann der öffentliche Schlüssel auf einen Rechner übertragen werden. $ ssh-keygen -t dsa -b 1024 $ ssh-copy-id -i ~/.ssh/id_dsa.pub USER@SERVER OpenSSH - ssh-agent • Damit man nicht jedes Mal die Passphrase für den Schlüssel eingeben muss, kann man das Programm ssh-agent benutzen. Dieses speichert die Passphrasen für einen oder mehrere Schlüssel, die man mit Hilfe von ssh-add hinzufügt. • Üblicherweise wird das Programm automatisch beim Starten einer graphischen Oberfläche mitgestartet. Falls nicht, kann man das Programm auch später in der Shell starten. Dabei ist darauf zu achten, dass die ausgegebenen Umgebungsvariablen in die Prozessumgebung der Shell aufgenommen werden. $ eval $(ssh-agent) Agent pid 2789 $ ssh-add Enter passphrase for /home/thomas/.ssh/id_dsa: Identity added: /home/thomas/.ssh/id_dsa (/home/thomas/.ssh/id_dsa) OpenSSH - Clientprogramm 1 • Wie besprochen, wird das Clientprogramm ssh wird zum Einloggen auf einem entfernten Rechner verwendet. • Mit Hilfe der Option -o können beliebige SSH-Client-Optionen angegeben werden. Nützlich sind oft die folgenden: • PubkeyAuthentication → zum Ein-/Ausschalten der Public-Key-Authentifizierung • PasswortAuthentication → zum Ein-/Ausschalten der Passwortauthentifizierung • StrictHostKeyChecking → damit die Host-Schlüssel nicht überprüft werden In der Datei ~/.ssh/config können SSH-Client-Optionen für alle Verbindungen oder für Verbindungen zu speziellen Hosts konfiguriert werden. • Daneben unterstützt es auch noch das Weiterleiten von X11-Verbindungen sowie z.B. PortForwarding. # X11-Weiterleitung bei einer Verbindung aktivieren $ ssh -Y login.example.com Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 89 von 95 # Zugriff auf einen nicht öffentlichen Webserver über http://localhost:1234 $ ssh -L 1234:webserver.internal.example.com:80 login.example.com OpenSSH - Clientprogramm 2 • Mit Hilfe des Programms scp kann man Dateien von einem Rechner über SSH auf einen anderen übertragen: $ scp -r user@example.com:/data/my_dir . • Falls das SFTP-Modul am SSH-Server aktiviert worden ist, kann man auch ähnlich zum klassichen FTP Dateien vom oder zum Server übertragen (WinSCP ist ein gutes Windowsprogramm dafür). • Es gibt auch einige interessante Projekte, die auf SSH aufsetzen. Ein sehr nützliches ist sshuttle, welches eine Art VPN aufbaut und dazu nur SSH und einen installierten Python-Interpreter auf dem Server braucht. Links: OpenSSH WikiBook, SSH Tricks, SSH Can Do That? Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Bedingungen 3.0 Abweichendes Copyright von Inhalten: • Die Grafik „Diffie-Hellman Man-in-the-Middle-Angriff“ steht unter der CC BY-SA 2.5 Lizenz. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 90 von 95 Foliensatz 10 Terminalmultiplexer, sonstige Befehle Inhalt • Terminalmultiplexer • Nützliche Befehle Terminalmultiplexer • Ein Terminalmultiplexer ist ein Programm mit dem man mehrere Pseudoterminals über ein Terminalprogramm benutzen kann. Damit kann man, ähnlich wie bei einer graphischen Oberfläche, mehrere Programme gleichzeitig nutzen und zwischen ihnen wechseln. • Zusätzlich bieten viele Terminalmultiplexer noch folgende Funktionalitäten: • Trennen einer Sitzung vom Terminalprogramm, ohne die Sitzung zu schließen. Dadurch kann später wieder auf die Sitzung zugegriffen werden, ohne dass die Programme neu gestartet (bzw. beendet) werden müssen. • Teilen des Terminalfensters in mehrere Bereiche. Damit können im Terminalfenster gleichzeitig mehrere Programme nebeneinander angezeigt werden. • Zugriff auf eine Sitzung von mehreren Rechnern aus. Dadurch kann eine Sitzung von mehreren Personen gleichzeitig genutzt werden. • Zwei sehr bekannte Terminalmultiplexer sind tmux und GNU Screen. tmux - Grundlagen • tmux besteht aus einem Server, der alle Sitzungen (es kann mehr als eine geben) verwaltet, und aus Clients, die sich zum Server verbinden und eine Sitzung anzeigen. In einer Sitzung können mehrere Fenster verwendet werden, die wiederum in Bereiche unterteilt werden können. • Zum Starten eines Clients wird tmux aufgerufen. Falls der tmux-Server noch nicht läuft, wird dieser zusätzlich gestartet. Dann wird der Client mit dem Server verbunden und eine neue Sitzung mit einem neuen Fenster erstellt. • Will man sich zu einer existierenden Sitzung verbinden, so benutzt man tmux attach. Optional kann mit -t Sitzung die Sitzung angegeben werden, zu der man sich verbinden möchte. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 91 von 95 tmux - Tastenkombinationen • Innerhalb einer Sitzung kann man tmux mit Tastenkombinationen steuern. Dazu muss man den Prefix Strg-b (ist veränderbar) und dann eine oder mehrere Tasten drücken. Einige wichtige sind: • c → Ein neues Fenster erzeugen • l → Zum letzten aktiven Fenster wechseln • n → Zum nächsten Fenster wechseln • p → Zum vorigen Fenster wechseln • 0 bis 9 → Zum angegebenen Fenster wechseln • “ → Das Fenster in zwei Bereiche, oben und unten, teilen • % → Das Fenster in zwei Bereiche, links und rechts, teilen • ; → Zum letzten aktiven Bereich wechseln • o → Zum nächsten Bereich wechseln • x → Den aktuellen Bereich entfernen • d → Client von Sitzung trennen und beenden • : → tmux Kommandozeile aufrufen, um einen beliebigen tmux-Befehl auszuführen tmux - Anwendungen • Benutzt man ssh, um sich zu einem Server zu verbinden, macht es Sinn, dort tmux zu starten, wenn man länger arbeitet. Einerseits ist es dann kein Problem, wenn das Netzwerk kurzzeitig ausfällt, und andererseits kann man z.B. lang laufende Prozesse in einem Fenster starten und in einem anderen normal weiterarbeiten. • Auch auf dem eigenen Rechner macht tmux Sinn. Beendet man z.B. versehentlich das Terminalprogramm, so braucht man nur ein neues starten und sich anschließend mit der tmuxSitzung verbinden. Weiters ist es auch sehr praktisch für Demonstrationen, da man z.B. ein Terminalprogramm mit der tmux-Sitzung am Beamer und eines mit der gleichen Sitzung am Rechnerbildschirm anzeigen lassen kann. • Das Arbeiten mit mehreren Bereichen ist z.B. nützlich beim Programmieren (von Shell-Skripts). In einem Bereich startet man einen Editor (z.B. vim) und in dem anderen kann man das Programm testen. Befehle als anderer Benutzer ausführen - sudo, su su - Wechselt den Benutzer oder wechselt zum Superuser (root). » Syntax: su [Optionen] [Benutzername] (ohne Benutzername wird man root). » Man muss das Passwort des Benutzers wissen, auf den man wechseln will! » Optionen: -/-l → Login-Shell des Benutzers verwenden. » $ su Passwort: root@noweto:~# sudo - Führt Befehle mit den Rechten eines anderen Benutzers aus. » Syntax: sudo [Optionen] [Befehl]. » Standardmäßig werden die Befehle als root ausgeführt. » Konfigurationsdatei ist /etc/sudoers (editieren mit visudo). Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 92 von 95 » Man muss sein eigenes Passwort eingeben (nicht das des anderen Benutzers) und über die Konfigurationsdatei die Rechte zum Ausführen des Befehls haben. » Optionen: -u Benutzername|UID → Befehl als dieser Benutzer ausführen, -i → Login-Shell ausführen. » $ sudo -i [sudo] password for thomas: root@noweto:~# Befehle als anderer Benutzer ausführen - sudo, su • Unter Gnome gibt es für beide Befehle die grafische Oberfläche gksu. • Manche versuchen es auch im realen Leben (meist mit weniger Erfolg): XKCD Comic 149 Dateien komprimieren - gzip, bzip2, xz, tar gzip, bzip2, xz - Komprimiert Dateien. » Übliche Dateierweiterung für gzip-Dateien ist gz, für bzip2-Dateien bz2, für xz-Dateien xz. » Können keine Archive erstellen, d.h. diese Befehle können nur für einzelne Dateien verwendet werden. » $ touch file; gzip file; ls -l file* -rw-rw-r-- 1 thomas thomas 25 Dec 5 20:30 file.gz tar - Verarbeitet (packt, entpackt, listet, …) TAR-Archive. » Syntax: tar Optionen [Datei...]. » Übliche Dateierweiterung ist tar bzw. tar.gz/tar.bz2/tar.xz. » Dateien werden in ein Archiv gepackt, das Archiv wird anschließend (optional) mittels eines Komprimierprogramms wie gzip, bzip2 oder xz komprimiert. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 93 von 95 » Optionen: -c → Archiv erzeugen, -x → Archiv entpacken, -t → Inhalt von Archiv auflisten, -f Archiv → die Datei Archiv für die Operationen verwenden, -z → mit gzip komprimieren, -j → mit bzip2 komprimieren, -J → mit xz komprimieren. » $ tar -cjf archiv.tar.bz2 src notizen.org $ ls -l archive.tar.bz2 -rw-rw-r-- 1 thomas thomas 720569 Dec 5 20:31 archive.tar.bz2 Roh-Kopien erstellen - dd dd - Kopiert Dateiinhalte einer Datei auf eine andere. » Syntax: dd [Operanden...]. » Kann auch direkt von Geräten lesen und auf sie schreiben (und dadurch z.B. bootfähige Medien erzeugen oder beliebige Testdateien anlegen). » Operanden: if=Datei → Eingabedatei (sonst Standardeingabe), of=Datei → Ausgabedatei (sonst Standardausgabe), bs=Bytes → Blockgröße (übliche Suffixes K, M, G, … möglich), count=Blöcke → Anzahl der zu verarbeitenden Blöcke.. » $ dd if=/dev/zero of=leere_datei bs=1M count=10 10+0 records in 10+0 records out 10485760 bytes (10 MB) copied, 0.0118872 s, 882 MB/s $ dd if=/dev/sr0 of=dvd_image.iso >/dev/null # ISO-Datei von CD/DVD erstellen Netzwerk-Utilities wget - Lädt Dateien aus dem Internet herunter. » Viele Optionen, z.B. rekursives Herunterladen einer ganzen Webseite möglich. curl - Wie wget, aber vielseitiger. » Kann nicht nur HTTP(S) und FTP (wie wget), sondern auch GOPHER, IMAP, LDAP, POP RTMP, SFTP, SCP, TELNET, … » Kann z.B. auch nur den HTTP-Kopf und nicht die gesamt Datei herunterladen, sehr nützlich zum Testen. nc - Liest und schreibt Daten über Netzwerkschnittstellen. » Viele Einsatzmöglichkeiten (siehe Manpage). » Z.B. Datentransfer von Server auf Client: • Client-Seite: nc -l 1234 > Datei • Server-Seite: nc server.address 1234 < Datei Bildbearbeitung ImageMagick, GraphicsMagick - Bildbetrachter und Konvertierer. » Kann Bilddateien in andere Formate konvertieren und dabei editieren (z.B. Auflösung ändern, zuschneiden, skalieren, Filter anwenden, …). » Besteht aus mehreren Programmen, sehr nützlich sind: • identify → Informationen zu einer Bilddatei ausgeben • convert → Bilddatei konvertieren • display → Bilddatei anzeigen » $ identify rgb.jpg rgb.jpg JPEG 5x5 5x5+0+0 8-bit sRGB 288B 0.000u 0:00.000 $ convert rgb.jpg -resize 50x50 rgb.png Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 94 von 95 Sonstige Programme LaTeX - Professionelles Schriftsatzprogramm. » Für wissenschaftliche Arbeiten bevozugt zu verwenden! » Basiert auf Text-Dateien, die in DVI-, PostScript- oder PDF-Dateien übersetzt werden. » Es reicht ein einfacher Editor zum Bearbeiten der Texte, es gibt aber auch mehrere graphische Oberflächen, z.B. Lyx (Linux, Windows, OS X), TexWorks (Linux, Windows, OS X) oder Emacs mit Auctex. mplayer, mencoder - Videoplayer und Konvertierer. » Sehr nützlich, kann so ziemlich alles wiedergeben, was es gibt. » mencoder, um Videodateien zu erstellen oder zu konvertieren. » Ausgabe auch in Textkonsole möglich (mplayer -vo caca Videodatei). Copyright und Lizenz • Copyright: Thomas Leitner thomas.leitner@univie.ac.at • Basiert teilweise auf den Folien von Harald Schilly harald.schilly@univie.ac.at • Lizenz: Creative Commons CC BY-NC-SA „Namensnennung-Keine kommerzielle Nutzung-Weitergabe unter Österreich.“ - http://creativecommons.org/licenses/by-nc-sa/3.0/at/ gleichen Bedingungen 3.0 Abweichendes Copyright von Inhalten: • Das XKCD-Comic zu „sudo“ steht steht unter der CC BY-NC 2.5 Lizenz. Technische Praxis der Computersysteme 1 | Wintersemester 2015 | Version: 2015-12-04 09:00 Seite 95 von 95