Die Linux BASH Was ist denn eine Shell? Als Shell (deutsch: Schale ) wird in Betriebssystemen der Teil des Kerns bezeichnet, welcher die Schnittstelle zwischen Benutzeroberfläche und Maschinencode bildet. In eine Shell kann der Benutzer Befehle in spezieller Textform eingeben, die dann direkt in Laufzeit in den für Prozessoren verständlichen Maschinencode übersetzt werden. Unter Linux spielt die Shell-Funktionalität eine große Rolle bei der Systemverwaltung, eine große Auswahl verschiedener Shell-Konzepte steht bereit um das Arbeiten an systemkritischen Einstellungen zu erleichtern. Dabei bildet Shell auch eine wertvolle Skriptsprache für einfache Programme und Automatisierung häufig genutzter Arbeitsvorgänge. Eine Shell wird unter UNIX (also auch Linux) über so genannte Terminals (auch Konsole genannt) angesprochen. Die Terminals sind also die direkten Benutzeroberflächen zur Shell. Früher wurden mehrere Terminals auf einer Maschine ausgeführt, die dann beispielsweise durch verschiedene Geräte, die über die serielle Schnittstelle des Computers verbunden waren, angesteuert werden konnten. Auf neueren Linux-Versionen wird nur noch ein (Master-)Terminal ausgeführt. Alle weiteren Instanzen die im Betriebssystem geöffnet werden, entstehen als sog. Pseudoterminals 'pts'). Das bedeutet, dass die Ausgaben aller im System aktiven Terminals in das eine Masterterminal umgeleitet werden (durch die Pipeline-Funktionalität unter UNIX). Man unterscheidet prinzipiell zwei Arten von Terminals. Auf der einen Seite die TTY's (ausgeschrieben Teletypewriter, zu deutsch Fernschreiber) und dann noch die grafischen emulierten Terminals. TTY's werden manchmal auch als Alpha-Konsole bezeichnet. Sie finden sich im System auf niedrigster grafischer Ebene, der Textebene. Deshalb sind solche Terminals unter allen Initialisierungsstufen (Runleveln) ansprechbar. Im laufenden System kann man durch Betätigen der [Strg]-Taste und einer F(unktions)-Taste durch die einzelnen TTY's schalten. Schließlich gibt es noch emulierte Terminals. Das sind TTY-Terminals die zur grafischen Oberfläche, dem X-Server, durchgeschliffen werden. Die Sitzung wird dabei in ein vomx-server bereitgestelltes Fenster transportiert. Das hat den Vorteil, dass sich Parameter wie Farben, Darstellung und Fenstergröße ändern kann. Auch viele grafischen Anwendungen arbeiten im Hintergrund mit Terminal-Befehlen. Bekannte Linux-Shells: /bin/... osh Thompson-Shell, Urpsrungsshell tcsh TENEX-C-Shell, verbesserte csh sh Bourne-Shell, Weiterentwicklung der osh bash Bourne-Again-Shell, neu aufgelegte Bourne-Shell, aktueller Standard unter den meisten Linux-Systemen ash zsh Almquist-Shell, schnelle und schlanke Shell, POSIX-konform Z-Shell, vereinigt Vorteile und Verbesserungen der bash, csh und tcsh dash Debian-Pendant zur ash, Bourne-konform ksh Korn-Shell, vereinigt Funktionalität aus Bourne- und C- Shell csh C-Shell, Shell mir an C angelegter Syntax jsh Job-Control-Shell, Bourne-Shell mit Job-Controlling- Funktionen sash nash stand-alone-shell, Shell die möglichst ohne viele externe Programme auskommen soll not-a-shell, Befehlsinterpreter für Kernel- Images unter RedHat fish esh friendly interactive Shell, zeichnet sich durch besondere Benutzerfreundlichkeit aus easy-shell, orientiert sich an Programmiersprache LISP
Die Grundlagen Aufbau eines POSIX-Kommandos Befehl [-Parameter --ausführliche Parameter] Eingabedaten Ausgabedatei Beispiel: cp -r /media/daten/testordner /media/hdd2 dieser Befehl (cp POSIX-Befehl zum kopieren von Daten) kopiert die Daten im Ordner testordner von /media/daten nach /media/hdd2. Der Parameter -r gibt an, dass auch Unterordner mit kopiert werden und somit die originale Ordnerhierarchie beibehalten wird (-r recursive = rekursiv). ausführliche Parameter: Statt einen Paramter im kurzen (Buchstaben-)Format anzugeben, können diese auch durch die vorangestellte Zeichenfolge ' ' in ausgeschriebener Form eingegeben werden. Beispiel: cp -r /media/daten/testordner /media/hdd2 cp --recursive /media/daten/testordner /media/hdd2 Die beiden Befehle haben gleiche Funktionalität. Die meisten Parameter lassen sich auch zusammenfassen. Damit gemeint ist die Kombination aus mehreren Parametersegmenten (z.b. -r und -f) zu einem Term (in diesem Falle '-r -f' = '-rf' ). häufige Standardparameter (mit den meisten Befehlen kombinierbar) Parameter ausführliche Schreibweise Bedeutung -f --force erzwinge die Ausführung des Befehls ohne Rückfragen -r --recursive führe Befehl rekursiv aus (unter Einbeziehung aller Unterverzeichnisse und Dateien -h --help gibt Hilfe zur Verwendung des Befehls aus -l --list Ausgabe in Listenform -v --verbose zeige bei der Ausgabe mehr Informationen an (Debugging) Verkettung von Befehlen mit Pipelines Befehle können miteinander kombiniert werden, wenn dem System gesagt wird, es soll diese mit einer Pipeline verbinden. Linux unterstützt Pipelines. Dabei wird jeweils die Ausgabe des ersten Befehls in die Eingaberoutine des nachfolgenden Befehls übergeben, dies geschieht zeilenweise. Beispiel: cat example.txt awk '{print $2}' --- = Pipelinesymbol [Alt Gr] + [><] Dieses Kommando liest die Datei example.txt ein und gibt den Datenstrom an das awk-kommando weiter, welches die Zeichenkette dann bearbeitet (in diesem Fall: gebe das 2. Segment jeder Zeile aus [print $2]).
Navigation In der Shell befindet man sich immer an einem Ort, in den meisten Fällen also in einem Verzeichnis. Der Pfad zu jeweiligen Ort wird durch Aneinanderkettung der einzelnen Verzeichnisse beschrieben (wie bei Windows). In UNIX-Systemen werden die einzelnen Abschnitte durch einen Slash ('/') getrennt. Eine Besonderheit stellt das sog. Rootverzeichnis dar (das Wurzelverzeichnis). Dieses ist das höchste Verzeichnis einer Struktur und wird durch einen, den ersten Slash ('/') repräsentiert. In einem Linux-System gibt es nur ein einziges Rootverzeichnis, jene anderer Datenträger werden an spezielle untergeordnete Pfade eingehangen. Pfadangabe absolut Die einfachste Pfadangabe ist die absolute, welche auf einen kompletten Pfad (ab dem Rootverzeichnis) verweist. Beispiel: /home/markus/privat Pfadangabe relativ Pfade können auch relativ angegeben werden, indem das erste Slash (für Root) weggelassen wird und der Pfad ab der aktuellen Position eingegeben wird. Beispiel: share/lib/test.txt /usr/share/lib wenn man sich bereits im VZ usr befindet aktuelles Verzeichnis Mit dem Terminalbefehl pwd (für print working directory) wird das aktuell aktive Verzeichnis angegeben. Verzeichnis wechseln Mit dem Befehl cd (change directory) wird das aktuell aktive Verzeichnis geändert und in ein anderes gewechselt. Dabei wird das neue Verzeichnis einfach nach cd eingegeben (z.b. cd /home wechselt nach /home) Verzeichnisinhalt anzeigen Mit dem Befehl ls (list) sich Strukturen innerhalb eines Verzeichnisses auslesen, diese werden dann tabellarisch aufgeführt. Möchte man eine detaillierte Liste mit weiterführenden Informationen ausgeben lassen, so setzt man nach ls noch ein -l (für Liste). Es wird jeweils der Inhalt des aktuell aktiven Verzeichnisses angezeigt, man kann natürlich auch den jedes anderen VZ's anzeigen lassen, indem man nach ls (-l) noch eine Pfadangabe anhängt. Die Listenform: Die Inhalte bedeuten jeweils von links nach rechts: UNIX-Rechte für die Datei/das Verzeichnis (Ausführungsbyte Besitzer [rwx] Gruppe [rwx] Andere [rwx] Ausführungsbyte: d Eintrag ist ein Verzeichnis x Eintrag ist ausführbare Datei Anzahl der Hardlinks, die auf den Eintrag verweisen Name des Besitzers Name der zugeordneten Gruppe Dateigröße (ohne Präfix in Bytes) letztes Änderungsdatum Dateiname Der rot hervorgehobene (und eigentlich auch blinkende) Eintrag ist ein sog. Link. Links sind Verweise auf Dateien in anderen Strukturen (Pfadverweise). Gekennzeichnet ist ein Link in der Listenform durch seinen Namen, dem Pfeil und den darauf folgenden Pfad zum Ort, auf den verwiesen wird. Wenn ein Link wie hier rot hinterlegt ist bzw. blinkt, so bedeutet dies, dass das Ziel des Links nicht erreichbar ist.
Weiterführende Kommandos remove Dateien löschen Dateien können ganz einfach gelöscht werden in dem der Befehl rm zum Einsatz kommt. Der Parameter -r muss angegeben werden, wenn ein Verzeichnis gelöscht werden soll. Anwendung: rm myfile rm -r /opt/test rm -f pagefile ospace.h dev.c make directory Verzeichnis anlegen mkdir /home/user/dokumente # löscht die Datei myfile # löscht das Verzeichnis test unter /opt und dessen Inhalt # löscht die drei Dateien ohne Rückfrage # legt einen neuen Ordner Dokumente unter /home/user an move Dateien verschieben/umbenennen Der Befehl kann entweder zum Verschieben von Dateien, zum Umbenennen, oder beidem gleichzeitig verwendet werden. Eine Umbennenung erfolgt, wenn sich der Name des Objektes bei der zweiten Pfadangabe ändert bzw. das Verzeichnis nicht schon existiert. mv /opt/firefox /lib mv /opt/firefox /lib/fox mv firefox fox...genau so funktioniert es auch mit Dateien # verschiebt das Verzeichnis firefox nach /lib # verschiebt das Verzeichnis firefox nach /lib und benennt es in fox um # benennt das Verzeichnis firefox in fox um link Verweise zu Dateien erstellen Ein Link ist ein Pfadverweis, also eine Notiz, dass eine auf den Link zugreifende Instanz in Wirklichkeit auf einem anderen Pfad suchen soll. Damit kann man sich Abkürzungen schaffen, z.b. wenn man oft in einen Pfad in einem Netzwerkdateisystem wechselt, lohnt es sich einen Link dahin auf seinen Desktop zu projizieren. Es gibt 2 Typen von Links, zwischen denen unterschieden wird: Hardlinks: harte Verknüpfungen in einem Dateisystem, könne nur innerhalb eines Dateisystems eingesetzt werden, sind einfache, dateisysteminterne Verzeichniseinträge Softlinks (-s): symbolische Verknüpfungen, die auf Softwareebene (als Datei) existieren und auf verschiedenste Dateisysteme und Gerätedateien verweisen können wird kein Verknüpfungsame angegeben, erhält der Link den Namen des Originalelements Syntax: ln -s Ziel Verknüpfungsname # '-s' erstellt einen Softlink (symbolische Verknüpfungen) Beispiele: ln -s /afs/tu-chemnitz.de/home/urz/k/klmark mein_homeverzeichnis legt einen Link mit Namen mein_homverzeichnis, welcher in den jew. Pfad im AFS verweist ln -s /usr/share/mozilla/firefox/plugins/libflashplayer.so wenn man sich im Plugin-Verzeichnis von Firefox befindet, kann man so einen Link auf den FlashPlayer, der auf einem anderen Ort installiert ist errichten, der dann benutzbar ist ohne dass er erneut kopiert werden muss. --- Jetzt ist erst einmal ein wenig Eingewöhnung gefragt! --- Dabei hilft die Befehlsliste
Benutzerverwaltung unter Linux (Debian) Einen Benutzer zum System hinzufügen Für den Einsatz dieses Kommandos werden Root-Rechte benötigt! adduser Benutzername [Optionen] Beispiel: adduser franz # fügt dem System den Benutzer Franz hinzu Weiter Optionen beim Erstellen neuer Benutzer Parameter --conf Konfigurationsdatei --home Pfad --no-create-home --ingroup Gruppe --disabled-login --shell Wirkung zum Erstellen des neuen Benutzers eine Konfigurationsdatei benutzen das HOME-Verzeichnis (Persönliches Verzeichnis) des neuen Benutzers abweichend vom Pfad /home festlegen kein HOME-Verzeichnis anlegen Den Benutzer der Gruppe Gruppe zuordnen, anstatt eine neue Gruppe für den Benutzer zu erstellen Der Benutzer soll sich nicht am System anmelden können (für Systemkonten) Eine andere Shell als der Standard (BASH) voraus gibt für den Benutzer bestimmen Einen Benutzer aus dem System löschen Für den Einsatz dieses Kommandos werden Root-Rechte benötigt! deluser Benutzername deluser remove-home Benutzername # entfernt nur den Benutzer # löscht den Benutzer und entfernt sein HOME- Verzeichnis Gruppen erstellen und Benutzer weiteren Gruppen zuordnen Für den Einsatz dieses Kommandos werden Root-Rechte benötigt! addgroup Gruppenname # fügt dem System die Gruppe Gruppenname hinzu usermod -ag Gruppenname Benutzername # fügt den Benutzer Benutzername zur Gruppe Gruppenname hinzu deluser Benutzername Gruppenname # trägt den Benutzer Benutzername aus der Gruppe Gruppenname aus! wenn keine Gruppe angegeben wird löscht der Befehl das Benutzerkonto!
Ausführung von Befehlen mit anderen Rechten Um Systemdateien manipulieren zu können, bzw. um mit Daten anderer Nutzer zu arbeiten muss man unter Umständen eine andere Identität vorgeben, bzw. Administratorrechte erwerben, dafür gibt es mehrere Möglichkeiten: Ausführung eines Befehls in der Konsole mit Administratorrechten sudo Befehl der nachfolgende Befehl wird mit Rootrechten ausgeführt, der ausführende Benutzer muss sich dazu mit seinem Passwort authentifizieren. Sudo funktioniert nur für Benutzer, die Mitglied der Gruppe admin sind oder im sudoers file stehen. Ausführen unter anderem Benutzerkontext su Benutzer su - meldet im aktuellen Terminal einen anderen Benutzer an, nachfolgende Eingaben werden in seinem Kontext ausgeführt bis diese Sitzung mit 'exit' beendet wird meldet im aktuellen Terminal den Benutzer root an, alle nachfolgenden Eingaben werden mit totalen Adminrechten ausgeführt Fakeroot-Shell sudo -s erzeugt eine Fakerootshell, dabei wird der Benutzer root angemeldet und alle nachfolgenden Eingaben mit Adminrechten ausgeführt, dabei werden aber keine Berechtigungen von Dateien überschrieben, neue Dateien gehen in den Besitz des aktuell angemeldeten Benutzers, statt root (Vorteil bei einigen Anwendungen die auf Config- Dateien u.u. später nicht mehr zugreifen dürfen) Ausführung grafischer Anwendungen mit Administratorrechten gksu Anwendung kdesu.distrib Anwendung unter GNOME: die Anwendung wird grafisch mit Rootrechten ausgeführt, bietet aber die Vorteile einer Fakerootshell, nach Bestätigung des Befehls öffnet sich ein Fenster für die Passworteingabe unter KDE: Funktionalität von gksu Änderung von UNIX-Rechten CHOWN change owner Dieser Befehl ändert den Besitzer (zugewiesener Benutzer) einer Datei. Syntax: chown Benutzer Datei1 Datei2... Benutzer = Name / UID des neuen Eigentümers CHGRP change group Dieser Befehl ändert die einer Datei zugewiesene Gruppe. Syntax: chgrp Gruppe Datei1 Datei2 Gruppe = Name / GID der neuen Gruppe
CHMOD change mode Syntax: chmod Festlegungen(Modi) Datei(en) Um Zugriffsrechte unter Linux/UNIX zu vergeben, existiert ein leistungsfähiges Rechteverwaltungssystem. Mit dem Befehl chmod lässt sich das existierende Rechtesystem (Modus) einer Datei verändern, man kann beispielsweise eine Dateien, die nur root lesen kann für alle Nutzer freigeben. Benutzerspezifikationen u der Datei zugewiesener Benutzer (user) r Leserechte (read) g der Datei zugewiesene Gruppe (group) w Schreibrechte (write) Rechte o andere Benutzer (others) x Ausführungsrechte (execute) a alle Gruppen (all) s SUID-Bit setzen (Ausführung der Datei für alle mit Rechten des Eigentümers) Beispiele: chmod u+x Test.txt chmod o-r olol chmod g=rw meinedatei.tar erweitere die Rechte für den Besitzer (zugewiesener Benutzer) der Datei Test.txt um Ausführungsrechte entziehe allen Nutzern, außer dem Besitzer (zugewiesener Benutzer) die Leserechte an der Datei olol setzt die Rechte für die der Datei zugewiesenen Gruppe auf Lesen/Schreiben Rechte lassen sich aber auch mit Hilfe von Zahlen (oktal) setzen: Oktal-Rechte 4 Leserechte 2 Schreibrechte 1 Ausführungsrechte Dieses System ist etwas komplizierter zu erklären. Die Rechte werden ohne Trennzeichen nacheinander jeweils für den Besitzer (zugewiesener Benutzer), Gruppe (zugewiesene Gruppe) und andere Nutzer gesetzt. Dabei steht jeweils eine Zahl für die gesetzten Rechte, diese erlangt man durch aufaddieren der gewünschten Rechte. Beispiele: chmod 644 Datei chmod 764 filefox.sh setzt die Rechte der Datei Datei folgendermaßen: der Besitzer darf lesen und schreiben ( 4 [Leserechte] + 2 [Schreibrechte] = 6) die Gruppe darf nur lesen ( 4 [Leserechte]) alle anderen dürfen auch nur lesen (4 [Leserechte]) Besitzer & Gruppe & Andere = 644 Der Besitzer des Skriptes filefox.sh darf es ausführen, sowie lesend und schreibend darauf zugreifen. Die Gruppe darf nur lesen und schreiben, nichts ausführen. Alle anderen dürfen die Datei nur lesen.