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: *
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 |
- 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).
- 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
- 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.
- 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.
Loginname:password:uid:gid:kommentar:homeverzeichnis:Login- Programm
Bemerkungen:
gruppenname:gpassword:gid:userlist
Bemerkungen:
b) unter X- Windows
group ( g ) Gruppe, der die Datei gehört
other ( o ) other (Rest der Welt)
user group other
rw-r--r-- user darf lesen und schreiben, group und other hat nur leserecht
Stelle user group other
lesen schreiben ausführen
7 5 5 111 101 101 == rwxr-xr-x
Was passiert alles??
Nein ==> Prüfung, hat irgend eine Gruppe, zu der der User noch gehöhrt, x Recht Ja ==> ok
Im nächsten Schritt wird ggf das x recht für other überprüft.
Besitzers von mycmd.
chown karl ../myfile1 ../../myfile2 //ok
chown berta /home/pauline/sources/c/helloworld.c //ok
chown -R berta /home/pauline // ok
Hinweise:
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.
chmod 755 verz1 // usr darf alles, group & other dürfen
lesen und ausführen
chmod 6755 myprog // suid gesetzt, sonst wie oben
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
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
(== dir unter DOS)
Aufgabe: erzeugen sie als Popeluser eine neue Datei
ermitteln sie die Rechte an der Datei
-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)
Setzen/löschen vom sticky-BIT: chmod -/+t Katalog
Optionen
-r rekursiv: kompletter Verzeichnisbaum wird kopiert
$ cp /bin/rm /tmp/ls
# cd /tmp
# ls * // würde jetzt alles löschen
mv file1 file2 // entspricht umbenen
mv file1 katalog... // verschieben
Hinweise:
inode2 name2
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 |
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.
==> hard links sind nur möglich innerhalb der Grenzen eines Dateisystems
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
cat [datei...]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
# 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);
}
Zählt die Anzahl der Zeichen, Wörter und Zeilen im EingabestromOptionen -c Zeichen
-l Zeile
-w Wort
Bsp.: Wie viele »user« haben einen account auf Ihrem System
rm /tmp/pwfile
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
telnet hostuser: sw [RETURN]
passwort: sw [RETURN]
in der Spalte FROM
zum zweiten: Meldung
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
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)
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.
. 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
\
() 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
- Überschreiben
Editiermodus ==> Kommando ESC
Kommando ==> ex- Modus :
ex- Modus ==> Kommando ESC ( oder Kommando absetzen)
Editiermodus ==> ex- Modus ESC:
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
* eine beliebige, auch leere Zeichenfolge
[!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
> Umlenkung von stdout in eine Datei.2> Umlenkung von stderr in eine Datei (Fehlerkanal)
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
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`
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`
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:
Bsp.: ls -xyz 2> /dev/null =>blödsinn
echo $? /* !0 */
ls -l > /dev/nul
echo $? /* 0 */
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
==> inerhalb von single quotes verlieren alle Metazeichen ihreSonderbedeutung
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
==> 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
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 &
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 {} \; &
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
f) Quelltexte (Verweise auf emails oder Websites)
g) Installationssupport von SUSE (sehr gut -- registrieren lassen!!)
h) /usr/doc/packages
Hinweis:
gzip/ gunzip
1 Multiuser ohne Netzwerk
2 Multiuser mit Netzwerk
3 Multiuser mit Netzwerk und xdm (x- Windows)
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
S05network (/bin/init.d/network)
- rc macht nun in jedem runlevel folgendes:
- rc r uft alle Kill- scripts mit dem Parameter stop auf, und
alle Start- scripts mit dem Parameter start
Start/ Stopscripts gesteuert.
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
liest deshalb die Datei /etc/rc.config ein, um den Wert der Variaben
START_INETD zu ermitteln. (. /etc/rc.config)
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).
- Variable STARTPROG in /etc/rc.config setzen- ein shellscript mit dem namen r2level im Verzeichnis /sbin/init.d erstellen
- wenn die Variable STARTPROG auf »yes« gesetzt ist
- 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
- 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