UNIX Grundlagen Teil 1

http://www.sirius-net.de
  1. 1. Allgemeines *

  2.  

     

    Installation von LINUX *

    LINUX wird übers Netz installiert *

    Installation am Arbeitsplatz *

    Bemerkungen zur Installation *

    Allgemeine Hinweise zum Abschluß: *

    1. 1. Multi- User Betriebssystem *

    1. 1. 1. Benutzerverwaltung *

    1. 1. 2. Gruppenverwaltung *

    1. 1. 3. Anlegen/ ändern/ löschen von Benutzern/ Gruppen: *

    a.) über semigraphische Werkzeuge *

    KDE CDE Gnome *

    1. 2. Rechte unter UNIX *

    Darstellung von Rechten *

    oktale Notation *

    Festlegung der Prozessattribute euid und egid *

    Beispiel für die Verwendung des suid BIT *

    Kommandos zum ändern der Besitz- und Rechtsverhältnisse an Dateien *

    Ändern des Besitzers von Dateien *

    Ändern des Gruppenbesitzers von Dateien: *

    Ändern der Rechte bei den angegebenen Dateien: *

    oktale Notation: *

    Elementare Dinge *

    Die wichtigsten Kommandos *

    ls [Optionen] [Datei...] *

    Optionen von ls *

    -l ausführliches Format *

    mkdir [-m modus] [-p] Katalog *

    Rmdir Katalog ... *

    rm [Optionen] datei ... *

    Erforderliche Rechte für rm *

    cp [optionen] file1 file2 *

    Pfadvariable: 25.11.99 *

    Links *

    hard link *

    soft ( symbolische ) links *

    Kommando cat *

    kleines C- Programm zur inplementierung von cat: *

    Kommando wc [optionen] [datei...] (word count) *

    Kommando cut [optionen] *

    Kommando telnet *

    Kommando who [ optionen] *

    Wie läuft ein entferntes login ab? *

    Wie kann dafür gesorgt werden, daß auch entfernt angemeldete Benutzer beim shutdown eine Meldung bekommen? *

    Sortieren mit sort *

    mounten eines Dateisystems: *

    Ermöglicht Zugriff auf Dateien und Kataloge dort als ob es ein normales Verzeichnis wäre. Es gibt aber auch eine Reihe von Befehlen, die ausgeführt werden können auf Dateisysteme, die nicht gemountet sind (z.B. fsck) *

    egrep (enhanced global regular expression) und reguläre Ausdrücke *

    Metazeichen in regulären Ausdrücken, wie sie egrep versteht *

    Metazeichenkombinationen *

    Wiederholung von Freitag, den 26.11.99 *

    Der Editor vi *

    Übungen *

    Die wichtigsten Metazeichen der Shell *

    Expandierung von Dateinamen *

    Ein- Ausgabeumlenkung und Piping *

    Kommandosubstitution *

    Bedingte Kommandoausfführung *

    Maskierung der Sonderbedeutung von Metazeichen *

    b) '....' Single Quotes *

    c) ''....'' double quotes *

    weitere Metazeichen der Shell *

    Informationsquellen für UNIX/Linux *

    Der Bootvorgang (Schwerpunkt: SUSE- Distribution von Linux) *

    für jedes runlevel legt ein Eintrag in /etc/inittab fest, was passiert *

    Shell- Script: Einzelne Schritte: *

    1. Allgemeines

    1. Installation von LINUX
  1. IP-Adresse 10.10.12.21
  2. Netzmaske 255.255.255.0
  3. Gateway 10.10.12.1
  4. Name-Server 10.10.10.131
      1. LINUX wird übers Netz installiert
  1. Auif einem Rechner werden Installations-CDs eingelegt
  2. Dieser Rechner erteilt eine (weltweite) Freigabe für das Einhängen (mounten) der Installations-CDs durch andere Rechner (Dateisystem nfs)
      1. Installation am Arbeitsplatz
  1. Booten von Boot-Diskette
  2. Gegebenenfalls Modul zum Zugriff auf Netzwerkkarte (eepro100) laden.
  3. Installationsquelle auswählen:
  4. Installation über nfs
  5. IP-Adresse des Installationsrechners: 10.10.12.14
  6. Gateway (nur wenn unterschiedlich)
  7. Verzeichnis für Installation: /mnt/suse

 
 
user group other
110 100 100
lesen schreiben ausführen lesen schreiben ausführen lesen schreiben ausführen
rwx rwx rwx
Rechte user Rechte group Rechte other
        1. Bemerkungen zur Installation
- Einrichtung des Installationsservers

- Installations-CD´s müssen zum Einhängen mittels nfs für die Clients

freigegeben werden.

- Voraussetzungen:

- 3 Dämonen müssen laufen:

- portmap

- rpc.mountd (remote prozedere call - daemon)

- rpc.nfsd

- Installations-CD muß auf dem Server gemountet werden.

Kommando: mount -t iso9660 /etc/cdrom /mnt (oder /cdrom)

- Das Verzeichnis, in dem die CD eingehängt ist, muss zum mounten mittels nfs freigegeben werden. Die Freigabe erfolgt in der Datei /etc/exports. Hier muss folgende Zeile enthalten sein: /mnt (oder /cdrom).

Kommando kill -SIGHUP pid_rpc.mountd pid_rpcnfsd (Kommando ps -ax gibt die pid aus)

- Client-Seite der Installation über nfs

- Modul zum Zugriff auf die Netzwerkkarte muss geladen werden.

Kommando: insmod /lib/modules/kernel_release/net/eepro100.o

- Partitionierung (fdisk, cfdisk)

- Einrichtung von root-fs (filesystem)

- Typ ext2

- inode-Dichte: 4096 (voreingestellt)

- mount-point: /

- Dateisystem anlegen: mkfs -t ext2 /dev/hda2

- Einrichten vom swap-Bereich

mkswap /dev/hda6

- SUSE richtet die datei /etc/fstab ein, die unter anderem steuert, welche Dateisysteme mit welchen Optionen, auf welchen devices an welchen mount- points eingehängt werden.

- Ein- und Aushängen von Dateisystemen:

mount -t ext2 /dev/hda7 /home

mount -t msdos /dev/hda1 /windows

umount /home oder umount /dev/hda7 umount /windows oder umount /dev/hda1

- Hinweis:

Bei booten wird mount mit der Option -a aufgerufen. Das bewirkt, dass automatisch alle Einträge in der Datei /etc/fstab ausgelesen und die verzeichneten Dateisysteme IP-Adressen mit Netzmasken und des Ethernet-Interface

(ifconfig eth0 10.10.12.14 netmask 255.255.255.0

- Festlegen des default-Gateways (route add default gw 10.10.12.1)

Hinweis:

Routing-Konfiguration werden von YaST in /etc/root.conf abgelegt

- name-Server festlegen. Wird in /etc/resolv.conf abgelegt.

        1. Allgemeine Hinweise zum Abschluß:
- Bei der SUSE-Distribution erfolgt die Konfiguration des Rechners zentral

über Umgebunds-Variablen, die in der Datei /etc/rc.config eingetragen werden.

- Der gesamte boot-Vorgang wird über Variablen aus dieser Datei gesteuert.
 
 

    1. 1. 1. Multi- User Betriebssystem
      1. 1. 1. 1. Benutzerverwaltung
Aufbau dieser Datei:

Loginname:password:uid:gid:kommentar:homeverzeichnis:Login- Programm

Bemerkungen:

Vorname Nachname,Abteilung;Tel.:Geschäft,Tel.:privat ( u. a. vom UNIX- Kommando finger ausgewertet )
 
      1. 1. 1. 2. Gruppenverwaltung
Aufbau dieser Datei:

gruppenname:gpassword:gid:userlist
 
 

Bemerkungen:

      1. 1. 1. 3. Anlegen/ ändern/ löschen von Benutzern/ Gruppen:
  1. direktes editieren von /etc/passwd und /etc/group
  1. über Kommandozeile mit geeigneten Kommandos
  1. über semigraphische Werkzeuge

 
 
 
 

b) unter X- Windows

KDE CDE Gnome

    1. 1. 2. Rechte unter UNIX
  1. lesen ( r ) read
  2. schreiben ( w ) write
  3. ausführen ( x ) execute
Die Vergabe der obigen Rechte erfolgt separat für user ( u ) Dateibesitzer

group ( g ) Gruppe, der die Datei gehört

other ( o ) other (Rest der Welt)

      1. Darstellung von Rechten
  1. symbolische Notation – für ein nicht gegebenes Recht steht ein "-"
rwxrwxrwx

user group other

Bsp.:

rw-r--r-- user darf lesen und schreiben, group und other hat nur leserecht

( Rechte, die in der Regel bei der Neuerstellung von normalen Dateien vergeben werden. ) rwxr-xr-x user darf alles, group und other nur lesen und ausführen ( Rechte, eie in der Regel bei der neuerstellung von Verzeichnissen ( Katalogdatei, Katalog, directory ) vergeben werden.)
      1. oktale Notation
    1. Ziffer steht für die Rechte von User
    2. Ziffer steht für die Rechte von Group
    3. Ziffer steht für die Rechte von other
    1. das höchstwertigste Bit mit dem Stelenwert 4 steht für Leserecht
    2. das höchstwertigste Bit mit dem Stelenwert 2 steht für Schreibrecht
    3. das höchstwertigste Bit mit dem Stelenwert14 steht für ausführen
Bsp.: 6 4 4 110 100 100 == rw-r—r--

Stelle user group other

lesen schreiben ausführen

7 5 5 111 101 101 == rwxr-xr-x

die reale uid und reale gid eines Prozesses sind ohne Bedeutung für die Rechte eines Prozesses.
    1. Festlegung der Prozessattribute euid und egid
Bsp.: User Karl logt ein und startet das Kommando mycmd, mycmd versucht einen Lesezugriff auf myfile

Was passiert alles??

  1. Prüfung: hat Karl das Recht, mycmd auszuführen??
==> x recht für Besitzer von mycmd gesetzt?? Ja ==> ok Nein ==> FIN ==> x recht für Gruppenbesitzer von mycmd gesetzt?? Ja ==> ok

Nein ==> Prüfung, hat irgend eine Gruppe, zu der der User noch gehöhrt, x Recht Ja ==> ok

Nein ==> FIN

Im nächsten Schritt wird ggf das x recht für other überprüft.

2. Falls mycmd aufgerufen werden durfte, dann wird ein neuer Prozess erzeugt, für den die Prozessattribute euid und egid festgelegt werden müssen. der login- Shell, sonst (wenn gesetzt) dann gleichgesetzt mit der uid des

Besitzers von mycmd.

    1. Beispiel für die Verwendung des suid BIT
Problem: Lösung:
    1. Kommandos zum ändern der Besitz- und Rechtsverhältnisse an Dateien
        1. Ändern des Besitzers von Dateien
chown [ -R ] user datei... Beispiel: chown pauline myfile // pauline wird neuer Besitzer von myfile

chown karl ../myfile1 ../../myfile2 //ok

chown berta /home/pauline/sources/c/helloworld.c //ok

chown -R berta /home/pauline // ok

Hinweise:

        1. Ändern des Gruppenbesitzers von Dateien:

        2.  

           

          chgrp [ -R ] gruppe datei ...

        3. Ändern der Rechte bei den angegebenen Dateien:
chmod [ -R ] modus datei ... Beispiel:

chmod u+x myprog // Besitzer von myprog bekommt x-Recht
chmod go-rw myfile // group&other bekommen Schreib- und Leserecht entzogen.
chmod a=rwx file1 file2 // alle dürfen alles mit file1 und file2
chmod ug+x,o-x file1 // user&group erhalten x-Recht; für other entziehen
chmod u-s /usr/bin/passwd // user wird suid BIT entzogen für /usr/bin/passwd

Hinweis:

Nur root und Dateibesitzer dürfen die Rechte an einer Datei ändern.

        1. oktale Notation:
Beispiel:

chmod 755 verz1 // usr darf alles, group & other dürfen lesen und ausführen
chmod 6755 myprog // suid gesetzt, sonst wie oben

       
       
       
       
       
    1. Elementare Dinge

    2.  

       

      Ausloggen -exit

      - logout

      - ^D (strg + D)

      Runterfahren des Systems - shutdown -h now (halten)

      - shutdown -r now (reboot)

      - ^ alt del (Erfolg abhängig von /etc/inittab)

      virtuelle Terminals:

      ALT F1 bis ALT F6 ==> voneinander unabhängige Sitzungen

      Die wichtigsten Kommandos

      cd [Katalog] -wechselt in das aktuelle Verzeichniss

      - kein Katalog angegeben: Wechsel ins Homeverzeichnis

      - x- Recht erforderlich

      Bsp.: cd [RETURN] Wechsel ins Homeverzeichnis ($HOME)

      cd .. Wechsel ins übergeordnete Verzeichnis

      cd bin (relativer Pfad) wechselt ins Unterverzeichnis bin des

      aktuellen Verzeichnisses

      cd /bin (absoluter Pfad) wechselt ins Verzeichnis /bin.

      (== Unterverzeichnis von root)

      pwd (print working drive story)

      zeigt das aktuelle Verzeichnis an

      id -Ausgabe von aktueller uid, gid, loginname und allen Gruppen, zu denen ebenfalls zugehörigkeit besteht

    3. ls [Optionen] [Datei...]
-Anzeige des Inhaltes der angegebenen Kataloge

(== dir unter DOS)

Aufgabe: erzeugen sie als Popeluser eine neue Datei

ermitteln sie die Rechte an der Datei

    1. als popeluser einloggen
    2. id > gaga
    3. ls -lisa gaga (Rechte = 644)
      1. Optionen von ls
      2. -l ausführliches Format
      -i inode anzeigen

      -a auch Dateien mit führendem ».« werden angezeigt

      Bsp.: als popeluser einloggen (oder als popeluser ins home-Verzeichnis wechseln

      mit cd)

      ls [RETURN]

      ls -a

      -d ist eine Datei eine katalogdatei, so wird nicht deren Inhalt, sondern nur die Katalogatei selber angezeigt

      Bsp.: ls -l /etc

      ls -d /etc

      -b nicht druckbare Zeichen in Dateinamen werden oktal dargestellt

      Übung:

      a) hat popeluser Schreibrecht auf /etc

      ls -ld /etc ==> nein

      b) hat popeluser Leserecht für /ets/passwd imd /etc/shadow ?

      ls - l /etc/passwd ==> ja

      shadow ==> nein

      c) ist in /usr/bin/passwd das s-Bit gesetzt?

      ls -l /usr/bin/passwd ==> ja

      Falls ja: - Entziehen sie das suid- Bit als root

      #chmod u-s /usr/bin/passwd

      -Versuchen sie als popeluser das passwort zu ändern

      Was passiert?

      Suid- bit in /usr/bin/passwd wieder setzen

      umask [maske] Anzeige/setzen der file / creation mask (Dateizuordnungsmaske)

      - Bei der Neuerstellung von Dateien und Katalogen werden systemabhängig

      voreingestellt Rechte vergeben.

      Für LINUX gilt:

      - normale dateien: 666

      - Katalogdateien: 777

      - Diese voreingestellten Rechte können mit umask eingeschränkt werden.

      Dabei gilt: Jedes in umask gesetzte BIT sorgt für den Entzug des

      entsprechenden Rechtes.

      - Dateierzeugungsmaske ist solange gültig, bis sie wieder geändert wird.

      - Beim einloggen wird die fcm in der Regel automatisch auf 022 gesetzt.

      - Mit umask 000 auf die voreingestellten Rechte zurückgesetzt (file: 666)

    1. mkdir [-m modus] [-p] Katalog
Erforderliches Recht für mkdir ist Schreibrecht auf dem Katalog, in dem der neue Katalog erstellt wird.
 
      1. Rmdir Katalog ...
    1. rm [Optionen] datei ...
      1. Erforderliche Rechte für rm
Beispiel: Alle user legen im Verzeichnis /tmp ihre temporären Dateien ab. Rechte dort: rwxrwxrwt In /tmp ist das sticky-BIRT gesetzt, damit nicht jeder jedem dort die Dateien weglöschen kann.

Setzen/löschen vom sticky-BIT: chmod -/+t Katalog

    1. cp [optionen] file1 file2
cp [optionen] file... katalog

Optionen

-i Rückfrage vor überschreiben einer existierenden Datei

-r rekursiv: kompletter Verzeichnisbaum wird kopiert

Erforderliche Rechte: Besitzer der Zieldatei: Im Gegensatz zum user ist bei root in der Pfadvariablen das aktuelle Verzeichnis nicht enthalten. Grund:

$ cp /bin/rm /tmp/ls

# cd /tmp

# ls * // würde jetzt alles löschen

mv file1 file2 // entspricht umbenen

mv file1 katalog... // verschieben
 
 

Hinweise:

inode1 name1

inode2 name2

Erforderliche Rechte: Besitzverhältnisse:
    1. Pfadvariable: 25.11.99
$ ( Popeluser ) gibt z. B. ein: ls
  1. $PATH für popeluser enthält die Verzeichnisse nicht, die Kommandos enthalten, deren Ausführung root vorbehalten ist
  2. $PATH für root enthält kein Eintrag für das aktuelle Verzeichnis, $PATH für popeluser aber sehr wohl.
Dies bedeutet: Bsp.:

Auf einer Konsole als popeluser einloggen, auf einer anderen als root
 
root Popeluser
echo $PATH echo $PATH
shutdown –r now shutdown –r now
cd /tmp cd /tmp
echo ls > myls echo ls > myls
chmod u+x myls chmod u+x myls
myls ( Fehler ) myls ( ok )
/tmp/myls ( ok ) /tmp/myls ( ok )
./myls ( ok ) ./myls ( ok )
rm myls rm myls

    1. Links
und soft links ( auch als als symbolischer link bezeichnet )
      1. hard link
Bsp.:

cd

echo lalla > file_1

ln file_1 file_2
 
 

==> Die Datei file_1 ist jetzt unter dem weiteren Namen file_2 ansprechbar

==> Durch diesen hard link wird keine neue Datei erzeugt.

==> file_1 und file_2 haben den selben inode

==> der Referenzzähler im inode wird um 1 erhöht.
 
 

Ls -lisa file_1 file_2

==> hard links sind nur möglich innerhalb der Grenzen eines Dateisystems

      1. soft ( symbolische ) links
Bsp.:

cd

echo lalla > datei_1

ln -s datei_1 datei_2

ls -li datei_1 datei_2

==>Referenzzähler von datei_1 ist nach wie vor 1

==>inode von datei_1 und datei_2 sind verschieden

==>der symbolische link wird beim Dateinamen mit einem Pfeil angrzeigt

==>als Dateityp (linke Spalte bei Rechten) wird ein l angezeigt.

/home/paul

1000 file_1

1000 file_2 hard link

4789 file_3 soft link

    1. Kommando cat
cat [datei...] Bsp.: cat (RETURN)

lalla (RETURN)

lalla

^D // Dateiende

cat < lalla > gaga // kopiert die Datei lalla nach gaga

cat > blabla // Tastatureingaben werden in die Datei blabla geschrieben

cat file_1 // Anzeige des Inhalts von file_1 auf Bildschirm

cat < file_1 // dito (nur äusserlich)

cat file_1 cat < file_1

argc : 2 argc : 1

argv [1] : file_1 argv [1] : NULL

fp : file_1 fp : stdin <--- wird von der shell auf file_1 umgelenkt

        1. kleines C- Programm zur inplementierung von cat:
# include<stdio.h>

#include<stdlib.h>

int main(int argc, char * argv[])

{

int c;

FILE * fp;

if(argc) fp = stdin;

if(argc == 2) fp = fopen(argv[1] »1«); // auf NULL abfragen

while(( c= fgetc(fp)) !=EOF)

putchar(c);

exit(0);

}

    1. Kommando wc [optionen] [datei...] (word count)
Zählt die Anzahl der Zeichen, Wörter und Zeilen im Eingabestrom

Optionen -c Zeichen

-l Zeile

-w Wort

Bsp.: Wie viele »user« haben einen account auf Ihrem System

wc -l /tmp/pwfile

rm /tmp/pwfile

    1. Kommando cut [optionen]
Hinweise: Bsp.: Ausgabe von loginname, uid und gid aller user auf dem System

cut -d: -f1,3,4 /etc/passwd

Bsp.: Welche Rechte hat der Besitzer von /etc/shadow en dieser Datei?

ls -l /etc/shdow | cut -c2-4

    1. Kommando telnet
telnet host telnet 10.10.12.14 [RETURN]

user: sw [RETURN]

passwort: sw [RETURN]

    1. Kommando who [ optionen]
Übung: Zum ersten: In der Spalte tty (p..)

in der Spalte FROM

zum zweiten: Meldung

        1. Wie läuft ein entferntes login ab?
        1. Wie kann dafür gesorgt werden, daß auch entfernt angemeldete Benutzer beim shutdown eine Meldung bekommen?

 
 
 
 
    1. Sortieren mit sort
(Achtung: Zählung beginnt mit 0 !!) Allgemeiner Aufruf:

sort [optionen] [datei...]
 
 

Bsp.: Ausgabe von loginnamen und gid aller user aus /etc/passwd, sortiert nach gid, bei gleicher gid

zusätzliche Sortierung nach loginname.

sort -t: -n +3 +0 /etc/passwc | cut -d: -t1,4
 
 

      1. mounten eines Dateisystems:


Ermöglicht Zugriff auf Dateien und Kataloge dort als ob es ein normales Verzeichnis wäre. Es gibt aber auch eine Reihe von Befehlen, die ausgeführt werden können auf Dateisysteme, die nicht gemountet sind (z.B. fsck)

    1. egrep (enhanced global regular expression) und reguläre Ausdrücke
Aufpassen:

teilweise Überschneidungen von Metazeichen in regiulären Ausdrücken und Metazeichen in der shell.

egrep [optionen] muster [datei...]

Optionen:

-i (ignore case - Unterschiede zwischen Groß- und Kleinschreibung ignorieren)

-v gibt alle Zeilen aus, auf die das Muster nicht passt.

-c (count) gibt Anzahl der Treffer des Musters aus, aber nicht die Treffer selbst.

    1. Metazeichen in regulären Ausdrücken, wie sie egrep versteht

    2.  

       

      . steht für genau ein beliebiges Zeichen, exklusive \n

      ^ der nachfolgende Ausdruck muß am Zeilenanfang stehen

      $ der voranstehende Ausdruck muß am Zeilende stehen

      [xyz] genau ein Zeichen (x oder y oder z)

      [^xyz] Umkehrung: genau ein Zeichen (weder x, noch y, noch z)

      [x-y] genau ein Zeichen zwischen x und y, inclusive x und y

      [^x-y] Umkehrung: genau ein Zeichen außer Zeichen zwischen x und y, inklusive x, y

      \ maskiert die Metabedeutung des nachfolgenden Zeichens

      * beliebig oft der vorhergehende Ausdruck (inklusive null mal)

      ? höchstens einmal der vorhergehende Ausdruck (inklusive null mal)

      + mindestens einmal der vorhergehende Ausdruck

      Bevor die shell ein Kommando aufruft, wertet sie alle Metazeichen aus.

      Um für die shell diese Zeichen zu maskieren, kann der ganze Ausdruck in einfache Hochkomma gesetzt werden.

      Bei $ erwartet die shell eine Variable

      Beispiele:

      Ausgabe aller Zeichen aus /etc/passwd: egrep a /etc/passwd

      Alle Zeilen, die mit a beginnen: egrep ^a /etc/passwd

      Alle Zeilen, die mit bash enden: egrep 'bash$' /etc/passwd

      Alle Zeilen, die nirgens ein a enthalten:

      [^a] falsch: liefert alle Zeilen, die irgendwo was enthalten kein a ist

      ^[^a]*$ Zwischen Zeilenanfang und -ende eine beliebig häufige Wiederholung von nicht a

    3. Metazeichenkombinationen
      1. Wiederholung von Freitag, den 26.11.99
      ? Multiplikator: mindestens 0 mal, höchstens 1 mal

      \

      () Gruppierung

      | Alternative: entweder der Ausdruck links von | oder rechts von |

      a

      a*

      a+

      [0-9]a[0-9] jede Zeile, in der ein a steht mit Zahl zw. 0 und 9 davor und dahinter

      a? hier kriegt mann wieder alles als Treffer

      [0-9]a?[0-9] 12aaa34 ok 1aaaa2 nö

      a$ alle Zeilen, die mit einem a enden

      [4-7r-z]$ alle Zeilen die entweder mit 4-7 oder mit r-z enden

      [4-15r-z]$ is nix nur 0-9

      [1-4][r-z]$ das vorletzte muß 1-4, das letzte muß r-z sein

      [SPACE]$ Endet mit Space

      \.$ alles mit . am Zeilenende

      . Ist keine Leerzeile

      ^$ Ist eine Leerzeile (beginnt mit nix, gefolgt von nix, endet mit New line)

      ... Enthält mindestens 3 Zeichen

      ^...$ Enthält genau3 Zeichen

      a) ^.?.?.?$ Enthält höchstens 3 Zeichen

      b) ^.{0,3}$ -«- (egrep mit Option -E aufrufen)

      In welchen Dateien in /usr/bin ist das suid. Bit gesetzt, aber nicht das sgid-bit?

      ls -l /usr/bin | egrep '^...s..[^s]'

      Bilden sie die folgenden regulären Ausdrücke

      a) enthält keine Ziffer ^[^0-9]*$

      b) enthält höchstens eine Ziffer ^[^0-9]*[0-9]?[^0-9]*$
       
       

      zwischen Zeilenanfang und Zeilenende beliebig oft etwas, das keine Ziffer ist, gefolgt von höchstens einer Ziffer, gefolgt von beliebig oft etwas, das keine Ziffer ist

      c) enthält genau eine Ziffer ^[^0-9]*[0-9][^0-9]*$

      zwischen Zeilenanfang und Zeilenende beliebig oft etwas, das keine Ziffer ist, gefolgt von genau einer Ziffer, gefolgt von beliebig oft etwas, das keine Ziffer ist

      d) enthält mindestens eine Ziffer [0-9]

      e) beginnt mit a und endet mit a (^a.*a$)|(^a$)

      f) beginnt mit a oder endet mit a ^a|a$

      g) gesucht sind die loginnamen aller user, deren primäre Gruppe die Gruppe mit der gid 100 ist (genaue Lösung) egrep '^[^:]*:[^:]*:[^:]*:100:' /etc/passwd | cut -d: -f1

    4. Der Editor vi
- Anhängen

- Überschreiben

Wechsel der modi

Editiermodus ==> Kommando ESC

Kommando ==> ex- Modus :

ex- Modus ==> Kommando ESC ( oder Kommando absetzen)

Editiermodus ==> ex- Modus ESC:
 
 

      1. Übungen
cd

cp /etc/passwd .

Vi passwd (Kommandomodus)

dd Zeile flöschen

3dd Zeilen löschen

3yy 3 Zeilen im Standartpuffer speicher

''b24yy speichert 24 Zeilen im Puffer b

''cp kopiert den Inhalt des Puffers c an die aktuelle Cursorposition

3dw löscht ab cursor nach rechts 3 Worte

G Dateiende

10G Zeile 10

/games sucht games richtung Textende

?games sucht games richtung Textanfang

ex- modus

R replace (überschreiben) alles, bis ESC gedrückt wird

r replace 1 Zeichen

ESC wieder im Kommandomodus

:1,$s/muster/ersetzung/ ersetzt im gesamten Text das jeweils erste Vorkomen von Muster in einer Zeile durch Ersetzung

:1,$s/muster/ersetzung/g macht obiges im ganzen Text

1 2 3

Bsp.: :100,200s/zz/Zeilenzähler/g

:1,$s/$/./ Jedes Zeilenende wird durch einen Punkt ersetzt

1 , $ s / \ / \ * . * \ * \ / / / a) backslash maskiert slash aus zu slash

1 2 3 b) backslash maskiert stern aus zu stern

c) beliebig oft ein beliebiges Zeichen

d) backslash maskiert den Stern aus zu Stern

e) backslash maskiert slash aus zu slash

das muster wird ersetzt durch den Inhalt zwischen slash 2 und 3 ==> also durch nichts! ==> muster wird gelöscht

Datei enthält die folgenden Zeilen:

: : :

zz=2; /*Zeilenzähler*/

n=4; /*anzahl*/ limit=9 /*obergrenze*/

wie sehen die Zeilen aus, nachdem das vorherige Substitute durchgeführt wurde:

zz=2;

n=4; ==> Substitutes sind gefräßig

:u undo

:w schreiben Pufferinhalt in aktuelle Datei

:w !file speichert in Datei file. Wenn sie existiert, wird sie überschrieben

:w file erzeug die Datei und schreibt Pufferinhalt hinein, wenn Datei vorhanden kommt Fehlermeldung

:q beenden nur nach speichern (Meldung!)

:q! beenden ohne speichern

:wq speichern und verlassen

ZZ Datei speichern und vi verlassen

:!ls :! externes kommando ausführen

:!cc % kompiliert und linkt die aktuelle Datei

:!sh neue Shell (mit exit wieder in vi)

:e /etc/group ruft group auf

:e! /etc/group ruft group auf ohne die alte Datei zu speichern

:e# zurück in die ursprüngliche Datei

:e! Alle Änderungen seit dem letzten Schreiben werden rückgängig gemacht

:e newfile Editieren einer anderen Datei (aktueller Pufferinhat muß geschrieben sein)

:e! newfile wechsel ohne vorherige Sicherung möglich

:!cmd Ausführung eines externen Unix- Kommandos

ESC

$ Zeilenende

^ Zeilenanfang

10G an 10. Zeile

p (P) nach Cursor/ vor Cursor

ma setzt in der aktuellen Zeile die Textmarke a

'b springt zur Textmarke b

    1. Die wichtigsten Metazeichen der Shell
? ganau ein beliebiges Zeichen

* eine beliebige, auch leere Zeichenfolge

[r-z] ein Zeichen zwischen r und z

[!r-z] ein Zeichen, nicht im Intervall r-z

[rxy] ein Zeichen r od. X od. y

[!rxy] ein Zeichen nicht r od. X od. y

Bsp.:

rm *.* löscht alle Dateien, deren Name einen Punkt enthält

rm * löscht alle Dateien, deren Name nicht mit einem Punkt anfängt

rm *.[pcs] löscht alle Dateien, die auf .p, .c, .s enden

ls a*b*c* anzeige aller Dateien, deren Name mit a beginnt und irgendwo die Buchstaben b und c in dieser Reihenfolge enthalten.
 
 

Hinweis:

vor dem Aufruf eines Kommandos wird die Kommandozeile von der Shell zerlegt und auf Metazeichen hin untersucht; erst dann wird das Kommando gestartet.

Bsp.:

Das aktuelle Verzeichnis enthält die folgenden Dateien:

myprog.c myscript.pl myscript.sh

ls my* argc: 4

argv[1]: myprog.c

argv[2]: myscript.pl

argv[3]: myscript.sh

ls ym* argc: 2

argv[1]: ym*

egrep ab * Alle Dateien im aktuellen Verzeichnis (mit Ausnahme von .-Dateien) werden Zeile für Zeile nach dem Muster ab durchsucht.

egrep *ab Annhme: im aktuellen Verzeichnis gibt es die folgenden Dateien:

a1,a2,a3

==> * wird von der Shell zu a1 a2 a3 expandiert.

==> Shell startet egrep mit folgenden Argumenten:

argv[1]: a1

argv[2]: a2

argv[3]: a3

argv[4]: ab

==> egrep interpretiert a1 als Muster und a2, a3 und ab als Dateinamen, also werden a2, a3 und ab nach dem Muster a1 durchsucht --> Da ab keine Datei, Fehlermeldung

    1. Ein- Ausgabeumlenkung und Piping
> Umlenkung von stdout in eine Datei.

2> Umlenkung von stderr in eine Datei (Fehlerkanal)

Bsp.: ls > /tmp/inhalt der Inhalt des Aktuellen Verzeichnisses wird in die Datei /tmp/inhalt geschrieben

sort myfile > myfile erzeugt eine leere Datei (setzt die Länge von myfile auf 0)

//schwerer Fehler

sort -o myfile myfile alles ok

ls -xyz > blabla Blödsinn!!!! -leere Datei blabla wird erzeugt, Fehlermeldung auf den Bildschirm ausgegeben (wegen ungültiger Optionen)

2> Umlenkung von stderr in eine Datei.

Bsp.:

ls -xyz 2> blabla ==> Fehlermeldung steht nun in der Datei blabla

> /dev/null Umlenkung von stdout oder stderr aufs NULL- Device

2> /dev/null (verschwindet auf Nimmerwiedersehen)

Bsp.: a) egrep root /etc/passwd > /dev/null

b) ls -xyz 2>/dev/null ==> Schwachsinn!!!!

2>&1 ==> stderr wird in die selbe Datei umgelenkt, wie stdout

Bsp.: mkdir v1

cd v1

echo a > a

echo b > b

echo c > c

chmod a-r b

a) cat * > abc Dateiinhalt: a, c

b) cat * > abc 2>&1 Dateiinhalt: a,Fehlermeldung, c

Ein weiteres Beispiel:

find / -name core -print > /tmp/corefiles 2>&1

==> durchsucht, ausgehend vom root- Verzeichnis, alle Verzeichnisse nach Dateien mit dem Namen core, die Pfade der gegundenen Dateien und alls Fehlermeldungen werden

in der Datei /tmp/corefiles geschrieben.

< Umlenkung von stdin auf eine Datei

Bsp.: sort < /etc/passwd Datei /etc/passwd wird zeilenweise aufsteigend sortiert auf

stdout ausgegeben
 
 

| Pipe; verbindet stdout des links stehenden Kommandos mit stdin des rechts stehenden Kommandos

Bsp.: who | wc -l

find / -name '*.c' -print | wc -l ermittelt die Anzahl aller Quelltexte im System

ls -l | wc -l liefert die Anzahl der Dateien im Aktuellen Verzeichnis

ls | rm Fehler rm liest nicht von stdin, sondern aus dem Argumentevector

(rm [optionen] datei... wc [optionen] [datei...])

>> stdout eines Kommandos wird umgelenkt zum anhängen an eine Datei. Wenn die Datei noch nicht existiert, wird sie erzeugt.

Bsp.: ls /bin > /tmp/inhalt

ls /sbin >> tmp/inhalt

    1. Kommandosubstitution
Die von einem Kommando auf stdout geschriebene Ausgabe wird zum Argumentevector eines anderen Kommandos.

Bsp.:

Die Datei myfile enthält die folgenden Zeilen:

file_1

/tmp/file_2 Inhalt von myfile

/home/paul/file_3

rm `cat myfile`

  1. die Shell führt das Kommando cat myfile aus
  2. die von cat myfile erzeugte Ausgabe wird in einer Liste abgelegt
  3. diese Liste wird rm als Argumentevector übergeben
rm `find . -name '*.tmp' -print`
  1. find generiert eine Liste, die die Namen aller Dateien im aktuellen Verzeichnis (und dessen Unterverzeichnissen, Unterverzeichnissen...) enthält, deren Name mit .tmp endet.
  2. Die shell übergibt diese Liste als Argumentevector an das Kommando rm
  3. rm löscht diese Dateien.
Bsp.: rm `cat filelist`

cat mymessage | mail `cat userlist`

Bsp.:

an alle User der primären Gruppe 100: »treffen um 16 Uhr in Raum 401«

(am Stück eingeben)

echo ''Treffen um 16 Uhr in Raum 401'' |

mail `egrep '^[^:]*:[^:]*:[^:]*:100:' /etc/passwd |

cut -d: -f1`
 
 
 
 

    1. Bedingte Kommandoausfführung
cmd1 && cmd2 Erklärung: cmd2 wird nur ausgeführt, wenn cmd1 erfolgreibch

ausgeführt wurde, d.h., wenn der exit- Status von cmd1 0 ist.

cmd1 || cmd2 Erklärung: cmd2 wird nur ausgeführt, wenn cmd1 nicht erfolgreibch

ausgeführt wurde, d.h., wenn der exit-Status von cmd1 ungleich 0 ist.

Bsp.:

a) cc myprog.c || vi myprog.c ==> wenn compiler nicht erfolgreichwar, dann vi!

b) cc myprog.c && a.out ==>wenn compiler ok, dann gleich a.out erzeugt und gestartet

c) cc myprog.c && a.out || vi ==>wenn compiler ok dann start a.out, wenn a.out ok,

dann ok, sonst vi

Übung:

wenn root gerade im System angemeldet ist, soll ihm der Inhalt der Datei mymessage geschickt werden als mail (bitte genaue Lösung)

Lösung:

who | egrep '^root ' > /dev/null && mail root < mymessage

Erklärung:

Hinweis: der exitstatus des zuletzt ausgeführten Kommandos wird in der Internen Variablen $? abgelegt

Bsp.: ls -xyz 2> /dev/null =>blödsinn

echo $? /* !0 */

ls -l > /dev/nul

echo $? /* 0 */

    1. Maskierung der Sonderbedeutung von Metazeichen

    2.  

       

      a) \ maskiert die Bedeutung des unmittelbar nachfolgenden Metazeichens; ohne Wirkung, wenn das

      Zeichen keine Metabedeutung hat

      Bsp.: rm *

      rm \* löscht die Datei mit dem Namen * (argv[1] => *)

      rm \r löscht die Datei mit dem Namen r (argv[1] => r)

      echo $PATH Inhalt der Umgebungsvariablen $PATH

      echo \$PATH Anzeige: $PATH

        1. b) '....' Single Quotes
      ==> inerhalb von single quotes verlieren alle Metazeichen ihre

      Sonderbedeutung

      Bsp.: rm '$HOME' löscht die Datei mit dem Namen $HOME

      rm -r $HOME löscht rekursiv das homeverzeichnis des users

      echo lalla gaga blabla Ausgabe: lalla gaga blabla

      (argc: 4; argv[1]: lalla .....)

      echo 'lalla gaga blabla' Ausgabe: lalla gaga blabla

      (argc: 2; argv[1]: lalla gaga blabla)

      cut -d[space] -f1 myfile Fehler!!

      cut '-d[space]' -f1 myfile ok

      c) ''....'' double quotes

      ==> alle Metazeichen verlieren ihre Bedeutung, mit Ausnahmeder folgenden verlieren ihre

      Sonderbedeutung:

      $ Variablensubstitution wird durchgeführt

      `.....` Kommandosubstitution wird durchgeführt

      \ behält teilweise Sonderbedeutung

      Bsp.: echo ''aktuelles Verzeichnis: `pwd`'' anzeige aktuelles Verz.: /verz

      rm ''$HOME/*'' löscht die Datei mit dam Namen * im homeverzeichnis

    3. weitere Metazeichen der Shell
; implizites return

Bsp.: ls;who;pwd[RETURN] gleichbedeutend mit ls[RETURN]

who[RETURN]

pwd[RETURN]

(Verwendung vor allem in shellskripts)

& Ausführung eines Kommandos im Hintergrund

Bsp.:

find / -name '*.c' -print > /tmp/cfiles 2>/dev/null &

Hinweise: - Stdin von Hintergrundprozessen wird auf /dev/null umgelent (liefert EOF schon beim 1. Versuch) a) sort[RETURN] eins zwei drei vier ^D

b) sort &

- stdout von Hintergrundprozessen sollte in der Regel in eine Datei umgelenkt werden, damit keine Vermischung mit Vordergrundprozessen

stattfindet.

- die pid des zuletzt erzeugten Hintergrundprozesses wird in der Variablen $!

abgelegt.

Bsp.: find . -name '*.old' -exec rm {} \; &

echo $! (cmd1;cmd2) > file cmd1 und cmd2 schreiben beide in die Datei file.
       
       
       
    1. Informationsquellen für UNIX/Linux
a) man- pages (online. Dokumentation zu Kommandos)

man ls (/schlagwort ?schlagwort q=exit)

man man (Referenz zu man)

b) howtos /usr/doc/howto/de ==>deutsch

/en ==>englisch

c) ettliche komplette Bücher (Serie doc) z.B.: linux network administrator guide

d) support- datenbank

e) newsgroups (comp.os.linux -- englisch / de.comp.os.linux -- deutsch)

f) Quelltexte (Verweise auf emails oder Websites)

g) Installationssupport von SUSE (sehr gut -- registrieren lassen!!)

h) /usr/doc/packages

Hinweis:

gzip/ gunzip

    1. Der Bootvorgang (Schwerpunkt: SUSE- Distribution von Linux)
si Systeminitialisierung

1 Multiuser ohne Netzwerk

2 Multiuser mit Netzwerk

3 Multiuser mit Netzwerk und xdm (x- Windows)

        1. für jedes runlevel legt ein Eintrag in /etc/inittab fest, was passiert
si das shell- script /sbin/init.d/boot

(File- Systen- Check ==> (fsck),

Einhängen von Dateisystemen gemäß /etc/fstab,

laden von Modulen, .....)

In runleveln - wird jeweils das Shell- script /sbin/init.d/rc

1, 2, 3 aufgerufen; diesem wird das aktuelle runlevel als Argument übergeben

- zu jedem runlevel gibt es ein eigenes Unterverzeichnis in /sbin/init.d

/sbin/init.d/rc1.d //runlevel 1

/sbin/init.d/rc2.d //runlevel 2

/sbin/init.d/rc3.d //runlevel 3

- In jedem dieser Verzeichnisse befinden sich Start- und Killscripts

- Startscripts beginnen mit einem S, gefolgt von 2 Ziffern

- Killscripts beginnen mit einem K, gefolgt von 2 Ziffern

- es gibt in der Regel entspricht jedem Startscript auch ein Killscript

Bsp.: ls -l /sbin/init.d/rc2.d/*network

K40network symbolische links auf ein und dieselbe Datei

S05network (/bin/init.d/network)

- rc macht nun in jedem runlevel folgendes:

- es ruft alle Kill- scripts des vorherigen runlevels auf, es sei denn, das neue runlevel hat ein gleichnamiges Start- script - es ruft alle Start- scripts des neuen runlevels auf, es sei denn, das vorherige runlevel hat ein gleichnamiges Kill- script

- rc r uft alle Kill- scripts mit dem Parameter stop auf, und

alle Start- scripts mit dem Parameter start

- jedes start- und killscript liest am Anfang die zentrale Konfigurationsdatei /etc/rc.config ein; über dort definierte Variablen wird das Verhalten der

Start/ Stopscripts gesteuert.

- nach erreichen des default- runlevels wird für jede virtuelle Konsole ein mingetty gestartet

Bsp.: YaST hat gefragt, ob initd gestartet werden soll

Was passiert:

- YaST setzt die Variable START_INETD in /etc/rc.config

- inetd wird, wenn überhaupt, im runlevel 2 gestartet

- es muß ein Start- und Killscript für inetd im Verzeichnis /sbin/init.d/rc2.d geben

S20inetd

symbolische links auf /sbin/init.d/inetd

K20inetd

- das script /sbin/init.d/inetd muß herausfinden, og der inetd überhaupt gestartet werden soll. Es

liest deshalb die Datei /etc/rc.config ein, um den Wert der Variaben

START_INETD zu ermitteln. (. /etc/rc.config)

Übung:

Jeder Wechsel von runlevel 2 soll in der Datei /var/log/r2level protokolliert werden; diese Protokollierung soll allerdings nur stattfinden, wenn die Variable STARTPROT auf »yes«

gesetzt ist (in /etc/rc.config).

    1. Shell- Script: Einzelne Schritte:
- Variable STARTPROG in /etc/rc.config setzen

- ein shellscript mit dem namen r2level im Verzeichnis /sbin/init.d erstellen

- Einlesen von /etc/rc.config

- wenn die Variable STARTPROG auf »yes« gesetzt ist

- überprüfen Ob das script mit dem Argument start oder stop aufgerufen wurde

- falls start: die Zeile »Eintritt in runlevel 2 : Datum, Zeit« in die Datei /var/log/r2level

schreiben

- falls stop: die Zeile »Verlassen von runlevel 2 : Datum, Zeit« in die Datei /var/log/r2level

schreiben
- x recht für das script geben

- 2 symbolische links in /sbin/init.d/rc2.d legen

==> K99r2level

==> S01r2level

1 ) vi /etc/rc.config irgendwo: STARTPROT=''yes''

speichern

2 ) cd /sbin/init.d vi r2level

.[space]/etc/rc.config

if [ $STARTPROT = ''yes'' ]

then

case ''$1'' in

start) echo ''Eintritt runlevel2: `date` >> /var/log/r2level;;

stop) echo ''Austritt runlevel2: `date` >> /var/log/r2level;;

*) echo ''Aufruf: $0 start/stop'' 1>&2; exit 1;;

esac

fi

3 ) x Recht setzen chmod a+x r2level

4 ) cd rc2.d ln -s ../r2level S01r2level

ln -s ../r2level K99r2level
 
 

5 ) testen init 1

init 2

cat /var/log/r2level