¶
$ diff test.sh test.sh.ok
1c1
< #/bin/sh
---
> #!/bin/sh
4c4
< echo usage: `basename $0` <positive number> && exit 1
---
> echo usage: `basename $0` \<positive number\> && exit 1
8,9c8,9
< [ $1 -lt 0] && usage()
< [ $1 -lt 2] && echo 1 && return
---
> [ $1 -lt 0 ] && usage
> [ $1 -lt 2 ] && echo 1 && return
12,15c12,15
< while : do
< n=`expr $n * $jog`
< jog=`expr $jog + 1'
< [ $jog -gt $1 ] & break;
---
> while :;do
> n=`expr $n \* $jog`
> jog=`expr $jog + 1`
> [ $jog -gt $1 ] && break;
21c21
< fori in 1 2 3 4 5 6 7 8 9 10 11 \
---
> for i in 1 2 3 4 5 6 7 8 9 10 11 \
23c23
< echo '$i! =' `calc $i`
---
> echo "$i! =" `calc $i`
¶
a)
Mit n>&- wird der Filedeskriptor n geschlossen. Damit geht ein write(n,....) im Gegensatz zum zweiten Beispiel schief. |
b)
Bei dem super user sollte der aktuelle Katalog nicht im Suchpfad sein, um Trojanische Pferde zu vermeiden. Die Idee ist, daß ein böser Benutzer in einem allgemeinen Katalog wie /tmp eine ausführbare Datei wie z.B. ls hinterlegt. Befindet sich der super user irgendwann in dem Katalog und ruft ls auf, so wird /tmp/ls ausgeführt. Dieses Programm könnte nun die ganze Platte löschen oder in dem Heimatkatalog des bösen Benutzers eine Kopie der Shell mit s-Bit erzeugen. Damit wäre der Benutzer quasi super user. |