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