Praktikum "UNIX"

von Prof. Jürgen Plate

Praktikum UNIX

Allgemeines

Notieren Sie sich bei der Bearbeitung der Aufgaben jeweis das/die notwendige(n) Kommando(s) und die Ergebnisse, welche die Anwendung des/der Kommando(s) bringt. Bei Aufgaben mit Shellskripts ist nicht nur das dokumentierte(!) Skript, sondern auch eine typische Ausgabe vorzulegen.
Die ersten Aufgaben sollen auch zum Erforschen des Systems dienen, weshalb die Aufgaben so gehalten sind, daß Sie noch Zeit übrig haben.

Einstieg

  1. Loggen Sie sich mit Ihrem Benutzerkennzeichen ein und geben Sie ein neues Paßwort ein. Öffnen Sie dazu ein Shell-Fenster.

  2. Stellen Sie fest, in welchem Verzeichnis Sie sich befinden.

  3. Stellen Sie fest, welche Dateien und Verzeichnisse sich in Ihrem Home-Directory befinden.

  4. Betrachten Sie den Inhalt der Datei .profile. Falls es keine solche Datei geben sollte, kopieren Sie sich diese aus dem Verzeichnis /etc/skel in Ihr Heimatverzeichnis. Ist auch dort keine vorhanden, legen Sie eine solche Datei an, indem Sie das folgende Kommando ausführen (Achtung: Die verschiedenen Anführungszeichen beachten!)
    echo "echo 'Hallo'" > .profile
    

  5. Wer arbeitet noch am Rechner?

  6. An welchem Terminal arbeiten Sie selbst?

  7. Öffnen Sie ein zweites Shell-Fenster.

  8. Geben Sie den Inhalt des Verzeichnisses "/etc" aus. Verwenden Sie verschiedene Optionen des ls-Kommandos. Verwenden Sie für längere Ausgaben eine Pipe aus "ls" und "more".

  9. Informieren Sie sich über den Gebrauch des Kommandos "banner".

  10. Legen Sie in Ihrem Home-Directory die Unterverzeichnisse mit den Namen "demo" und "bin" an.

  11. Welche Zugriffsrechte haben die beiden neu angelegten Verzeichnisse?

  12. Kopieren Sie einige Dateien aus "/etc" in Ihr Verzeichnis "demo". Wie haben sich Eigentümer- und Zugriffrechte gegenüber den Originalen geändert?

  13. Setzen Sie die Zugriffsrechte des Verzeichnisses "bin" in Ihrem Heimatverzeichnis so, daß für User, Group und Others die "execute"- und "read"-Erlaubnis, Schreibrecht aber nur für den User gesetzt ist.

  14. Erzeugen Sie die Datei "pr1" im Unterverzeichnis "demo"; dazu können Sie die Kommandos "echo", "touch", "cat" oder andere verwenden.

  15. Kopieren Sie die Datei erst mit einem passenden Kommando auf die Zieldatei "pr2". Danach versuchen Sie dasselbe mittels E/A-Umleitung, diesmal mit der Zieldatei "pr3".

  16. Wechseln Sie in das Verzeichnis demo und geben Sie die Datei "pr1" auf dem Bildschirm aus.

  17. Benennen Sie die Datei "pr2" in "prof" um.

  18. Erzeugen Sie ein (Hard-)link auf die Datei "prof"; es soll den Namen "prof1" haben.

  19. Erzeugen Sie ein Softlink (symbolisches Link) auf die Datei "prof"; es soll den Namen "prof2" haben.

  20. Sorgen Sie dafür, daß im Directory "demo" keine Dateien gelöscht werden können.

  21. Versuchen Sie, die Datei "prof" zu löschen. Was geschieht? Setzen Sie die Zugriffsrechte von "prof" auf 000.

  22. Nehmen Sie den Schutz von "demo" wieder zurück und versuchen Sie, "prof" nun zu löschen. Was geschieht? Wie verhalten sich die beiden Links prof1 und prof2 nach dem Löschen von prof?

  23. Suchen Sie die Benutzer-, Gruppen und Paßwortdatei auf der Platte. Welche Zugriffsrechte haben diese Dateien?

  24. Welche Prozeßnummern haben Ihre Prozesse?

  25. Welche Prozesse fallen unter die "Top 10" (Tip: Kommando "top" im Shell-Fenster aufrufen)? Starten Sie den Internet-Browser und beobachten Sie, wie sich die Anzeige ändert.

  26. Rufen Sie eine zweite Shell auf (sh). wie ist das Verwandtschaftsverhältnis zur Login-shell (Kommando "ps -f" bei Solaris)?

  27. Rufen Sie nun noch eine andere Shell, die "bash" auf. Wie sieht nun Ihre Prozeßliste aus?

  28. Bauen Sie nun die Shell-Prozesse mit CTRL-D schrittweise wieder ab. Was passiert beim Abbau der Login-Shell?

  29. Loggen Sie sich wieder ein und probieren Sie diesmal die Überlagerung der aktuellen Shell mit der "bash", indem Sie das Kommando "exec bash" eingeben. Was passiert, wenn Sie die "bash" beenden?

  30. Erzeugen Sie eine Shellvariable namens "HI" mit dem Wert "Hi, wie geht es?" Überprüfen Sie den Variableninhalt.

  31. Öffen Sie nun wieder eine zweite Shell. Welchen Wert hat "HI" jetzt? Weisen Sie der Shell-Variablen den Wert "Hi Fan!" zu und überprüfen Sie den Wert. Beenden Sie die zweite Shell und überprüfen Sie nochmals den Wert von "HI". Wiederholen Sie die o. g. Schritte, aber exportieren Sie "HI" gleich am Anfang.

Editor vi (optional)

  1. Machen Sie sich mit dem Editor "vi" vertraut. Üben Sie besonders das Eingeben und Löschen von Zeilen und einzelnen Zeichen sowie das Ersetzen von Zeichen. Geben Sie dazu folgenden Text ein und speichern Sie ihn auf der Platte unter dem Namen "text1". Denken Sie daran, daß am Ende jeder Zeile die Return-Taste gedrückt werden muß. Vermeiden Sie auch den Gebrauch von Umlauten. Verwenden Sie stattdessen die Umschreibungen 'ae', 'oe', 'ue', 'Ae', 'Oe', 'Ue', 'ss' oder die beim Satzsystem TEX übliche Form '"a', '"o', '"u', '"A', '"O', '"U', '"s'.

    "Denken Sie, wie schön der Krieger, der die Botschaft, die den Sieg, den die Athener bei Marathon, obwohl sie in der Minderheit waren, nach Athen, das in großer Sorge, ob es die Perser nicht zerstören würden, schwebte, erfochten hatten, verkündete, brachte, starb!"

    (Auch wenn Sie es nicht glauben - das ist ein korrekter deutscher Schachtelsatz).
    Nach Korrektur der Tippfehler speichern Sie den Text ab und ersetzen Sie nun alle Vorkommen von "Athen" durch "München". Was geschah mit den "Athenern"?

  2. Kopieren Sie "text1" auf "text2" und bearbeiten Sie nun "text2". Ersetzen Sie "München" wieder durch "Athen". Fügen Sie nun die beiden Zeichen "> " (Größerzeichen und Leerzeichen) am Zeilenanfang ein (global ersetzen) und speichern Sie die Datei. Verlassen Sie den "vi" und drucken Sie beide Texte aus.

Prozesse und Pipes

  1. Lassen Sie den Inhalt des Verzeichnisses /home rekursiv und in Langfassung (siehe "man ls") im Hintergrund auf die Datei "home.aus" in Ihrem Home-Directory ausgeben.

  2. Informieren Sie sich über alle gerade im System laufenden Prozesse. War Ihr Hintergrundprozeß noch dabei?

  3. Sehen Sie sich die Datei "home.aus" an, sobald Ihr Hintergrundprozeß beendet ist und löschen Sie diese danach.

  4. Versuchen Sie dasselbe mit einem Prozeß, der durch das Kommando "sleep 300 &" erzeugt wird.

  5. Mit Pipes kann man recht komfortable Kommandos bilden. Verwenden Sie die Hintereinanderschaltung von "ps -ef" und "grep", um die Prozesse eine bestimmten Benutzers oder eines bestimmten Terminals anzuzeigen.

  6. Geht es auch einfacher, die Prozesse eines Benutzers anzuzeigen? Falls ja, wie?

  7. Das Kommando "find" wird verwendet, um Dateien nach bestimmten Kriterien zu suchen.

    1. Geben Sie einen Aufruf von "find" an, der im Verzeichnis /home alle Dateien sucht, auf die innerhalb der letzten 10 Tage zugegriffen wurde.

    2. Geben Sie einen Aufruf von "find" an, der im Verzeichnis /var alle Dateien sucht, die dem User "root" gehören.

    3. Wie können Sie die Fehlermeldungen ("...permission denied...") loswerden?

    4. Noch eine Theorie-Frage. Welches find-Kommando müßte man verwenden, um in allen Dateien auf der Platte mit der Endung ".txt" nach der Zeichenkette "UNIX" zu suchen. Nicht ausprobieren, sondern theoretisch beantworten!

Einstieg Shell-Programmierung

  1. Nun wird das erste Shell-Skript erzeugt. Wechseln Sie in Ihr "bin"-Verzeichnis. Legen Sie eine Datei "run" an und schreiben Sie einige Kommandos (echo, ls, cd, pwd, usw.) in diese Datei. Setzen sie das Ausführungsrecht (User) für diese Datei. Durch Aufruf von "run" werden nun die darin stehenden Kommandos ausgeführt. Probieren Sie verschiedene Kommandos aus und entwerfen Sie weitere Skripten.

  2. Schreiben Sie ein Shell-Skript, das in einer Endlosschleife alle 10 Sekunden die Uhrzeit (Stunde und Minute) per "banner"-Kommando auf den Bildschirm ausgibt und vorher den Bildschirm löscht. Das Skript kommt natürlich wieder in Ihr "bin"-Verzeichnis. Wie können Sie das Skript beenden? Was passiert, wenn Sie das Skript im Hintergrund starten? Wie können Sie es nun beenden?

  3. Mit dem Kommando nohup kann man Hintergrundaufträge absetzen, die auch nach dem Logout am Terminal weiterlaufen. Eventuelle Ausgaben werden in die Datei "nohup.out" im gerade aktuellen Verzeichnis geschrieben. Estellen Sie ein Shellskript namens "bat", das zunächst ins Heimatverzeichnis des Benutzers wechselt und dann die Parameterzeile an "nohup" übergibt (Start als Hintergrundprozeß nicht vergessen).

Kommunikation

  1. Machen Sie sich mit den E-Mail-Kommando "mailx" vertraut. Senden Sie zunächst Post mit dem Kommando "mailx" an sich selbst. Wie kann man den Usernamen eines Empfängers auf dem lokalen Rechner herausfinden?

  2. Verschicken Sie einen Brief unter Verwendung von "mailx" duch ein Kommando auf der Eingabezeile (also ohne "mailx" interaktiv zu bedienen). Der Brieftext soll aus einer bereits vorhandenen Datei kommen, auf der Kommandozeile sollen Betreff und Enmpfänger angegeben werden.

  3. Schicken Sie testweise einen weiteren Brief an Ihren "normalen" E-Mail-Account.

  4. Stellen Sie fest, auf welchem Rechner Sie eingeloggt sind ('c1' oder 'c2'). Wechseln Sie per "ssh" auf den anderen Rechner.

  5. Prüfen Sie die Verbindung zwischen den Computern mittels des ping-Befehls (/usr/sbin/ping).

  6. Verwenden Sie den arp-Befehl (/usr/sbin/arp), um sich die MAC-Adresse des jeweiligen Kommunikationspartners anzuzeigen.

  7. Stellen Sie mittels des ps-Kommandos fest, welche Serverdienste als Standalone-Service laufen. Konsultieren Sie die Konfigurationsdatei des Internet-Superdaemons 'inetd', um festzustellen, welche Netzwerkdienst sonst noch angeboten werden.

Linux-Administration

User-Administration

  1. Wechseln Sie per ssh auf den Rechner lx-lbs.da.private.hm.edu (Username dort: "student", Passwort wird im Praktikum bekannt gegeben). Werden Sie zum Root-User durch das Kommando sudo bash. Erstellen Sie nun auf lx-lbs einen neuen User mit Ihrem Usernamen (des aktuellen Rechners), der zur Gruppe "student" gehört und sein Heimatverzeichnis unter /home/ hat. Verwenden Sie das Kommando useradd zum Anlegen des Users und dokumentieren Sie Ihre Tätigkeit.

  2. Ändern Sie das Passwort Ihres Users beliebig.

  3. Legen Sie ein Heimatverzeichnis Ihres Users an und ändern Sie User und Gruppe des Verzeichnisses passend für den neuen User.

  4. Kopieren Sie alle Dateien aus dem Verzeichnis /etc/skel in das neue Heimatverzeichnis. Achtung: Die Dateinamen dieser Dateien beginnen mit einem Punkt, sind also nur mit ls -a sichtbar und erfordern speziellen Massnahmen beim Kopieren. chown/chgrp nicht vergessen!

  5. Loggen Sie sich wieder aus und testen Sie den von Ihnen erzeugten Login durch erneutes Einloggen auf lx-lbs mit dem neunen Usernamen.

Crontab-Administration

  1. Das Kommando /usr/bin/uptime liefert aktuelle Info über den Rechner. Der Aufruf liefert die Zeile:
    10:39:28 up 105 days,  3:01,  1 user,  load average: 0.00, 0.00, 0.02
    
    Nach der aktuellen Uhrzeit folgt die "Uptime", die durchschnittliche Anzahl von lauffähigen Jobs und die Zahl der eingeloggten User. "load average" am Ende der Zeile gibt die Rechnerlast in den letzten 1, 5 und 15 Minuten an.

    Tragen Sie in Ihre crontab eine Zeile ein, in der uptime alle 5 Minuten aufgerufen wird und die Ausgabe des Programm an eine Datei namens uptime.log in Ihrem Heimatverzeichnis angehängt wird.

  2. Während Sie auf die ersten Ergebnisse warten, schreiben Sie ein Shell-Skript, das aus der Datei nur die Uhrzeit am Anfang und die erste Zahl von "load average" herausschneidet. Berücksichtigen Sie dabei, dass uptime unterschiedliche Ausgabezeilen erzeugt, je nachdem, wie lange der Rechner schon "up" ist. Was Sie wollen ist das erste und drittletzte Feld der Ausgabe.

  3. Entwerfen Sie crontab-Zeitangaben für:

Administations-Tools

  1. Durch das Kommando top erhält man einen schnellen Überblick über die gegenwärtig laufenden Prozesse. Durch Drücken der Taste "h" wird eine Seite mit Erklärungen der wichtigsten Optionen angezeigt. Starten Sie top und probieren Sie einige Optionen aus.

  2. Ermitteln Sie, welche Informationen folgende Programme liefern:

Shell-Programmierung

  1. Zu Beginn etwas Mathematik. Schreiben Sie ein Shell-Skript "ggt", daß den größten gemeinsamen Teiler der als Parameter übergebenen beiden Zahlen berechnet. Formulieren Sie die Berechnung des GGT als Shell-Funktion. Der Algorithmus lautet folgendermaßen:

    ggt(x,y):
    solange (x != y) wiederhole
      falls (x > y)  dann  x := x - y
      sonst y := y - x;
    
    Denken Sie daran, daß man zum Rechnen das Kommando "expr" braucht.

  2. Formulieren Sie ein Shell-Skript, das als Eingangsparameter ein beliebiges Verzeichnis hat und dieses Verzeichnis und alle seine Unterverzeichnisse bearbeitet. Es soll dabei zählen:
    - wieviele normale Dateien vorhanden sind,
    - wieviele Verzeichnisse vorhanden sind,
    - wieviele sonstige Dateien (Softlinks, Devicefiles, etc.) vorhanden sind
    und dieser drei Zahlen ausgeben. Überprüfen Sie zuerst, ob der Parameter vorhanden ist und eine Verzeichnisangabe enthält.

    Hinweis: Verwenden Sie das find-Kommando um alle Datei- und Verzeichnisnamen zu ermitteln und bearbeiten Sie dann in einer Schleife die Ausgabe des find-Kommandos.

  3. Manche Benutzer achten nicht auf den verbrauchten Plattenplatz. Als Systemverwalter wollen Sie natürlich die Überwachung der Platte automatisieren. Schreiben Sie ein Shellskript "check", das die Belegung der einzelnen Verzeichnisse im Directory "/home" ermittelt und die Verzeichnisse auflistet, deren Dateien insgesamt einen vorgegebenen Wert MAXBLOCKS überschreitet.
    Um den belegten Platz eines Verzeichnisses zu ermitteln, wird das Kommando "du -s <Verzeichnisname>" verwendet. Es werden die Anzahl der belegten Blöcke und das Verzeichnis ausgegeben. Benötigt wird aber nur der Zahlenwert. "du" muß also für jedes Verzeichnis in "/home" getrennt aufgerufen werden.
    Bei Überschreiten von MAXBLOCKS wird eine Zeile an die Datei "$HOME/du-list" angehängt, die den Verzeichnisnamen und die Anzahl der belegten Blöcke enthält.

  4. Schreiben Sie ein Shell-Skript, das von allen Dateien in einem Verzeichnis (ohne dessen eventuell vorhandene Unterverzeichnisse) Das Verzeichnis soll als Kommandozeilenparameter übergeben werden. Falls kein Verzeichnis angegeben wurde, soll das aktuelle Verzeichnis verwendet werden.

  5. Schreiben Sie ein Shell-Skript, das alle Dateinamen im aktuellen Arbeitsverzeichnis, die Großbuchstaben enthalten, umbenennt in Dateien, deren Namen nur noch Kleinbuchstaben enthalten. Sollte der neue Name schon vorhanden sein, soll keine Umbenennung erfolgen. Umlaute brauchen nicht berüucksichtigt zu werden.

  6. Schreiben Sie ein Shell-Skript, das alle auf der Kommandozeile angegeben Rechner (IP-Adresse oder Hostnamen) auf Erreichbarkeit hin überwacht. Dazu sendet das Skript alle 5 Minuten (zum Testen kann man die Zeit verkürzen) ein "Ping" an jeden der angegebenen Rechner (nur ein einziges Ping-Paket, siehe "man ping"). War der Ping erfolgreich, wird der Rechnername mit einen "O.K."-Vermerk ausgegeben, andernfalls mit dem Text "FAIL", z.B.:
    OK   foo.bar.de
    FAIL www.hm.edu
    OK   www.ee.hm.edu
    OK   www.blafasel.de
    ...
    

  7. Um bei jedem Login vom System begrüsst zu werden, schreiben Sie ein Shell-Skript namens "hello", das je nach Tageszeit eine passende Meldung ausgibt: Hinweis: Durch einen geeigneten Parameter liefert das date-Kommando nur die Stunde des Tages, die sich in einer Variablen speichern lässt. Danach wird der Variableninhalt mit den entsprechenden Grenzwerten verglichen und der passende Text ausgegeben.

  8. In der Vorlesung haben Sie gesehen, daß mit dem trap-Kommando beim logout ein Shell-Skript gestartet werden (Signal 0). Erweitern Sie ihre Datei ".bashrc" dahingehend, daß beim Login eine Datei ".lastlog" auf dem Bildschirm angezeigt wird. Danach wird die Datei mit dem Text:

    "Letztes Login: ", gefolgt vom aktuellen Datum/Uhrzeit

    überschrieben. Erweitern Sie ".profile" um einen Trap-Befehl, der an die Datei ".lastlog" eine zweite Zeile mit dem Text:

    "Letztes Logout: ", gefolgt vom aktuellen Datum/Uhrzeit

    erweitert. Bei jedem Login werden nun die Zeilen ausgegeben und Sie können so überprüfen, ob jemand Fremdes mit Ihrer Benutzerberechtigung gearbeitet hat.

Zum Inhaltsverzeichnis Zum nächsten Abschnitt
Copyright © FH München, FB 04, Prof. Jürgen Plate
Letzte Aktualisierung: 12. Jan 2012