Oppgave 1
a) cd /usr/bin
b) cp * ~/www # Kataloger blir da utelatt
c) echo $PATH
d) traceroute gnu.org
e) /usr/bin/emacs
f) /etc/alternatives/emacs # Awk splitter på mellomrom, $NF er siste element
g) Dette har å gjøre med i hvilken rekkefølge bash ekspanderer ~
og variabler og at
doble apostrofer gjør at ekspandering av ~
hoppes over.
Shellet substituerer verdien til en variabel etter at det
substituerer hjemmekatalogen for ~
. Dermed utføres cd '~/deleted'
og det finnes ikke noen katalog som begynner med ASCII-tegnet ~
.
Man kan istedet sette:
dir=~/deleted # Her substitueres ~ med hjemmekatalogen $ echo $dir /iu/nexus/ud/haugerud/deleted $ cd $dirog da går det som ønsket. Et alternativ er
$ dir="~/deleted" $ eval cd $dir
eval
sender sine argumenter gjennom en evalueringsrunde og resultatet,
cd ~/deleted
sendes til bash for evaluering og da blir ~
ekspandert.
Oppgave 2
a)
#! /bin/bash if [ $# -ne 1 ] then echo "Gi ett argument" exit fi prog=$1 IFS=: for dir in $PATH do if [ -x $dir/$prog ] then echo "$dir/$prog" exit fi done
b)
#! /bin/bash link=$1 dypere="true" while [ $dypere ] do if [ -L $link ] then dir=`dirname $link` base=`basename $link` cd $dir # I fall linken er gitt med relativ path ls -l `pwd`/$base link=`ls -l $base | awk '{print $NF}'` # Alt. for-løkke gjennom ls-output else dypere="" # Nå er det ikke flere linker fi done if [ -f $link ] # Hvis det er en katalog er scriptet ferdig allerede then dir=`dirname $link` base=`basename $link` cd $dir ls -l `pwd`/$base fi
c)
#! /bin/bash if [ $# -ne 1 ] then echo "Gi ett argument" exit fi prog=`where $1` if [ $prog ] then delink $prog else echo "$1 er ikke i PATH ($PATH)" fi
Oppgave 3
a) Et kritisk avsnitt er kode som må fullføres av prosessen som utfører den uten at andre prosesser bruker samme felles ressurs.
b) En semafor er et heltall S som signaliserer om en ressurs er tilgjengelig. Verdien på semaforen viser om den er ledig eller i bruk og eventuelt hvor mange som venter i kø.
c) Semaforen kan ha verdiene S = 1, 0, -1 og -2. Hvis alle de tre prosessene gjør et wait-kall før den som gjorde det først har kaldt signal, vil S minke med 1 for hvert kall og ende på -2.
d) nice
kan brukes til å senke prosessens egen prioritet. Antall ticks som deles ut før hver epoke
blir da færre og prosessen kjører kortere enn de andre prosessene hver gang det er dens tur i
Round Robin køen.
e) HUB'en sender alle pakkene til alle maskinene i nettet og du kan dermed lese trafikk til naboen. Applikasjonene ftp og telnet sender passord i klartekst og du kan lese disse. ssh derimot, krypterer alle data som sendes og du kan ikke lese naboens passord i dette tilfellet.
f) En switch sender normalt kun data til den maskinen som har den MAC-adressen som står på pakken. Derfor vil du ikke kunne se noe av naboens trafikk. Det finnes metoder for å lure en switch til å sende deg pakkene likevel, så helt sikker kan naboen likevel ikke være.
g) Ja. IP-adressen står i IP-headeren og er med hele veien helt til mottageren.
h) Nei. Pakkene går via en gateway og den vil sette på MAC-adressen til det nettverkskortet den er koblet til nexus sitt nettverk med.
i) cadeler30-gw.uninett.no er gatewayen eller routeren som er bindeleddet mellom cubes og nexus' nettverk.
Oppgave 4
a)
sub writeLog() { my $info = $_[0]; my $LOGFILE = "honeypot.log"; my $date = localtime(); open (LOG,">>$LOGFILE"); print LOG "$date $info\n"; close(LOG); }
b)
sub getServiceNames() { my $min = $_[0]; my $max = $_[1]; my @services; open(SERV,"/usr/bin/lynx -source http://www.iana.org/assignments/port-numbers | "); while($line = <SERV>) { if($line =~ m/^(.*?)\s+(\d+)\/tcp\s+(.*?)$/) { if($2 >= $min and $2 <= $max) { $comment = $3; chop($comment); $services[$2] = "$1 ($comment)"; } } } close(SERV); return(@services); }
Oppgave 5
#! /bin/perl use IO::Socket::INET; $min = 1025; $max = 1027; @services = getServiceNames($min,$max); print "Starting servers on TCP-ports\n\n"; for($port = $min;$port <= $max;$port++) { print "Forking for port $port\n"; $pid = fork(); if($pid == 0) { if($server = IO::Socket::INET->new(LocalPort => $port, Reuse => 1, Listen => 1)) { print "Listens at TCP-port $port $services[$port]\n"; $BUFFSIZE = 1000; while("true") { $client = $server->accept; $host = $client->peerhost(); $info = "Connection at TCP-port $port ($services[$port]) from $host. "; $client->recv($buffer,$BUFFSIZE,"0"); $client->close; writeLog("$info $buffer"); } } else { warn "Can't start tcp-server at port $port ($!)\n"; } exit(); # exit of child } }Om man skal lytte på 1000 porter, vil fork-metoden ta for mye ressurser siden den starter en ny prosess for hver port og på de fleste systemer ikke være overkommelig. En fordel med fork-metoden, er at ikke alle port-lytterene crasher om en av dem skulle crashe.