Dr. Linux

Aus LinuxUser 03/2002

Dr. Linux

Test-Fälle

Was sich hinter einem Befehl versteckt oder wer gerade eingeloggt ist; das alles lässt sich mit wenigen Eingaben auf der Tastatur herausfinden.

Dr. Linux

Komplizierte Organismen, wie Linux-Systeme es nun einmal sind, haben so ihre ganz eigenen Wehwehchen. Dr. Linux beobachtet die Patienten in den Linux-Newsgruppen, stellt an dieser Stelle Rezepte für aktuelle Probleme aus und alternative Heilmethoden vor.

Stoppt root!

Ich unterbreche Programme, die ich auf einer Shell aufrufe, gern mit der Tastenkombination [Strg-z], um zwischenzeitlich weitere Befehle abzusetzen. Leider funktioniert das nicht, wenn ich mittels su als root Dateien editiere/konfiguriere. Gibt es einen anderen Befehl, um die von su erzeugte root-Shell temporär zu deaktivieren und sie später wieder hervorzuholen?

Dr. Linux: Ja, und zwar das Kommando suspend, das in der Bash (oder csh/tcsh) eingegeben wird. suspend ist ein sogenanntes Shell-Builtin [1], also ein Kommando, das zum Leistungsumfang der jeweiligen Shell gehört. Es unterbricht die Superuser-Anmeldung mit su in der gleichen Weise, wie es die Tastenkombination [Strg-z] mit “normalen” Programmen/Prozessen tut, d. h., die root-Shell wird schlafengelegt, und Sie bekommen stattdessen Ihre “Ausgangsshell” zurück, auf der Sie ganz normal neue Befehle absetzen können. Zuvor sehen Sie noch die Ausgabe Stopped mit dem Zusatz, welches Kommando gerade gestoppt wurde:

perle@maxi:~> su
Password: Root-Passwort
maxi:/home/perle # suspend
[1]+  Stopped                 su
perle@maxi:~> [Eingabe als User perle zu verrichtener Aufgaben]

Um zur root-Shell zurückzukehren, geben Sie das Kommando fg (englisch: “foreground”, Vordergrund) ein. Jene verlassen Sie wie gewohnt mit dem Kommando exit:

perle@maxi:~> fg
su
maxi:/home/perle # [weitere, als root auszuführende Befehle]
maxi:/home/perle #exit
exit
perle@maxi:~>

Wissen, was man tut

Ich starte Programme auf einer Konsole, indem ich deren Namen eintippe. Im Grunde ist mir aber häufig nicht klar, ob es sich um ein echtes, kompiliertes Programm oder zum Beispiel um ein Shell-Skript handelt. Ich möchte mein System besser kennenlernen und daher wissen, welche Art von Befehl ich gerade absetze. Wie geht’s?

Dr. Linux: Mit der Shell-Funktion type plus Kommandoname lassen Sie sich anzeigen, welchen Ursprung Ihr gewähltes Programm hat:

perle@maxi:~> type suspend
suspend is a shell builtin

suspend ist also ein eingebauter Befehl der Shell, während …

perle@maxi:~> type dir
dir is aliased to `ls -l'

es sich bei dir um einen Alias für den Befehl ls -l handelt.

perle@maxi:~> type gimp
gimp is /usr/bin/gimp

Dreht es sich stattdessen wie bei gimp um eine echte Datei (oder einen Link) im Filesystem, können Sie mit dem Kommando file weiter forschen. Genauso einfach wie type anzuwenden, identifiziert es (Ihnen unbekannte) Datei-Typen. Damit finden wir zum Beispiel heraus, dass es sich bei /usr/bin/gimp um ein echtes Binärprogramm handelt, während das Kommando groups ein ausführbares Shell-Skript ist:

perle@maxi:~> file /usr/bin/gimp
/usr/bin/gimp: ELF 32-bit LSB executable, Intel 80386, version 1,
 dynamically linked (uses shared libs), not stripped
perle@maxi:~> file /usr/bin/groups
/usr/bin/groups: Bourne shell script text

Wenn file nicht erkennen kann, um was für eine Datei es sich handelt (bzw. wenn die Datei nicht angezeigt werden darf), erhalten Sie in der Ausgabe das Schlüsselwort data. Eine besondere Information liefert type mit der Ausgabe

Kommando is hashed (Pfad/zum/Kommando)

Sie bedeutet, dass das entsprechende Kommando in der aktuellen Sitzung bereits ausgeführt und deshalb von der bash in der Hash-Tabelle gespeichert wurde:

perle@maxi:~> type gimp
gimp is hashed (/usr/bin/gimp)

Durchgetestet

Obwohl ich mit meinem Linux-System schon etwas Erfahrung habe, kommt es vor, dass ich eine Datei in einem Editor bearbeite, aber beim Abspeichern meiner Arbeit erfahre, dass ich für diese gar kein Schreibrecht habe. Gibt es nicht einen netten kleinen Befehl, mit dem ich Rechte vorher abfragen kann, ohne die von ls -l erzeugten langen Verzeichnis-Listen zu durchsuchen?

Dr. Linux: Der Befehl, mit dem Sie schnell und gezielt Informationen über eine Datei oder ein Verzeichnis bekommen, heißt schlicht test und ist ein Shell-Builtin. Aufgerufen wird er wie folgt:

test -option Datei-_oder_Verzeichnisname

So prüfen Sie mit folgendem Beispiel, ob Sie mit Ihrer aktuellen Identität Schreibrechte (-w steht für “write”) für die Datei /etc/fstab besitzen:

perle@maxi:~> test -w /etc/fstab

Wer sich jetzt ratlos fragt, wo test das Testergebnis anzeigt, wird von der Antwort vermutlich enttäuscht sein: Gar nicht. Dieses Builtin ist nämlich eigentlich dafür gedacht, in Shell-Skripten Bedingungen nach dem Schema “Wenn die Schreibrechte auf /etc/fstab stimmen, dann führe folgendes aus” formulieren zu können, und dafür braucht man keine verbalen Ausgaben auf der Standard-Ausgabe. Stattdessen ist der Rückgabewert des Kommandos interessant.

Dieser ist für den jeweils letzten Befehl in der Variablen? gespeichert. Enthält sie den Wert 0, dann war der Test erfolgreich; es besteht also die Möglichkeit, den Inhalt der Datei zu ändern. Schreibt jedoch der Befehl echo $?, mit dem man den Inhalt ($) der Variablen ? auf der Kommandozeile ausgibt, einen Wert ungleich 0 auf den Bildschirm, so war der Test nicht erfolgreich; ergo besteht kein Schreibrecht für die entsprechende Datei. Weil sich das viel komplizierter anhört, als es ist, sehen Sie hier einmal beide Schritte auf der Kommandozeile:

perle@maxi:~> test -w /etc/fstab
perle@maxi:~> echo $?
1

Die Ausgabe 1 ist ganz sicher ungleich 0; das heißt, die fragende Benutzerin besitzt kein Schreibrecht für die Datei mit der “Filesystem-Tabelle”.

Weitere nützliche Optionen von test sind * -d: Handelt es sich bei der Argumentdatei um ein Verzeichnis (englisch: “directory”)? * -e: Existiert die Datei überhaupt? * -r: Darf ich sie lesen (“read”)?

Abfragen mit test werden übrigens immer in folgender Reihenfolge bearbeitet: Sind Sie Besitzer der Datei, überprüft test die Rechte des Datei-Eigentümers. Für Nicht-Besitzer wertet das Builtin hingegen zunächst die Gruppen-Rechte aus, des weiteren die Rechte für den sogenannten “Rest der Welt”. Wenn Sie mehr über test erfahren möchten, rufen Sie die entsprechende Dokumentation mit man test und/oder info test auf.

Wer ist hier?

In welcher Datei finde ich Informationen, wer sich eingeloggt hat?

Dr. Linux: Grundsätzlich werden auf jedem Linux-System Daten über den Systemstart sowie das Login-Verhalten der Anwender gesammelt und in verschiedenen Datenbanken und Log-Dateien festgehalten. Daher gibt es keine generelle Antwort auf diese Frage. Zwei einfach zu nutzende Befehle sind last und lastlog.

Ihre Informationen besorgen sie sich aus der Datei /var/log/wtmp, die Angaben über erfolgreiche Logins und Logouts von Systembenutzern speichert. Wenn Sie jedoch versuchen, diese Datei mittels eines Editors zu betrachten, werden Sie nur verwirrende Zeichen erhalten (Abbildung 1).

Abbildung 1: /var/log/wtmp in einem Editor

Abbildung 1: /var/log/wtmp in einem Editor

Um der Datei ihre Informationen zu entlocken, geben Sie auf einer Kommandozeile den Befehl last ein. Sie bekommen eine mehrspaltige Tabelle, die relativ einfach zu verstehen ist (Listing 1). In der ersten Spalte steht der Anwendername (“Wer ist eingeloggt?”). Angaben zum benutzten Terminal (tty, “terminal type”), bei einem Remote-Login zum benutzten Host (“Woher eingeloggt?”), das Datum und die Uhrzeit (“Seit wann eingeloggt?”) und schließlich die Gesamtdauer der Login-Session folgen. Am unteren Ende der Tabelle finden Sie noch die Information, seit wann Logins in dieser Datei mitprotokolliert werden: In der Regel packt und archiviert das System /var/log/wtmp von Zeit zu Zeit, damit das File nicht zu groß wird.

Listing 1

Beispielausgaben von

last

perle@maxi:~> last
news     tty3                          Mon Jan  7 19:04 - 19:04  (00:00)
web      tty2                          Mon Jan  7 19:04   still logged in
perle    tty5                          Mon Jan  7 18:33 - 18:35  (00:02)
perle    tty1                          Mon Jan  7 11:07   still logged in
trish    pts/7        chekov.linux-mag Mon Jan  7 11:06   still logged in
reboot   system boot  2.4.10-4GB       Mon Jan  7 11:03          (08:00)[…]
wtmp begins Wed Jan  2 01:23:54 2002

Listing 2

… und

lastlog

perle@maxi:~> lastlog
Username         Port     From             Latest
root             tty1                      Son Dez 16 22:06:26 +0100 2001[…]
lp                                          Never logged in 
games                                       Never logged in 
irc                                         Never logged in 
ftp                                         Never logged in 
firewall                                    Never logged in 
postfix                                     Never logged in 
web              tty2                      Mon Jan  7 19:04:04 +0100 2002
perle            tty5                      Mon Jan  7 18:33:15 +0100 2002
man                                         Never logged in […]
cz               tty4                      Mon Dez  3 03:13:35 +0100 2001

Ähnlich einfach und übersichtlich gibt sich die Ausgabe von lastlog. Hier werden alle Anwender, die das System angelegt hat, in die Ausgabe mit einbezogen. Unter Sicherheitsaspekten vom System generierte Spezial-User haben meist kein Home-Verzeichnis und dürfen sich gar nicht direkt einloggen. Das ist zum Beispiel beim Benutzer games der Fall. Weil er noch nie als Nutzer auf dem System angemeldet war, steht in der Spalte “Letzte Anmeldung” (Latest) der lapidare Kommentar **Never logged in**, “noch nie eingeloggt”.

Glossar

Shell

Das “Mittlerprogramm”, das Ihre Kommandos entgegennimmt, bearbeitet und schließlich an den Kernel zur Ausführung weiterleitet. Unter Unix-Betriebssystemen haben Sie die Wahl zwischen diversen Shells unterschiedlicher Funktionalität und Bedienphilosophie. Als Standard-Shell wird auf Linux-Systemen in der Regel die bash (“born again shell”) benutzt, aber auch weitere Shells wie z. B. die csh (“C-Shell”) und/oder die tcsh (eine erweiterte C-Shell mit der Möglichkeit, die Befehlszeile zu editieren) sind meist installiert.

su

Dieses Kommando ermöglicht das Wechseln zu einer anderen Anwenderkennung auf der Kommandozeile. Dabei wird eine neue Shell mit der Benutzeridentifikation des als Argument angegebenen Anwenders erzeugt. Fehlt letztere, erlaubt es su, kurzfristig als Superuser root zu arbeiten. Vorausgesetzt, Sie sind nicht bereits als root eingeloggt, benötigen Sie das Passwort für den gewählten User. Die neue Identität legen Sie durch Eingabe des Kommandos exit auf der Befehlszeile wieder ab.

Alias

Ein neuer Name bzw. ein Kürzel für einen selbstdefinierten Befehl (vgl. auch [1]). Welche Alias-Befehle in Ihrem System “vordefiniert” sind, erfahren Sie, wenn Sie das Kommando alias ohne weitere Angaben in der Bash eingeben.

Hash-Tabelle

Wird ein Kommando in einer Bash abgesetzt, dann “merkt” sich die Shell diesen Befehl in Form der Pfad-Angabe und speichert ihn in der sogenannten Hash-Tabelle. Rufen Sie dasselbe Programm erneut auf, liest die Bash die Pfad-Angabe aus der Hash-Tabelle, statt erst den gesamten Suchpfad nach der entsprechenden ausführbaren Datei zu durchforsten. Dadurch beschleunigt sich die Ausführung des Kommandos.

Variablen

Viele Funktionen der bash (und damit auch des Gesamt-Systems) werden durch Variablen gesteuert. Benutzerdefinierte und Systemvariablen sind jederzeit für die aktuelle Shell veränderbar. Auf die sogenannten “speziellen Variablen” kann der Benutzer hingegen nur lesend zugreifen. Welche Variablen im System gesetzt sind, bringt Ihnen (neben weiteren Informationen etwa zu Shell-Funktionen [1]) der Befehl set auf den Ausgabebildschirm.

Remote-Login

Fernanmeldung auf einem Rechner (Host) im Netz.

Infos

[1] Patricia Jung: “Kommandozeilen-Jongleur”, LU 02/2002. Kasten 1 auf Seite 82 gibt nähere Informationen zu Shell-Builtins und Aliasen.

LinuxUser 03/2002 KAUFEN
EINZELNE AUSGABE
ABONNEMENTS
TABLET & SMARTPHONE APPS
E-Mail Benachrichtigung
Benachrichtige mich zu:

Hinweis: Dieser Artikel ist älter als ein Jahr, enthaltene Informationen sind möglicherweise veraltet.

0 Kommentare
Älteste
Neuste Beste Bewertung
Inline Feedbacks
Alle Kommentare anzeigen
Nach oben