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. Wer arbeitet noch am Rechner ("who")?

  5. An welchem Terminal arbeiten Sie selbst?

  6. Öffnen Sie ein zweites Shell-Fenster.

  7. 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".

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

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

  10. Welche Zugriffsrechte haben die beiden neu angelegten Verzeichnisse?

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

  12. 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.

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

  14. 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".

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

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

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

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

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

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

  21. 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?

  22. Kopieren Sie die Datei "gibtsnicht" nach "gibtsdoch". Eventuelle Fehlermeldungen sollen nicht am Bildschirm sondern in die Datei "fehler" geschrieben werden. Was steht in der Datei "fehler"?

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

  24. Erproben Sie die Kommandos df und du.

  25. Welche Prozeßnummern haben Ihre Prozesse?

  26. 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.

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

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

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

  30. 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?

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

  32. Ö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, Pipes und Verzeichnisse

  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 mit den Kommados ps und pstree. War Ihr Hintergrundprozeß da 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. Angenommen eine Datei enthält Zeilen, die mit einem #-Zeichen beginnen. Wie können Sie die Datei mit Hilfe von grep so anzeigen, daß die #-Zeilen nicht enthalten sind?

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

  7. Geht es auch einfacher, die Prozesse eines Benutzers anzuzeigen? Falls ja, wie? Ist das Kommando top auch geeignet, die Prozesse eines Benutzers anzuzeugen? Falls ja, wie?

  8. Prozesse durch eine Pipe zu verbinden, geht nur, wenn beide Prozesse den gleichen Elternprozess besitzen. Um zwei Prozesse kommunizieren zu lassen, die unterschiedliche Eltern haben, braucht man eine "named Pipe". Erzeugen Sie eine solche Pipe (Kommando mknod) und lassen Sie über diese Pipe zwei verschiedene Shell-Fenster miteinander kommunizieren - beispielsweise durch ls auf der einen und cat auf der anderen Seite. Funktioniert das auch von Benutzer zu Benutzer (ggf. ausprobieren)?

  9. Legen Sie nun zwei "Named Pipes" namens "foo" und "bar" im Verzeichnis "demo" an (mknod ... p). Versuchen Sie nun, zwischen beiden Shell-Fenstern einen Dialog herzustellen, indem im einen Fenster nach "foo" geschrieben und aus "bar" gelesen wird und beim anderen Fenster umgekehrt nach "bar" geschrieben und aus "foo" gelesen wird. Damit das klappt, muss eine der beiden Aktionen in jedem Fenster durch ein angehängtes "&" in den Hintergrund verbannt werden. Überlegen Sie, welche Aktion das sein könnte - unter Berücksichtigung der Tatsache, dass Ausgaben von Hintergrundprozessen weiterhin auf dem Bildschirm landen. (Hinweis: Auf beiden Seiten der Pipe wird mit nur dem Kommando cat sowie Ein- bzw. Ausgabeumleitung gearbeitet.)

  10. 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!

  11. Informieren Sie sich über das Kommando stat und versuchen Sie mit Hilfe dieses Kommandos möglichst viele Informationen über bestimmte Dateien und Verzeichnisse herauszufinden.

  12. Listen Sie alle aktiven Benutzer am System so auf, daß sie alphabetisch sortiert sind.

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 Den Start als Hintergrundprozeß nicht vergessen.

  4. Schreiben Sie ein Shellskript, dem ein Dateiname als Parameter übergeben wird und das für die Datei die Anzahl der Zeilen, Worte und Zeichen ausgibt (siehe wc-Kommando).

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 ('lc1', 'lc2' oder 'lc3'). 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 - sofern vorhanden - die Konfigurationsdatei des Internet-Superdaemons 'inetd', um festzustellen, welche Netzwerkdienst sonst noch angeboten werden.

    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:
      • einmal täglich ausführen (Uhrzeit beliebig)
      • einmal wöchentlich ausführen (Tag und Uhrzeit beliebig)
      • einmal monatlich ausführen (am 1. des Monats, Uhrzeit beliebig)
      • einmal jährlich ausführen (am 1.1. des Jahres, Uhrzeit beliebig)

    4. Bevor Sie sich ausloggen, deaktivieren Sie Ihren crontab-Eintrag, indem Sie ein Kommentarzeichen (#) vor die Zeile(n) setzen!

    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:
      • hostname
      • uname
      • uptime
      • ifconfig
      • route
      • netstat
      • lsof
      • nmap

    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. Schreiben Sie ein Shellskript, dem ein oder mehrere Dateinamen als Parameter übergeben werden und das für jede Datei die Anzahl der Zeilen, Worte und Zeichen ausgibt (siehe Aufgabe weiter oben). Jedoch soll dies nur für Text-Dateien geschehen. Dazu prüfen Sie für jede Datei, ob die Ausgabe des file-Kommandos den String "text" enthält.

    3. 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. Sie können wahlweise sed oder tr verwenden.

    4. 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:
      • zwischen 0 und 10 Uhr: "Guten Morgen"
      • zwischen 10 und 17 Uhr: "Guten Tag"
      • zwischen 17 und 24 Uhr: "Guten Abend"
      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.

    5. 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
      ...
      

    6. 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 © Hochschule München, FK 04, Prof. Jürgen Plate
    Letzte Aktualisierung: 20. Nov 2008