Selflinux - Shellprogrammierung
Von: "Ralf Doering" rdoering@netsys-it.de
Hallo,
erstmal ein Lob für den Beitrag zum selflinux-Projekt, auch wenn ich
gleich noch etwas inhaltlich meckern muss ;)
Da du als Autor des Teils über Shellskripting genannt bist, möchte ich
versuchen, einige Schnitzer, die mir bisher aufgefallen sind, zu
korrigieren.
1.2 Die Qual der Wahl =====================
Hier fehlt meiner Meinung nach ein Hinweis, auf POSIX/SUSv3 konforme
Shells. Eine original Bourne-Shell besitzt zumindest Linux nicht. Für
portable Shellskripte sollte man sich an SUSv3 halten, nicht an die
original Bourn Shell (auch wenn z.B. Solaris eine solche noch besitzt)
Die Bash ist übrigens nicht vollständig abwärtskompatibel zur Original
Bourne Shell. Features, die sh aufweist, aber von bash nicht unterstützt
werden, sind u.a. in der Bash-FAQ aufgeführt.
Die ksh unter "Einfach-Shells" einzuordnen halte ich für sehr gewagt,
die gehört (sowohl vom interaktiven Modus als auch von den Erweiterungen
für Shellskripte) in die Rubrik "Komfort-Shells".
Bei den Komfort-Shells fehlt IMO auch noch die zsh, die für interaktives
Arbeiten viele einzigartige Features aufweist.
3.9 Kommentare ==============
Ist es in diesem Zusammenhang sinnvoll, nochmal explizit darauf
hinzuweisen, das ein gequotetes # natürlich keinen Kommentar einleitet?
3.17 for ========
Diese Schleife ist etwas, was man normalerweise (ausser in ganz
besonderen, wohlüberlegten Fällen) vermeiden möchte:
----------------------------------------------------
for item in `cat program_list` # cat: Datei ausgeben
do
----------------------------------------------------
Erstens: uuoc (IMO)
Zweitens: wenn $item zeilenweise den Inhalt von program_list enthalten
soll, dann macht das Beispiel bei Vorkommen von IFS ind den Zeilen nicht
was es eigentlich soll
In der Regel is es hier eigentlich fast immer besser, ein
"while read item; do ... ; done < program_list"
zu nehmen.
5.2 Ein typisches init Skript =============================
----------------------------
Source function library.
/etc/rc.d/init.d/functions
----------------------------
Das Beispiel sieht mir so aus, als würde es von einem RH/Fedora o.ä.
System ausgehen? Obiges funktioniert so nicht auf allen Systemen, es
fehlt ein entsprechender Hinweis.
5.4 Fallensteller =================
---------------------------
#!/bin/sh
stat=1
temp=/tmp/zeige$$
---------------------------
Ist ein häufiges Konstrukt, kann aber durch Dritte sehr schön über eine
Symlink-Attacke dazu benutzt werden, eine beliebige Datei des
aufrufenden Nutzers zu überschreiben. Soetwas sollte man nicht als
Beispiel hernehmen, die Praxis mit Security Reports ala 'Insecure
tempfile creation' gibt mir recht. Besser für so etwas mktemp(1)
benutzen, auch wenn das Beispiel dann komplexer wird. Solche
fehlerhaften Idiome bekommt man nur schwer aus den Köpfen der Nutzer
wieder heraus.
Analog gilt das auch für 3.17 (for-beispiele.sh), dort wäre der Angriff
sogar noch einfacher:
for file do
pr $file > $file.tmp # pr: Formatiert Textdateien
done
Ganz am Ende ist ein HTML-Typo:
---------------------------------------------------
*) echo "Anwendung: `basename $0` Dateiname" 1gt;&2
---------------------------------------------------
6. Anhang B ===========
Der Link auf das Bash Reference Manual führt ins Leere.
Als weitere Referenzen fehlen hier IMO mindesten noch folgende:
- Advanced Bash Skripting Guide: http://www.tldp.org/LDP/abs/html/
- POSIX/SUSv3 Spezifikation