#!/bin/sh -
#-------------------------------------------------------------------------------
# secure-script.sh                               (C) 2006 T.Birnthaler OSTC GmbH
#-------------------------------------------------------------------------------
# Sicheres Shell-Skript schreiben.
#-------------------------------------------------------------------------------
# Shee-Bang-Zeile + Option "-" -> Keine unbeabsichtigten Optionen übergebbar
#-------------------------------------------------------------------------------
# Standard-Trennzeichen Leerzeichen, Tab, Newline
IFS=" 	
"                                    # Standard-Shell-Trennzeichen (LEERZ, TAB, CR)
PATH="/bin:/usr/bin"                 # Normaler Suchpfad: Programme nur hier suchen
PATH="/bin:/usr/bin:/sbin:/usr/sbin" # root-Suchpfad: Programme nur hier suchen
LS_OPTIONS=                          # "ls"-Optionen aus
GROUP="users"                        # Standard-Gruppe
WORKDIR="/home/tsbirn"               # Arbeitsverzeichnis
EDITOR=                              # Standard-Editor
VISUAL=                              # Standard-Editor
LANG="C"                             # Standard-Sprache (wegen Meldungen!)
LANGUAGE="C"                         # Standard-Sprache (wegen Meldungen!)
LC_ALL="C"                           # Standard-Sprache (wegen Meldungen!)
SHELL="/bin/sh"                      # Standard-Shell
SHELL="/bin/bash"                    # Standard-Shell
LD_LIBRARY_PATH="/lib:/usr/lib"      # Standard-Bibliotheken
DBG=                                 # Debugging aus
TMP="/tmp"                           # Temporäres Verz. setzen
TMPDIR="/tmp"                        # Temporäres Verz. setzen

# Gruppe + alle Anderen können auf im Skript erz. Dateien/Verz. nicht zugreifen
umask 077

# Namen von temp. Dateien/Verz. nicht erratbar generieren und anlegen
 TMPDIR=$(mktemp -d /tmp/XXXXXXXXXXX) || exit 1 # Temp. Verz. (mind. 12 X!)
TMPFILE=$(mktemp $TMPDIR/XXXXXXXXXXX) || exit 1 # Temp. Datei (mind. 12 X!)

# Gewünschter Benutzer(-Gruppe) zuordnen + Abbruch wenn nicht möglich
chgrp $GROUP $TMPDIR $TMPFILE || exit 1

# Wichtige Signale abfangen
trap "exit 1" 1   2   3    13   14   15   17   # -> Signal 0 = Skript-Ende auslösen
trap "exit 1" HUP INT QUIT PIPE ALRM TERM CHLD # -> Signal 0 = Skript-Ende auslösen

# Temporäre Dateien/Verz. bei Skriptende (Signal 0/EXIT) automatisch löschen
trap 'rm -rf $TMPFILE $TMPDIR > /dev/null 2>&1' EXIT
trap 'rm -rf $TMPFILE $TMPDIR > /dev/null 2>&1' 0

# In Arbeitsverzeichnis wechseln + Abbruch wenn nicht möglich
cd "$WORKDIR" || exit 1

# Debugging an?
[ "$1" = "-d" ] && DBG=1

# Wertzuweisung und Variablenverwendung immer mit "..." aussenrum
# (leer oder Metazeichen -> Peng!)
VAR="Wert"
echo "$VAR"

# Vergleiche immer gegen leere Variablen UND Optionen schützen
if [ "$VAR" = "abc" ]...         # Leerraum und Sonderzeichen schützen
if [ "X$VAR" = "Xabc" ]...       # Falls Variablenwert mit "-" beginnt!

# Dateilisten mit "/dev/null" abschließen
# (vermeidet leere Liste -> Warten auf Benutzereingabe)
cat * /dev/null
cat $* /dev/null

# Parameterliste immer mit ${1+"$@"} darstellen (exakt reproduziert)
subskript.sh ${1+"$@"}

