Betriebssysteme Teil B: Einführung in den LINUX-bash-Shell II
Betriebssysteme Teil B: Einführung in den LINUX-bash-Shell II
Betriebssysteme Teil B: Einführung in den LINUX-bash-Shell II
Erfolgreiche ePaper selbst erstellen
Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.
<strong>Betriebssysteme</strong><br />
<strong>Teil</strong> B: E<strong>in</strong>führung <strong>in</strong> <strong>den</strong> <strong>LINUX</strong>-<strong>bash</strong>-<strong>Shell</strong> <strong>II</strong><br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong> 11.10.13 1
Literatur<br />
[B-1] He<strong>in</strong>, Jochen: <strong>LINUX</strong> Systemadm<strong>in</strong>istration. Addison-Wesley, 3.<br />
Auflage, 1999<br />
[B-2]<br />
Frisch, Aeleen: Unix System Adm<strong>in</strong>istration. Kurz&Gut, O'Reilly,<br />
2003<br />
[B-3] Ward, Brian: Der <strong>LINUX</strong>-Problemlöser. dpunkt, 2002<br />
[B-4] Ward, Brian: L<strong>in</strong>ux verstehen und adm<strong>in</strong>istrieren. dpunkt, 2006<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
2
Überblick<br />
• Arbeitsmodi des <strong>bash</strong><br />
• Environment<br />
• Dateisystem<br />
• Zugriffsrechte auf Dateien<br />
• Zusammensetzen von Kommandos<br />
• Beispielskripte<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
3
Modi des <strong>bash</strong> I<br />
<strong>bash</strong><br />
Interaktiv<br />
Nicht-Interaktiv<br />
Normal<br />
Restricted<br />
Log<strong>in</strong><br />
Nicht-Log<strong>in</strong><br />
Log<strong>in</strong><br />
Nicht-Log<strong>in</strong><br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
4
Modi des <strong>bash</strong> <strong>II</strong><br />
Art<br />
Interaktiv<br />
Log<strong>in</strong><br />
Nicht-Log<strong>in</strong><br />
Restricted<br />
Nicht Interaktiv<br />
Erläuterung<br />
Lesen von "Tastatur"<br />
Erster <strong>in</strong>teraktiver <strong>bash</strong> gestartet von Log<strong>in</strong> oder per<br />
Option erzwungen (--log<strong>in</strong>)<br />
Nach dem Log<strong>in</strong> <strong>in</strong>teraktiver <strong>Shell</strong>aufruf<br />
E<strong>in</strong>geschränkte Version:<br />
(a) ke<strong>in</strong> Programmstart aus beliebigen Verzeichnissen<br />
(b) Ke<strong>in</strong> cd aus Heimatverzeichnis<br />
(c) Keim Umlenken der E<strong>in</strong>-/Ausgabe<br />
Diese kann auch per -r erzwungen wer<strong>den</strong><br />
Lesen aus e<strong>in</strong>er Datei<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
5
Startskripte<br />
Date<strong>in</strong>ame Log<strong>in</strong> Interaktiv<br />
Nicht-Log<strong>in</strong><br />
/etc/profile (1)<br />
˜/.<strong>bash</strong>_profile<br />
˜/.<strong>bash</strong>_log<strong>in</strong><br />
˜/.profile<br />
(2a)<br />
(2b)<br />
(2c)<br />
˜/.<strong>bash</strong>rc (1)<br />
Nicht<br />
Interaktiv<br />
$BASH_ENV (1)<br />
Wird e<strong>in</strong>e der Dateien (2a)..(2c) gefun<strong>den</strong>, so wer<strong>den</strong> ke<strong>in</strong>e weiteren<br />
ausgeführt. ˜/.<strong>bash</strong>rc kann per source-Kommando <strong>in</strong> e<strong>in</strong>er der drei Dateien<br />
e<strong>in</strong>gebun<strong>den</strong> wer<strong>den</strong>.<br />
Die restricted-Version verhält sich <strong>in</strong> dieser H<strong>in</strong>sicht hier wie die normale<br />
Version.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
6
Environment I<br />
• Jeder Prozess hat e<strong>in</strong> Environment<br />
(ENV) <strong>in</strong> se<strong>in</strong>em eigenen Adressraum.<br />
• Es wird nur beim La<strong>den</strong> gesetzt, d.h.<br />
es besteht ke<strong>in</strong>e Rückgabemöglichkeit.<br />
• E<strong>in</strong>e ENV-Variable ist e<strong>in</strong> Str<strong>in</strong>g<br />
"XXX=YYY\0", wobei XXX der Name<br />
und YYY der Wert ist.<br />
• Manche <strong>Shell</strong>-Variablen s<strong>in</strong>d beim<br />
Setzen mit e<strong>in</strong>er ENV-Variablen<br />
gleichen Namens gekoppelt<br />
(Vorsicht!). Dann s<strong>in</strong>d die Werte global<br />
für alle K<strong>in</strong>der.<br />
gleich<br />
Environment<br />
Environment<br />
Code/Daten<br />
Programm P 2<br />
Code/Daten<br />
Programm P 1<br />
"generiert"<br />
User-<br />
Adressraum<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
7
Environment <strong>II</strong><br />
• Die Belegung des Environments der aktuellen <strong>Shell</strong>s kann mit<br />
dem Kommando env aufgelistet wer<strong>den</strong>.<br />
• Das Environment enthält weder <strong>Shell</strong>-Variablen noch sonstige<br />
Variablen, sondern nur e<strong>in</strong>malig zum Start-zeitpunkt e<strong>in</strong>es<br />
Programms übergebene Zeichenketten als "globale Parameter".<br />
• In der Praxis wird das Environment beim Log<strong>in</strong> e<strong>in</strong>mal gesetzt<br />
und dann <strong>in</strong> der gesamten Sitzung <strong>in</strong> allen Prozessen verwendet.<br />
• Die Namen der Environment-Variablen wer<strong>den</strong> per Konvention<br />
nur mit großen Buchstaben geschrieben.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
8
Beispiele für Environment-Variablen<br />
• HOME<br />
Ursprungsdirectory des<br />
Benutzers<br />
• PATH<br />
Liste der Directories für<br />
Programme<br />
• SHELL<br />
Filename des <strong>Shell</strong>s<br />
Beispiel (Auszug) für e<strong>in</strong>e ENV-Belegung:<br />
DISPLAY=puma:0.0<br />
HOME=/home/panda/willie<br />
USER=willie<br />
PATH=/opt/X11R5/b<strong>in</strong>:/b<strong>in</strong>:/usr/etc:/etc<br />
SHELL=/b<strong>in</strong>/tcsh<br />
PWD=/home/panda/willie<br />
LOGNAME=willie<br />
HOST=panda<br />
HOSTTYPE=sun4<br />
PRINTER=lw62<br />
TERM=xterm<br />
WINDOWID=20971533<br />
TERMCAP=vs|xterm|vs100|xterm term<strong>in</strong>al…<br />
Mit dem Kommando env lässt sich das Environment ausgeben.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
9
<strong>Shell</strong>-Prozesshierarchie<br />
Eltern-<strong>Shell</strong><br />
ENV - Globale Umgebung<br />
Set - Lokale <strong>Shell</strong>-Umgebung<br />
"vererbt"<br />
K<strong>in</strong>d 1 -<strong>Shell</strong><br />
ENV - Globale Umgebung<br />
Ke<strong>in</strong>e Vererbung<br />
K<strong>in</strong>d 2 -<strong>Shell</strong><br />
"vererbt"<br />
Set - Lokale <strong>Shell</strong>-Umgebung<br />
ENV - Globale Umgebung<br />
Set - Lokale <strong>Shell</strong>-Umgebung<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
10
Setzen von Environment-Variablen<br />
export varname<br />
export varname=value<br />
Die Variable varname wird als Environment-Variable<br />
deklariert und <strong>in</strong> der 2. Form auf value gesetzt.<br />
declare -x varname=value<br />
Wie export varname=value<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
11
Ausgabe aller Environment-Variablen<br />
export<br />
pr<strong>in</strong>tenv<br />
gibt die Environment-Variablen so aus, wie e<strong>in</strong> <strong>Shell</strong> sie<br />
setzen könnte: jeweils mit "declare –x" am Zeilenbeg<strong>in</strong>n<br />
dasselbe nur im Format Varname=Value<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
12
Datei-System<br />
• UNIX basiert auf e<strong>in</strong>er Vere<strong>in</strong>heitlichung der Schnittstelle auf der Ebene<br />
der Dateien.<br />
• Es wer<strong>den</strong> folgende Arten von "Dateien" unterschie<strong>den</strong>:<br />
– Pla<strong>in</strong> Files [Reguläre Dateien]<br />
– Ordner, Verzeichnisse (Directories)<br />
– Geräte-Dateien [Special Files]<br />
Gepufferte Files [Block special Files]<br />
Ungepufferte Files [Character special Files]<br />
– Dateien zur Interprozess-Kommunikation [Special Files]<br />
Named Pipe(l<strong>in</strong>e)s<br />
Sockets<br />
• Jede Datei hat e<strong>in</strong>en Namen (m<strong>in</strong>. 1 Zeichen, max. 255 Zeichen), der<br />
<strong>in</strong>nerhalb des Ordners e<strong>in</strong>deutig se<strong>in</strong> muss.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
13
Dateisystem aus <strong>Shell</strong>-Sicht<br />
Logische Sicht<br />
Directory D2<br />
Directory D1<br />
Directory D3<br />
File F3<br />
File F1<br />
File F2<br />
File F4<br />
L<strong>in</strong>ks<br />
Directory D1<br />
Directory D2<br />
File F1<br />
File<br />
...<br />
File<br />
...<br />
File F2<br />
Directory D3<br />
Auszug aus<br />
Implementierungssicht<br />
File F3<br />
File<br />
...<br />
File F4<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
14
Reguläre Dateien<br />
• Informationen als Array von Bytes<br />
• Zeiger auf aktuelle Position<br />
• Operationen: Lesen, Schreiben und Positionieren<br />
• Es ist nicht möglich, <strong>in</strong> der Mitte Daten zu löschen oder<br />
e<strong>in</strong>zufügen<br />
• Mehrere Prozesse können gleichzeitig lesen oder schreiben.<br />
Bei Konflikten ist das Ergebnis undef<strong>in</strong>iert, wenn z.B. zwei<br />
Prozesse gleichzeitig <strong>in</strong> dieselbe Datei an derselben Stelle<br />
schreiben.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
15
Geräte-Dateien I<br />
• Ke<strong>in</strong>e Datenblöcke wie reguläre Dateien<br />
• Alle Operationen wie bei regulären Dateien<br />
• Arten<br />
– Blockgeräte<br />
Es gibt e<strong>in</strong>en Puffer, der zum Lesen und Schreiben benutzt wird, z.<br />
B. für Platten, Magnetbänder<br />
– Zeichenorientierte Geräte<br />
Es gibt ke<strong>in</strong>en Puffer, die Daten wer<strong>den</strong> direkt geschrieben bzw.<br />
gelesen, z. B. Term<strong>in</strong>als, Magnetbänder<br />
• Puffer dienen zur Beschleunigung, da dann <strong>in</strong> e<strong>in</strong>em Stück Daten<br />
bearbeitet wer<strong>den</strong><br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
16
Geräte-Dateien <strong>II</strong><br />
Ordner<br />
L<strong>in</strong>k<br />
Datei<br />
1:1<br />
Blocknummer<br />
[0]<br />
1:1<br />
[1]<br />
1:1<br />
[2]<br />
[3]<br />
...<br />
[4]<br />
...<br />
1:1<br />
[N]<br />
Datei mit<br />
derselben<br />
Länge wie<br />
das Gerät<br />
Blöcke auf<br />
dem Gerät<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
17
Wozu Geräte-Dateien?<br />
• Die Vere<strong>in</strong>heitlichung der Schnittstelle führt zu Reduktion der<br />
Komplexität.<br />
Beispiel: cp /dev/sda1 Datei<br />
Das Gerät unter dem Date<strong>in</strong>amen "/dev/sda1" wird Byte für<br />
Byte <strong>in</strong> e<strong>in</strong>e Datei kopiert (Backup e<strong>in</strong>es Dateisystems).<br />
• Die Benutzung von Dateien für D<strong>in</strong>ge, die eigentlich wenig mit<br />
Dateien zu tun haben, ist e<strong>in</strong>es der leistungsfähigsten Konzepte<br />
im Bereich der <strong>Betriebssysteme</strong>.<br />
Die Programmiere<strong>in</strong>sparungen sowie die Flexibilität wer<strong>den</strong><br />
dadurch erheblich vergrößert.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
18
Exkurs: Namenskonvention (Beispiel) I<br />
Beispiel für e<strong>in</strong>e Namenskonvention für Gerätedateien:<br />
/dev/Gerätetyp Laufwerk Format Parameter<br />
z.B. Rew<strong>in</strong>d/NoRew<strong>in</strong>d<br />
block device: sda<br />
Erstes Laufwerk: 1<br />
Zweites Laufwerk: 2<br />
Gerät/Format-Bezeichnung<br />
• Gerätefiles können wie andere behandelt wer<strong>den</strong>, z.B. mit eiem l<strong>in</strong>k<br />
verküpfen.<br />
• Gerätefiles wer<strong>den</strong> zur Bearbeitung bei Wechselspeichern<br />
(Tapes, CD-ROM, DVD, MO, USB etc.) benötigt.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
19
Exkurs: Namenskonvention (Beispiel) <strong>II</strong><br />
<strong>LINUX</strong>-Systeme haben u.a. folgende Namenskonvention:<br />
• Die Bezeichnung der Geräte erfolgt nach folgendem Schema:<br />
– 1. IDE-Platte hda, 2.IDE-Platte hdb, 3. IDE-Platte hdc etc.<br />
– 1. SCSI-Platte sda, 2.SCSI-Platte sdb, 3. SCSI-Platte sdc etc.<br />
– Partitionen wer<strong>den</strong> von 1 an hoch gezählt.<br />
– CDROMs wer<strong>den</strong> wie IDE-Platten behandelt, da sie normalerweise an<br />
<strong>den</strong> IDE-Controllern hängen.<br />
• Dies hängt natürlich von der Hardware ab, z.B. stirbt IDE so<br />
langsam aus…<br />
• Auch gibt es UNIX-Varianten, die BSD-Reihe, die hier andere<br />
Benennungsregeln haben.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
20
Verweise (L<strong>in</strong>ks)<br />
• Dateien wer<strong>den</strong> über L<strong>in</strong>ks <strong>in</strong> Ordnern verknüpft.<br />
• E<strong>in</strong> Date<strong>in</strong>ame ist damit e<strong>in</strong> Name für e<strong>in</strong>en L<strong>in</strong>k.<br />
• Ordner s<strong>in</strong>d Dateien und enthalten nur <strong>den</strong> Date<strong>in</strong>amen und<br />
jeweils e<strong>in</strong>en L<strong>in</strong>k.<br />
• Auf e<strong>in</strong>e Datei können beliebig viele L<strong>in</strong>ks verweisen.<br />
• Es gibt symbolische L<strong>in</strong>ks und "harte" L<strong>in</strong>ks.<br />
– Symbolisch: Der Wert ist die Angabe des Date<strong>in</strong>amens als Str<strong>in</strong>g,<br />
ke<strong>in</strong>e direkte Verb<strong>in</strong>dung<br />
– Harter L<strong>in</strong>k: Der Wert ist direkte Verb<strong>in</strong>dung <strong>in</strong> Form e<strong>in</strong>er <strong>in</strong>ode-<br />
Nummer<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
21
Erläuterungen<br />
• In jeder Directory gibt es immer e<strong>in</strong>en Verweis auf sich selbst<br />
und auf <strong>den</strong> Eltern-Ordner (Ausnahme die Wurzel): "." auf sich<br />
selbst, ".." auf die Eltern<br />
• Trenner im Pfadnamen ist /<br />
• Absolute Pfadnamen: z. B. /usr/b<strong>in</strong>/rm<br />
• Relative Pfadnamen: z. B. b<strong>in</strong>/rm<br />
• Filenamen: z. B. rm oder a.out<br />
• Alles kann komb<strong>in</strong>iert wer<strong>den</strong>:<br />
z.B. /usr/.././usr/b<strong>in</strong>/../b<strong>in</strong>/rm<br />
• Der aktuelle Ordner e<strong>in</strong>es Prozesses heißt Work<strong>in</strong>g Directory;<br />
relativ zu ihm wer<strong>den</strong> relative Pfadnamen und die Filenamen<br />
betrachtet.<br />
• Die Work<strong>in</strong>g Directory des Log<strong>in</strong>-<strong>Shell</strong>s direkt nach dem<br />
E<strong>in</strong>loggen heißt Home-Directory.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
22
Löschen<br />
• E<strong>in</strong>e Datei wird erst dann<br />
gelöscht, wenn<br />
– alle Referenzen (Hard-L<strong>in</strong>ks)<br />
im Filesystem entfernt s<strong>in</strong>d<br />
und wenn<br />
– ke<strong>in</strong> Prozess mehr die Datei<br />
geöffnet hat.<br />
Prozess<br />
Ordner<br />
• Im Sonderfall der Ordner:<br />
– wenn zusätzlich die Directory<br />
leer ist<br />
und<br />
– wenn zusätzlich ke<strong>in</strong> Prozess<br />
sie als Work<strong>in</strong>g Directory<br />
erklärt hat.<br />
Prozess<br />
Datei<br />
Ordner<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
23
Rechte/Erlaubnisse (Permissions) I<br />
• Jedem Prozess s<strong>in</strong>d zur Feststellung se<strong>in</strong>er Rechte zwei 16-Bit-<br />
Integerwerte zugeordnet:<br />
– User-ID (UID) i<strong>den</strong>tifiziert die Zugehörigkeit des Prozesses zu e<strong>in</strong>em<br />
Log<strong>in</strong>-Namen<br />
– Group-ID (GID) i<strong>den</strong>tifiziert die Zugehörigkeit des Prozesses zu e<strong>in</strong>er<br />
Gruppe von Log<strong>in</strong>-Namen.<br />
• Jeder Datei wer<strong>den</strong> ebenfalls zwei 16-Bit-Integerwerte zugeordnet,<br />
die die Besitzverhältnisse klären:<br />
– User-ID (UID) legt fest, welchem Log<strong>in</strong>namen die Datei zugeordnet ist.<br />
– Group-ID (GID) legt fest, welcher Gruppe von Log<strong>in</strong>namen die Datei<br />
zugeordnet ist.<br />
• Für Owner/User bzw. Gruppe wird jeweils e<strong>in</strong>e ID verwendet:<br />
– Die UID-Werte wer<strong>den</strong> im File "/etc/passwd" def<strong>in</strong>iert.<br />
– Die GID-Werte wer<strong>den</strong> im File "/etc/group" def<strong>in</strong>iert.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
24
Rechte/Erlaubnisse (Permissions) <strong>II</strong><br />
• Es gibt 3 Kategorien für das Verhältnis Prozess - Datei:<br />
Owner/User, Gruppe, Rest (World).<br />
• Jede Datei hat drei Permission-Def<strong>in</strong>itionen entsprechend <strong>den</strong><br />
drei Kategorien:<br />
– Für das Owner-Verhältnis: Read Write eXecute<br />
– Für das Group-Verhältnis: Read Write eXecute<br />
– World (sonst): Read Write eXecute<br />
Alle Komb<strong>in</strong>ationen aus Read Write eXecute lassen sich mit 3 Bits<br />
darstellen, so dass 3*3 Bits erforderlich s<strong>in</strong>d.<br />
• Jeder Prozess hat e<strong>in</strong>e effektive UID/GID. Anhand dieser Werte<br />
und <strong>den</strong> Permission-Def<strong>in</strong>itionen wer<strong>den</strong> die Rechte e<strong>in</strong>malig<br />
beim Eröffnen e<strong>in</strong>er Datei bestimmt.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
25
Rechte/Erlaubnisse (Permissions) <strong>II</strong>I<br />
• Algorithmus<br />
– Bestimmung, ob Owner: UID von Datei = UID von Prozess<br />
– Bestimmung, ob Group: GID von Datei = GID von Prozess<br />
– ansonsten World<br />
– dann Betrachtung der korrespondieren<strong>den</strong> Permission-Bits<br />
• Bemerkungen<br />
– UID = 0 hat e<strong>in</strong>e Sonderrolle (Super-User, Root).<br />
– Es gibt reale und effektive UID/GID<br />
– Durch das Set-UID/GID-Flag wer<strong>den</strong> beim Programmstart dem<br />
Programm für <strong>den</strong> Lauf fremde UID/GID und damit Rechte<br />
"geliehen".<br />
– E<strong>in</strong> Prozess hat daher immer zwei UID/GID-Wertpaare<br />
(real und effektiv).<br />
Zur Bestimmung der Rechte wird immer die effektive ID benutzt.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
26
ls-Beispiele<br />
Mit dem Kommando ls wird der Inhalt e<strong>in</strong>er Directory aufgelistet:<br />
panda:92% ls<br />
Mail1.lst Mail2.lst Mail3.lst<br />
panda:91% ls -l<br />
total 5<br />
-rw------- 1 bmesser 1210 Apr 9 12:47 Mail1.lst<br />
-rw------- 1 bmesser 1583 Apr 9 12:40 Mail2.lst<br />
-rw------- 1 bmesser 943 Apr 9 12:35 Mail3.lst<br />
panda:93% ls -la<br />
total 12<br />
drwx------ 2 bmesser 512 Apr 9 12:47 ./<br />
drwxr-xr-x 36 bmesser 5632 Apr 9 12:47 ../<br />
-rw------- 1 bmesser 1210 Apr 9 12:47 Mail1.lst<br />
-rw------- 1 bmesser 1583 Apr 9 12:40 Mail2.lst<br />
-rw------- 1 bmesser 943 Apr 9 12:35 Mail3.lst<br />
panda:94%<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
27
Besonderheiten bei Ordnern I<br />
• Execute-Erlaubnis erlaubt das Benutzen des Ordnernamens<br />
<strong>in</strong>nerhalb von Pfadnamen ohne das Recht zum Lesen des<br />
Ordners<br />
z.B. cp /home/UserDir/b<strong>in</strong> /tmp<br />
Für UserDir und home muss Execute erlaubt se<strong>in</strong>.<br />
Es gibt noch drei weitere Bits:<br />
– Zwei zum Setzen der UID/GID (siehe unten)<br />
– Sticky-Bit<br />
• Das Sticky-Bit wird<br />
– bei "ls -l" als "t" an der Stelle Execute für die Welt angezeigt<br />
– Es wird durch<br />
chmod 1777 /tmp<br />
chmod a=rwx,o+t<br />
gesetzt.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
28
Besonderheiten bei Ordnern <strong>II</strong><br />
• Algorithmus bei gesetzten Sticky-Bit e<strong>in</strong>es Ordners:<br />
Wenn e<strong>in</strong>e der folgen<strong>den</strong> Bed<strong>in</strong>gungen zutrifft:<br />
– Effektive UID des löschen<strong>den</strong> oder umbenennen<strong>den</strong> Prozesses ist<br />
Owner der Datei<br />
– Effektive UID des löschen<strong>den</strong> oder umbenennen<strong>den</strong> Prozesses ist<br />
Owner e<strong>in</strong>es schreiboffenen mit Sticky-Bit gesetzten Ordners<br />
– Effektive UID ist 0<br />
erhält der Prozess das Recht zum Löschen oder Umbenennen.<br />
• S<strong>in</strong>n des Sticky-Bits<br />
Es soll das gegenseitige Löschen und Umbenennen von offenen<br />
Ordnern mit Schreibrechten beschränkt wer<strong>den</strong>.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
29
Set-UID/Set-GID I<br />
• Leider benötigen e<strong>in</strong>ige harmlose Programme root-Rechte, z. B.<br />
mkdir oder rmdir.<br />
• Daher wer<strong>den</strong> pro Prozess zwei weitere 16-bit-Werte e<strong>in</strong>geführt:<br />
Effektive UID und Effektive GID.<br />
• Diese bestimmen die tatsächlichen Rechte.<br />
• Wird e<strong>in</strong>e Datei gela<strong>den</strong> und gestartet, so läuft folgendes<br />
Verfahren ab:<br />
– Ist e<strong>in</strong> Set-UID-Bit der Datei zugeordnet, erhält der Prozess als<br />
effektive UID die UID des Datei-Owners.<br />
– Ist e<strong>in</strong> Set-GID-Bit der Datei zugeordnet, erhält der Prozess als<br />
effektive GID die GID der Datei-Gruppe.<br />
– Ist ke<strong>in</strong> Set-Bit gesetzt, behält der Prozess se<strong>in</strong>e alten UID/GID-<br />
Werte.<br />
– Initial s<strong>in</strong>d reale und effektive UID/GID gleich.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
30
Set-UID/Set-GID <strong>II</strong><br />
• Lösung für mkdir/rmdir etc.:<br />
Owner ist root und Set-UID-Bit ist gesetzt<br />
Die ist e<strong>in</strong>e geniale, e<strong>in</strong>fache Lösung<br />
(die früher sogar patentiert war)<br />
• Dasselbe geht auch analog mit der Group-ID<br />
Aber:<br />
• Daher s<strong>in</strong>d die bei<strong>den</strong> Set-Bits recht gefährlich und dürfen nur<br />
bei bestimmten unmodifizierten Programmen benutzt wer<strong>den</strong>.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
31
Effektive und Reale ID<br />
• Jedem Prozess ist e<strong>in</strong> weiteres Paar von UID/GID zugeordnet, so<br />
dass von zwei IDs gesprochen wer<strong>den</strong> muss:<br />
– Reale UID bzw. GID<br />
– Effektive UID bzw. GID<br />
• Normalerweise s<strong>in</strong>d beide korrespondieren<strong>den</strong> IDs gleich<br />
• Zur Prüfung der Verhältnisses Prozess zu Datei wer<strong>den</strong> immer die<br />
Effektiven IDs benutzt<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
32
Passwort-Def<strong>in</strong>itionen <strong>in</strong> /etc/passwd<br />
• Aufbau:<br />
UserName:PW:UID:GID:Kommentar:Home-Directory:StartProgramm<br />
• Beispiel:<br />
root:Int289gnNHQ:0:1:Operator:/:/b<strong>in</strong>/csh<br />
nobody:H78Jhh56hGh:65534:65534::/:<br />
daemon:Ghjsn12Gg5:1:1::/:<br />
sys:674jhdFGj2:2:2::/:/b<strong>in</strong>/csh<br />
b<strong>in</strong>:132kHjZzhn:3:3::/b<strong>in</strong>:<br />
sync:vO07rFtChx2:1:1::/:/b<strong>in</strong>/sync<br />
• Die Passwort-Datei können alle lesen, da viele Programme, z.B. ls, die<br />
Datei lesen müssen.<br />
• Es wird e<strong>in</strong> One-Way-Verschlüsselungsalgorithmus für die Passwörter<br />
verwendet.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
33
Gruppendef<strong>in</strong>itionen /etc/group<br />
• Aufbau:<br />
GroupName:PW:GID:Benutzerliste<br />
• Beispiel:<br />
wheel::0:<br />
nogroup:Fhsdhj5shbG:65534:<br />
daemon:Gh46Ghho9:1:<br />
b<strong>in</strong>:*:3:<br />
operator:*:5:<br />
news:*:6:<br />
• Gruppen s<strong>in</strong>d flach (ke<strong>in</strong>e Hierarchie).<br />
• Die Gruppenzugehörigkeit wird <strong>in</strong> /etc/passwd def<strong>in</strong>iert.<br />
• Benutzer können sich <strong>in</strong> andere Gruppen mit e<strong>in</strong>em Passwort<br />
während e<strong>in</strong>er Sitzung mehrfach e<strong>in</strong>loggen.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
34
Passwörter <strong>in</strong> Shadow-Dateien verstecken<br />
• Beispiel für /etc/passwd (öffentlich) nun:<br />
root:x:0:1:Operator:/:/b<strong>in</strong>/csh<br />
nobody:x:65534:65534::/:<br />
daemon:x:1:1::/:<br />
sys:x:2:2::/:/b<strong>in</strong>/csh<br />
b<strong>in</strong>:x:3:3::/b<strong>in</strong>:<br />
sync:x:1:1::/:/b<strong>in</strong>/sync<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
35
Aufbau von /etc/shadow<br />
Aufbau von /etc/shadow (für Öffentlichkeit gesperrt):<br />
UserName:PW:ChgDate:DaysChg:DaysVal:<br />
DaysWarn:DaysLock:EndDate<br />
Erläuterung:<br />
– ChgDate: Datum der letzten Passwort-Änderung<br />
– DaysChg: Tage bevor das PW wieder geändert wer<strong>den</strong> darf<br />
– DaysVal: Tage nach <strong>den</strong>en das PW geändert wer<strong>den</strong> muss<br />
– DaysWarn: Tage vor PW-Ablauf für Warnung<br />
– DaysLock: Tage nach PW-Ablauf zum Sperren des UserName<br />
– EndDate: Datum des Ablaufs von UserName<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
36
Beispiel für /etc/shadow<br />
at:!:12323:0:99999:7:::<br />
b<strong>in</strong>:*:8902:0:10000::::<br />
daemon:*:8902:0:10000::::<br />
ftp:*:8902:0:10000::::<br />
games:*:8902:0:10000::::<br />
root:U4..u8/4/t1sK:12323:0:10000::::<br />
aalles:0Y5vGFrD8uNxc:12352:1:99999:14:::<br />
bbutter:C.j.k/uXnSBoQ:12352:1:99999:14:::<br />
bmesser:.Zzums2/rOSvk05s:12323:0:99999:7:::<br />
ccarviar:BxsNoy21Sx2.E:12352:1:99999:14:::<br />
ddosseh:I8kHQttv3SK9s:12352:1:99999:14:::<br />
eentenh:i72jb/7VtyMng:12352:1:99999:14:::<br />
ffunsb:j6v/ER.8YW2hA:12352:1:99999:14:::<br />
gganzt:RD/IQH5Dpfumk:12352:1:99999:14:::<br />
hheisen:SZLTuTUzqsgT6:12352:1:99999:14:::<br />
Gesperrter Bereich<br />
Bereich ohne Log<strong>in</strong>-<br />
Möglichkeit<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
37
Vererben der Erlaubnisse (Permissions)<br />
• Der Log<strong>in</strong>-Prozess arbeitet als Super User (UID=0).<br />
• Log<strong>in</strong> liest /etc/passwd bzw. shadow und prüft das Passwort<br />
(One-Way-Algorithmus)<br />
• Dann setzt er sich selbst auf die angegebene UID/GID.<br />
• Anschließend überschreibt er sich selbst mit dem <strong>in</strong> /etc/passwd<br />
def<strong>in</strong>ierten Startprogramm<br />
(<strong>in</strong> der Regel e<strong>in</strong> <strong>Shell</strong>).<br />
• Dieses Programm läuft damit mit <strong>den</strong> Werten des Benutzers. Alle<br />
von ihm erzeugten Prozesse erben diese Werte.<br />
• Nur e<strong>in</strong> Prozess, für dessen B<strong>in</strong>ärcode das Set-UID/GID-Flag<br />
gesetzt hat, bekommt andere Werte, die er wiederum se<strong>in</strong>en<br />
K<strong>in</strong>dern vererbt, sofern diese ke<strong>in</strong> Set-UID/GID-Flag haben.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
38
Wild-Zeichen (<strong>Shell</strong>) - Auszug I<br />
Zeichen<br />
Beispiele<br />
– abc*<br />
– a*abc*<br />
– a?.*<br />
– *.*<br />
– *<br />
– *.[co]<br />
– *.txt<br />
Bedeutung<br />
* leerer oder beliebig langer Str<strong>in</strong>g<br />
? e<strong>in</strong> beliebiges Zeichen, aber genau e<strong>in</strong>s<br />
[XYZ]<br />
[!X]<br />
[X-Z]<br />
e<strong>in</strong> Zeichen X oder Y oder Z<br />
e<strong>in</strong> beliebiges Zeichen ungleich X<br />
e<strong>in</strong> Zeichen aus der Menge X bis Z<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
39
Wild-Zeichen (<strong>Shell</strong>) - Auszug <strong>II</strong><br />
• "$*" ist e<strong>in</strong>e Variable, die genau diesen Namen hat, d.h. das "*"<br />
wird nicht durch Date<strong>in</strong>amen ersetzt.<br />
• "$**" s<strong>in</strong>d zwei Elemente: "$*" und "*", die jeweils e<strong>in</strong>zeln<br />
entsprechend behandelt wer<strong>den</strong>.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
40
Pipel<strong>in</strong>es (Pipes)<br />
Producer<br />
Consumer<br />
Prozess A<br />
Prozess B<br />
Write()<br />
Read()<br />
Kernel<br />
Pipel<strong>in</strong>e-Buffer<br />
Abstrakte und verallgeme<strong>in</strong>erte Sicht (nicht <strong>in</strong> <strong>Shell</strong>s ausdrückbar)<br />
write()<br />
Pipel<strong>in</strong>e<br />
read()<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
41
Standard Input/Output/Error I<br />
Programme wer<strong>den</strong> als Bauste<strong>in</strong>e mit standardisierten<br />
I/O aufgefasst:<br />
Programm<br />
Standard-Input<br />
Standard-Output<br />
Standard-Error<br />
Programm P 1<br />
Programm P 2<br />
Programm P 3<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
42
Standard Input/Output/Error <strong>II</strong><br />
Die <strong>Shell</strong>s komb<strong>in</strong>ieren die Bauste<strong>in</strong>e mit<br />
folgen<strong>den</strong> Sprachelementen:<br />
| Pipe<br />
> Output<br />
2> Error-Output<br />
>& Error- und Programm-Output wer<strong>den</strong> zusammengefasst<br />
>> Output wird angefügt<br />
< Input<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
43
Beispiele für Input/Output-Umlenkungen<br />
• ls >file<br />
– ls listet Date<strong>in</strong>amen <strong>in</strong> Datei file<br />
• ls >>file<br />
– ls listet Date<strong>in</strong>amen ans Ende von Datei file<br />
• sort file2<br />
– Inhalt von Datei file1 wird sortiert und das Ergebnis nach file2<br />
geschrieben<br />
• ls | sort >file3<br />
– sort sortiert Output von ls<br />
– und schreibt nach file3<br />
– Drei Prozesse laufen parallel<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
44
Dateien <strong>in</strong>nerhalb von Skripten erzeugen I<br />
Befehl [Parameter...]
Dateien <strong>in</strong>nerhalb von Skripten erzeugen <strong>II</strong><br />
ls >/tmp/file<br />
ed /tmp/file /tmp/file<br />
ed /tmp/file
Kommando-Komb<strong>in</strong>ationen I<br />
Syntax<br />
Befehl &<br />
Befehl ; Befehl<br />
(Befehl ; Befehl)<br />
Befehl | Befehl<br />
Befehl1 `Befehl2`<br />
Befehl1 && Befehl2<br />
Befehl1 || Befehl2<br />
Erläuterung<br />
Ausführung im H<strong>in</strong>tergrund<br />
Sequentielle Ausführung<br />
Subshell mit sequentieller Ausführung<br />
Pipe<br />
Output von Befehl2 wird von Befehl1 gelesen<br />
Befehl2 wird nur dann ausgeführt, wenn Befehl1<br />
erfolgreich war (Returncode 0)<br />
Befehl2 wird nur dann ausgeführt, wenn Befehl1<br />
fehlgeschlagen ist (Returncode0)<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
47
Kommando-Komb<strong>in</strong>ationen <strong>II</strong><br />
grep bla Datei && lpr Datei<br />
Datei wird nur dann ausgedruckt, wenn es <strong>den</strong> Str<strong>in</strong>g bla<br />
enthält<br />
grep bla Datei || echo "bla is nich"<br />
Falls der Str<strong>in</strong>g bla nicht <strong>in</strong> Datei ist, wird e<strong>in</strong>e Fehlermeldung<br />
ausgegeben<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
48
Beispiele I<br />
for elem <strong>in</strong> "$@"<br />
do<br />
echo Parameter $elem<br />
done<br />
VL@l<strong>in</strong>ux:~> vi look.sh<br />
VL@l<strong>in</strong>ux:~> <strong>bash</strong> look.sh a b c<br />
Parameter a<br />
Parameter b<br />
Parameter c<br />
VL@l<strong>in</strong>ux:~> chmod 755 look.sh<br />
VL@l<strong>in</strong>ux:~> ./look.sh a b c<br />
Parameter a<br />
Parameter b<br />
Parameter c<br />
VL@l<strong>in</strong>ux:~> look.sh a b c<br />
Parameter a<br />
Parameter b<br />
Parameter c<br />
VL@l<strong>in</strong>ux:~><br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
49
Beispiele <strong>II</strong><br />
for elem <strong>in</strong> `cat Liste`<br />
do<br />
echo -n pr<strong>in</strong>t file $elem...<br />
lpr $elem<br />
echo ready<br />
done<br />
rpm -i --test $1<br />
if [ $? -eq 0 ] ; then<br />
echo "$1 kann <strong>in</strong>stalliert wer<strong>den</strong>"<br />
else<br />
echo "$1 geht hier nicht"<br />
fi<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
50
Beispiele <strong>II</strong>I<br />
#!/b<strong>in</strong>/<strong>bash</strong><br />
#<br />
# Es wird von jeder uebergebenen Datei e<strong>in</strong> Backup gemacht<br />
#<br />
# Version 1 1/6/2006<br />
for fn <strong>in</strong> "$@"<br />
do<br />
if test -e $fn ; then<br />
cp $fn $fn.back<br />
else<br />
echo `basename $0`: Datei $fn existiert nicht<br />
fi<br />
done<br />
exit 0<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
51
Beispiele IV<br />
#!/b<strong>in</strong>/<strong>bash</strong><br />
#<br />
# Es wird von jeder uebergebenen Datei e<strong>in</strong> Backup gemacht<br />
#<br />
# Version 1 1/6/2006<br />
if [ $# -eq 0 ] ; then<br />
echo "`basename $0`: Aufruf `basename $0` Datei1 [Datei2...]"<br />
exit 0<br />
fi<br />
for fn <strong>in</strong> "$@"<br />
do<br />
if test -e $fn ; then<br />
cp $fn $fn.back<br />
else<br />
echo `basename $0`: Datei $fn existiert nicht<br />
fi<br />
done<br />
exit 0<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
52
Beispiele V – Interaktives E<strong>in</strong>lesen<br />
echo "Bitte Vor- und Nachnamen e<strong>in</strong>geben!"<br />
read Vor Nach<br />
echo Hallo $Vor $Nach<br />
echo "Bitte Kommando e<strong>in</strong>geben!"<br />
read Command<br />
eval $Command<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
53
Beispiele VI – Rechnen mit <strong>bash</strong><br />
X="34"<br />
if [ $X == 34 ] ; then<br />
echo "Jaaa!"<br />
fi<br />
Datentyp Str<strong>in</strong>g<br />
Z=0<br />
while [ $Z -lt 10 ] ; do<br />
echo $Z<br />
let Z+=1<br />
done<br />
Datentyp INT<br />
Das Kommando zum Berechnen ist expr, das normalerweise<br />
mit Back Ticks benutzt wird.<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
54
Beispiele V<strong>II</strong><br />
if [ $# -ne 2 ] ; then<br />
echo "Usage: `basename $0` ..... "<br />
exit 1<br />
fi<br />
rootUID=0<br />
if [ $UID -ne $rootUID ] ; then<br />
echo "must be root to run this script"<br />
exit 1<br />
fi<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
55
Nach dieser Anstrengung etwas Entspannung....<br />
<strong>Betriebssysteme</strong> – WS 2013/14 – <strong>Teil</strong> B/<strong>bash</strong> <strong>II</strong><br />
56