Freitag, 19. September 2008

Bashhacker Part3: logusers

Das Script Logusers fasst die wichtigsten Daten über angemeldete User zusammen. Dazu gehört wieviel Resourcen durch Speicherplatz und Prozesse einzelne angemeldete User belegen. Diese werden dann nur für den Superuser zugänglich in einem seperaten Verzeichnis abgelegt.

Code:

#!/bin/bash

#logusers
#Script that will log the uptime, date and time as well as all users logged in with their running actions

#Please report me, if you have any idea of what else should be logged.

#Comes with the package Bash-Tools
#Ideas collected by Mendel Cooper (Advanced Bash Scripting Guide)
#Rewritten for opensuse 10.3 by Matthias Propst



#VARS
NOT_ROOT=67
LOG_DIR=/var/log/logusers #Change this according to your needs
INDEX=$(date +%Y%m%d%H%M%S) #Change this if you need another date format or use a complete different way to index your logup file.
USERS=$(users)
IP_ADRESS=127.0.0.1 #Change this value if you know your current ip adress.
#VARS

###functions begin here

#checking for root
check_root ()
{
echo "Checking whether you are root."
if [ $UID -ne 0 ]
then
echo "Not root"
drop_failure
exit $NOT_ROOT
else
drop_ok
create_logdir
fi
}

#Checking whether directory /var/log/logusers allready exists and has all neccessary permissisons, if not, creating it
create_logdir ()
{
echo "Checking whether the logdir exists"
if [ ! -d $LOG_DIR ]
then
mkdir -p /var/log/logusers
chmod 700 $LOG_DIR
main
drop_ok
else
drop_ok
main
fi
}

#main fucntion does the action for what the script is for
main ()
{
#Creating new logfile
echo "Creating logdir. Please wait."
touch $LOG_DIR/"$INDEX".log


{
echo "File was generated by $0"
date
echo "========================================================================================================"
} >> $LOG_DIR/"$INDEX".log


{
echo "Host information:"
echo $LOGNAME"@"$HOSTNAME
echo $MACHTYPE
uname -r
cat /proc/cpuinfogrep model\ \name
cat /proc/cpuinfogrep cpu\ \MHz
uptime
echo "========================================================================================================="
} >> $LOG_DIR/"$INDEX".log


{
echo "Network information:"
ifconfig
iwconfig
ping -w 1 google.de 2> /dev/null

if [ $? -gt "0" ]
then
echo "There is no connection running:"
else
echo "You are running a connection to the internet"

#scans only the localhost by default
echo "nmap:"
nmap $IP_ADRESS -v
echo "netstat:"
netstat
fi

echo "========================================================================================================="
} >> $LOG_DIR/"$INDEX".log

{
echo "The following users are logged in:"
echo "=================================="
finger
n=0

for m in ${USERS[@]}
do

if [ $m != $n ]
then
id $m
n=$m
fi

done

id root

echo "The following processes are running:"
echo "===================================="
echo "Sorted by User"
k=0
for i in ${USERS[@]}
do

if [ $i != $k ]
then
echo $i
ps -U $i
k=$i
fi

done

echo "root"
ps -U root

echo "Treeview"
pstree -pu
echo "====================================================================================================="
} >> $LOG_DIR/"$INDEX".log

{
echo "These environment variables has been set:"
env
} >> $LOG_DIR/"$INDEX".log


#Ensuring the logfile is only readable to root
chmod 400 "$LOG_DIR"/"$INDEX".log

#Ensuring no one but root can manipulate or delete the output.logfiles
chattr +a $LOG_DIR/"$INDEX".log

echo "Logs have been saved to $LOG_DIR/$INDEX"
echo -e '\t \t \t \t \E[32mdone'; tput sgr0

exit 0
}

drop_ok ()
{
echo -e '\t \t \t \t \E[32mok'; tput sgr0
}

drop_failure ()
{
echo -e '\t \t \t \t \E[31mfailure'; tput sgr0
}

###functions end here

check_root

exit 0

Bashhacker Part2: wipefree

Mögliche Gründe, warum das wiederherstellen von sensiblen Dateien vermeiden will gibt es viele. Thomas C. Greene hat für diese Aufgabe ein einfaches Script erstellt, welches ich ein wenig verändert habe. Das Skript überprüft, ob benötigte externe Programme bereits vorhanden sind. Es kann nun angewählt werden, wie oft das Dateisystem mit Nullen oder Datenmüll überschrieben wird. Du kannst das Volume angeben. Außerdem werden Durchlaufzeiten und Fortschritt des Skriptes gezählt und angezeigt.

Code:
#!/bin/bash

#wipefree

#Script that will wipe the free space of several partitions

##Comes with the package Bash-Tools
#Original Idea by Thomas C. Greene
#Ideas Collected by Mendel Cooper (Advanced Bash Scripting guide)
#rewritten for opensue 10.2 by Matthias Propst

#VARS
NOT_ROOT=67
NO_PART=82
NO_INT=24
NO_SYNC=34
#VARS

###functions begin here

#checks for root
check_root ()
{
echo "Checking whether you are root."

if [ $UID -ne 0 ]
then
echo "Only root can wipeout free space."
drop_failure
exit $NOT_ROOT
else
drop_ok
check_sync
fi
}

check_sync ()
{
VERSION=$(sync --version 2> /dev/null echo "-" )
if [[ $VERSION == "-" ]]
then
echo "sync does not seemed to be installed"
echo "Please install sync and rerun again. It is usaly in the package coreutils."
echo "Script exits now."
drop_failure
exit $NO_SYNC
else
echo "found $VERSION"
drop_ok
often
fi
}

often ()
{
##stes the counter. this is important and ensures the script to stop
unset COUNTER
read -p "How often to you need `basename $0` to run: " COUNTER
${COUNTER:="0"} 2> /dev/null
CHECK=$(( $COUNTER * 1 )) 2> /dev/null
#this prevents the user passing 0 or an non integer value
##sets the Counter. this important and ensures the script to stop


if [[ $CHECK != $COUNTER OR $COUNTER == "0" ]] #because Check will be the errormessage from a non integer value or counter is 0 this checks whether counter is an integer > 0
then
echo "$COUNTER is not an integer value."
drop_failure
exit $NO_INT
else
algorithm
fi
}

algorithm()
{
unset ALGO
unset ALGO_NAME
clear
#Users Choise of which algorithm (method) is used
echo "Algorithms:"
echo "(1) urandom: Uses the /dev/urnadom (default)"
echo "(2) zero: Uses /dev/zero to overwrite your free space (fast but unsecure)"
echo "(3) filesplitter: uses a mixture of both zero and urandom and split up the _cleanupfile_. (should be best result)"
read -n 1 -p "Which algorithm do you want to run. Press Enter to use default." ALGO
${ALGO:=1} 2> /dev/null

case $ALGO in
1) check_part
;;
2) check_part
;;
3) check_part
;;
*) algorithm #if any other keys is pressed the script asks again
;;
esac

}

check_part ()
{
clear
echo "We will wipe out free space in"

for f in $FS #the loop list all folders given and checks whether the folder belongs to a partition
do
unset PART
unset CRYPTO_PART

if [[ $f == "/dev/" OR ! ${f/#\/dev*} OR ! ${f/#\/proc*} $f == "swap" ]]
then
echo "Oops"
echo "$f: This is not allowed"
exit $NO_PART
fi

PART=$(echo `less /etc/fstab grep $f`)
CRYPTO_PART=$(echo `less /etc/cryptotab grep $f`)

${PART:="-"} 2> /dev/null
${CRYPTO_PART:="-"} 2> /dev/null

if [ "$PART" == "-" ] ##if the partition is not in /etc/fstab than probly in /etc/cryptotab
then
if [ "$CRYPTP_PART" == "-" ]
then
echo "$f is not a partition"
echo "Maybe this is not your fault. Because the Script does not handle /foobar/ if the folder /foobar has"
echo "its own partition. Try to rerun the script with /foobar instead of /foobar/." #a warning because i dont know how to prevent that. maybe someone else has an idea+++script exits at first found invalid partition this depends on the order of given scripts
drop_failure
exit $NO_PART
fi
else
echo $f
fi
done
drop_ok

echo "$COUNTER times"
echo "with the"
case $ALGO in #prints a summary
1) echo "urandom"
;;
2) echo "zero"
;;
3) echo "filesplitter"
;;
esac
echo "algorithm."
sleep 3

main
}

trapint ()
{
echo "dont press ctrl + c"
}

main ()
{
echo "Starting now."
echo "This may take a long time."
echo -e '\E[5;31mDo not interrupt or kill this script until it is finished'; tput sgr0
sleep 3

case $ALGO in
1)

until [ $COUNTER -eq 0 ]
do
((COUNTER -=1))
((COUNTER2 +=1))
echo "Starting pass $COUNTER2."
echo "Remaining $COUNTER passes."

for f in $FS
do
name="$f/_cleanupfile_"
echo "Creating $name"
set +e +u
trap trapint 2 SIGTSTP
dd if=/dev/urandom of="$f/_cleanupfile_"
sync; sync
rm "${f}/_cleanupfile_"
sync; sync
drop_ok
done

done
;;
2)
until [ $COUNTER -eq 0 ]
do
((COUNTER -=1))
((COUNTER2 +=1))
echo "Starting pass $COUNTER2"
echo "Remainig $COUNTER passes."

for f in $FS
do
name="$f/_cleanupfile_"
echo "Creating $name"
set +e +u
trap trapint 2 SIGTSTP
##creates the big cleanupfile
dd if=/dev/zero of="$f/_cleanupfile_"
sync; sync ##sync the cleanupfile
rm "${f}/_cleanupfile_"
sync; sync ##sync free space
drop_ok
done
done
;;
3)
until [ $COUNTER -eq 0 ]
do
((COUNTER -=1))
((COUNTER2 +=1))
echo "Starting pass $COUNTER2"
echo "Remainig $COUNTER passes."

for f in $FS
do
folder="$f/_clean_"

a=0
i=0
while [ $a -eq 0 ]
do
unset a
mkdir -p $folder
((i+=1))
unset RAND
RAND=$(($RANDOM %2 )) #generates random integer and checks whether this is odd or even by using the mathemtic modulo function

case $RAND in
0) #rand was even
name="$folder/_cleanupfile_$i"
echo "Creating $name"
set +e +u
trap trapint 2 SIGTSTP
dd count=250000 if=/dev/zero of="$name"
;;
1) #rand was odd
name="$folder/_cleanupfile_$i"
echo "Creating $name"
set +e +u
trap trapint 2 SIGTSTP
dd count=250000 if=/dev/urandom of="$name"
;;
esac
a=$?
done
sync; sync
rm -r "${f}/_clean_"
sync; sync
drop_ok

done
done
;;
esac

echo -e '\t \t \t \t \E[32mdone'; tput sgr0

exit 0
}

drop_ok ()
{
echo -e '\t \t \t \t \E[32mok'; tput sgr0
}

drop_failure ()
{
echo -e '\t \t \t \t \E[31mfailure'; tput sgr0
}

###functions end here

FS=$*
${FS:="/"} 2> /dev/null #if no argument is given, / is assumed
check_root

exit 0

Donnerstag, 18. September 2008

Heute schon gedoodled




„Gestern habe ich doch noch diese Datei gehabt. Argh! Wo habe ich die nur wie­der hin getan? Wenn ich doch nur wüßte wie die gesuchte Datei hieß. Jeden­falls weiß ich noch das ich darin etwas Interessantes über Foobar gelesen habe.“
Kennst Du das? Dann helfen Dir unter Linux sogenannte Such- und Indizie­rungsdienste, die Dateien und ihre Inhalte nach Stichpunkten durchsuchen und diese dann in eine Datenbank ablegen, die sich anschließend nach einem be­stimmten Begriff durchsuchen lässt. Dabei kannst Du zum Beispiel auch Tags für Fotos in eine Indexdatenbank ablegen lassen, die die Information über Da­tum und Ort der Aufnahme enthalten können. So lassen sich zum Beispiel die Urlaubsfotos schneller finden. Ebenso ist es möglich. Mediatags, die Informatio­nen zu Titel und Interpret ei­ner Musikdatei enthalten, zu indizieren, so dass Du anschließend ganz einfach Deinen Lieblingstitel oder Künstler wiederfinden kannst.


Dabei muss es nicht immer Beagle sein, um Deine Dateien indizieren zu lassen und anschließend nach Stichworten zu durchsuchen. So manch ein User ist frustriert bis genervt, wenn Beagle wieder einmal die Festplatte beansprucht und die CPU-Auslastung für Stunden am Anschlag steht.


Mit dem Kommandozeilentool Doodle lassen Sich Dateien schnell und platzsparend indizieren.


Doodles Stärken



Da Doodle intern die Bibliothek libextractor benutzt, werden Momentan die Da­teiformate plain text, html, pdf, dvi, ps, mp3, ogg, wav, jpeg, gif, png, tiff, rpm, tar, zip, elf, real, riff, avi, mpeg, asf und quicktime für die Metatagindizierung unterstützt. Alle anderen Formate lassen sich aber immerhin über den Datein­amen indizieren.


Doodle verwendet für die Lookups einen Suffix-Tree genannten Such­baum, der die Suche nach Schlüsselwörtern unglaublich rasant macht. Bei der Indizierung selber verwendet Doodle gleich mehrere Kniffe, um den Index mög­lichst klein zu halten und die Zeit für Indizierungen zu verkürzen. Unter ande­rem werden die Namen für Verzeichnisse in einem anderen Table der Daten­bank abgelegt als die Indizes selber. Das Ablegen von Integerwerten und Strings in die Datenbank ermöglicht eine Platzspareffizienz von bis zu 75 %.
Weil Doodle hauptsächlich als Kommandozeilentool konzipiert und entwi­ckelt worden ist, ist es hoch konfigurierbar. Zudem läßt es sich außerordentlich gut durch Optionen steuern. Doodle kann mit Umgebungsvariablen umgehen, was das Programm eventuell interessant für das Schreiben von Shellscripten macht. Als Cron-Job eingerichtet oder mit Hilfe des Daemons doodled lassen sich Änderungen in Dateien einfach überwachen.


Doodle? Finde ich gut!



Für alle die Opensuse >= 10.2 benutzen, wird Doodle im Reposotority von Packman bereitgehalten.
ftp://ftp5.gwdg.de/pub/linux/packman/suse/10.2
ftp://ftp5.gwdg.de/pub/linux/packman/suse/10.3
Du kannst also Doodle bequem mittels Yast oder Smart installieren, nachdem Du Packman als aktive Softwarequelle zu Yast bzw. Smart hinzugefügt hast. Al­ternativ kannst du Doodle natürlich auch manuell installieren. Dazu musst du nur die Pakete


doodle
libdoodle
libextractor1



von der Packman Seite http://www.links2linux.de/ herunterladen und mit dem Rpm-Befehl:


rpm -Uhv doodle*rpm libdoodle*rpm libextractor1*rpm


installieren.



Für Benutzer einer Debian basierten Distribution, wie zum Beispiel Ubun­tu, sollte Doodle ebenfalls einfach über


apt-get install doodle doodled


heruntergeladen und installiert werden können.
Für die, die keine Scheu haben Software aus dem Quellcode zu installie­ren, kann Doodle direkt von der Seite
http://gnunet.org/doodle/download/doodle-0.6.7.tar.gz
der Entwickler bezogen und nach dem Entpacken mit dem üblichen Dreisatz


./configure
make
make install


kompiliert und installiert werden. Dazu werden allerdings die Development Da­teien von libextractor benötigt; zu finden in dem Paket libextractor-devel bzw. libextractor-dev.


Jetzt wird gedoodlet




Nach der Installation kannst Du direkt losle­gen. Öffne eine Konso­le und teile Doodle mit welche Verzeich­nisse er für Dich dood­len soll, indem Du etwa



doodle -bf /usr/share/doc


in die Kommandozeile deiner Wahl (Terminal, Konsole XTerm) tippst. Dies indi­ziert das Verzeichnis /usr/share/doc und alle darin enthaltenen Unterverzeich­nisse.
Du kannst nun zum Beispiel einmal


doodle doodle


eingeben, falls Du Doodle nicht glaubst, dass es fertig ist und erhältst als Ant­wort unter anderem
/usr/share/doc/packages/doodle/README
Aber doodle kann noch viel mehr. So können auch Umgebungsvariablen als Pa­rameter übergeben werden. Probiere es einmal aus, indem Du



doodle -bf $HOME



in der Kommandozeile eingibst und das Heimatverzeichnis des aktiven Nutzers von Doodle indizieren lässt.



Die Option -b teilt Doodle mit, dass das Program ein Verzeichnis, welches es als Parameter übergeben bekommt, indizieren soll. Die Zusätzliche Option -f sorgt dafür, das auch Dateinamen beim Anlegen der Datenbank berücksichtigt werden. Allerdings ist das Programm recht schweigsam und teilt Dir nicht mit, was es gerade tut. Um doodle zum Reden zu bringen musst Du die Option -V be­nutzen. Die Option -P erlaubt es Dir, Verzeichnisse oder Dateien von der Suche oder Indizierung auszuschließen. Außerdem solltest du Doodle mit der Option -B= mitteilen, welcher Sprache Du mächtig bist. Dabei ist die Länderkennung bestehend aus den zwei Buchstaben, die du vielleicht schon vom WWW her kennst. Also DE für Deutschland, EN für England oder ES für Spa­nien.
Angenommen Du sprichst Deutsch und Englisch und möchtest ein Ver­zeichnis mit dem Namen Vertraulich bei der Indizierung Deines Heimatver­zeichnisses ausschließen, dann kannst Du das ganz einfach bewerkstelligen, in­dem Du



doodle -bfV $HOME -P $HOME/Vertraulich -B=DE -B=EN


in die Kommandozeile tippst. In Abhängigkeit von der Menge der Dateien die sich in Deinem Hei­matverzeichnis breit gemacht haben, kann die Indizierung nun einige Sekunden bis mehrere Stunden in Anspruch nehmen.
Hat Doodle die Arbeit beendet, befindet sich eine versteckte Datei Na­mens .doodle im Heimatverzeichnis des aktiven Benutzers. Dies ist die Index­datei der Datenbank. Du kannst das auch ändern. Dazu muss eine Umgebungs­variable DOODLE_PATH gesetzt sein, in der Du einen alternativen Pfad für den Doodleindex festlegen kannst. Trägst Du zum Beispiel folgendes in Deine ~/.profile und ~/.bashrc ein:



#Datenbanken für den doodleindex
if [ !-d $HOME/.mydoodle ]
then
mkdir $HOME/.mydoodle
fi
export DOODLE_PATH="$HOME/.mydoodle/mydoodle.doodle"



wird der Index zukünftig in .mydoodle/mydoodle.doodle deines Heimatverzeich­nisses abgelegt.
Achtung: Änderungen für die ~/.profile werden erst nach einem Neustart der aktuellen Session übernommen. [Strg] + [Alt] + [Backspace]
Besonders interessant ist die Möglichkeit, mit Doodle Indexda­teien für unterschiedliche Verzeichnisse anzulegen. Etwa wenn Du einen Ord­ner Musik hast und später genau weißt, dass es sich bei der gesuchten Datei um eine Mu­sikdatei handelt. Dazu benutzt man die Option
--database=. Der Befehl für die Kommandozeile sieht dann so aus



doodle -bfV $HOME/Musik -B=DE -B=EN --database=~/.mydoodle/musik.doodle





um für das Verzeichnis Musik einen separaten Index zu erstellen. Mittles


doodle -i --database=~/.mydoodle/musik.doodle faith


durchsucht man nun den separat erstellten Index für das Verzeichnis Musik nach faith.
Die Option -i erlaubt es Dir mit Doodle auch caseinsensitive, ohne dass Groß- und Kleinschreibung berücksichtigt werden, zu suchen.


Der vollautomatische Doodlegang



Damit man Doodle nicht jedes mal selbst dazu bringen muss, die gewünschten Verzeichnisse zu indizieren kann Du Dich einerseits des Daemons doodled be­dienen, wenn Du möchtest das Doodle über jedwede Änderung in Deinen Ver­zeichnis Bescheid weiß und diese sofort in die Datenbank schreibt, oder Du startest den Dienst als Cron-Job in festgelegten Zeitintervallen.
Für die Indizierung durch den Daemon musst Du diesen lediglich zusam­men mit dem Fam-Daemon famd aufrufen. Dieser hat sein Heimat in dem Paket fam-server. Falls noch nicht geschehen, müssen noch folgende Pakete samt ih­rer Abhängigkeiten nachinstalliert werden:



fam
fam-server



Das Starten des Fam-Daemons benötigt unter Opensuse die Rechte des Supe­rusers Root.


su
pasword:
famd &
exit



Starte jetzt den Doodle-Daemon doodled unter Angabe des Verzeichnis wel­ches überwacht werden soll als Parameter


doodled $HOME



Das hat den Vorteil dass der Index für dieses Verzeichnis immer aktuell gehal­ten wird, da Doodle hier Änderungen sofort in der Daten­bank aktualisiert und ist besonders sinnvoll wenn Du ein Verzeichnis überwa­chen lassen möchtest, dessen Inhalte sich besonders häufig ändern.
Um den Dienst Anzuhalten, wird die unter Linux übliche Jobkontrolle ver­wendet. Dazu muss man zunächst die PID des Prozesses herausfinden:



ps -Agrep doodled
20439 ? 00:00:00 doodled
kill -9 20439



Für Verzeichnisse deren Inhalte eher statisch bleiben, empfiehlt es sich einen einfachen Cron-Job zu verwenden. Dazu öffnest Du zunächst den Cron-Tab Edi­tor, indem Du
crontab -e



in Deine Kommandozeile eingibst. Jetzt kannst Du für die Crontab des Benut­zers einen Job vergeben. Standardmäßig ist der Vi als Editor für die Crontab ein­gestellt. Da dieser Editor möglicherweise für Dich schwierig zu bedienen ist, kannst Du einen anderen Editor für die Crontab setzen. Hier bieten sich alle gültigen Editoren an, die im System bekannt sind. Zum Beispiel nano oder pico. indem Du eine Umgebungsvariable EDITOR setzt, kannst Du den benutzen Edi­tor für die Crontab anpassen.


export EDITOR=nano



Editiere nun die Crontab:



crontab -e
#update des doodle index
0 2 * * 5 matthias doodle -bf $HOME/Musik -B=DE -B=EN --database=.mydoodle/musik.doodle



Dieser Eintrag sorgt dafür, dass Doodle immer Freitags um 2 Uhr Nachts die Datenbank für den Musikordner aktualisiert.
Als Systemadministrator kannst Du so mit Doodle das gesamte System indizie­ren und den doodled Daemon dazu nutzen die Heimatverzeichnisse der User zu überwachen. In diesem Fall solltest du eine Gruppe doodle anlegen, der es er­laubt ist die Datenbank von Doodle zu lesen. Außerdem sollte die Datenbank selber für den User lesbar sein. Du könntest diese zum Beispiel in einem geson­derten Verzeichnis in /var/doodle aufbewahren. Entsprechend müssen dann na­türlich die Ein­träge für die Cron-Jobs und der ~/.bashrc bzw. ~/.profile ange­passt werden. An­genommen Du lässt die Datenbank in /var/doodle/users.doodle schreiben, dann könntest Du folgendermaßen bei den adminstratortechnischen Aufgaben vor­gehen:


su
password:
groupadd doodle
groupmod -A doodle
chmod 640 /var/doodle/users.doodle



Nicht vergessen das SGID-Bit für das doodle Programm zu setzen, um Benut­zern, die sich am System anmelden die Abfrage zu erlauben.



chown root:doodle /usr/bin/doodle
chmod g=s /usr/bin/doodle
exit



Der Doodle-Daemon sollte dann am besten zusammen mit dem Fam-Daemon beim Systemstart geladen werden. Füge dazu die folgenden Anweisungen in der Datei /etc/init.d/rc hinzu.


famd
doodled



Alternativ kann auch der Yast Runleveleditor verwendet werden.



Doodle als Catfish



Hat man einmal die Datenbanken für den Doodle-Index erstellt, kannst Du die­sen auch mit einem grafischen Tool durchsuchen lassen.
Das Tool Catfish ist einfach zu bedienen und Suchergebnisse lassen sich wie bei Beagle direkt öffnen und anzeigen. Nebenbei bemerkt kann das Tool
auch mit Beagle umgehen, außer­dem beherrscht es find, locate, sowie den kde4 Indexer Strigi.
Catfish befindet sich ebenfalls im Packman Repo und kann von dort her­untergeladen und installiert werden.
Nach der In­stallation befindet sich das Tool im Menu, von wo Du es unter System → Dateisystem → Catfish findest. Du kannst es auch direkt als Befehl unter [Alt] + [F2] absetzen, indem du dort



catfish



eingibst. Im Pulldownmenu Suchmethode wählst Du einfach Doodle aus. Jetzt brauchst Du nur noch Deine Suchabfrage in die Suchmaske eingeben und das war es dann auch schon.


T#