16.01.2014 Aufrufe

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

MEHR ANZEIGEN
WENIGER ANZEIGEN

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

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!