Eksamen høst 2005 Operativsystemer og UNIX
Les nøye gjennom oppgavene før du begynner og pass på å besvare alle spørsmålene. Alle trykte og skrevne hjelpemidler er tillatt. Oppgavene vil ikke bli vektlagt likt ved sensur. En sannsynlig fordeling er at oppgave 1 teller 10%, oppgave 2 teller 40%, oppgave 3 teller 30% og oppgave 4 teller 20%. De som ønsker det kan besvare oppgavene eller deler av oppgavene på engelsk. Sett gjerne egne forutsetninger dersom du synes oppgaveteksten er uklar. Beskriv forutsetningene og løs oppgaven utifra dem.

Oppgave 1

I denne oppgaven skal du i delspørsmål a) til d) løse problemet ved å angi en kommando på en linje, slik du ville ha tastet den inn til bash på en Linux-maskin fra tastaturet (du svarer for eksempel mkdir kat hvis du blir spurt: Opprett en katalog med navn kat).

a) Gi deg selv skrive og leserettigheter og alle andre brukere kun leserettigheter til filen foto.jpg i katalogen du står i

b) Flytt filen foto.jpg i katalogen du står i til ~/www/foto

c) Kopier filen /etc/passwd til din bruker s123456 på en annen Linux-maskin med navn nix.iu.hio.no. Hos denne brukeren skal filen legges i hjemmekatalogen.

d) Logg inn på en annen Linux-maskin med navn nix.iu.hio.no (men slik at passord ikke sendes i klartekst)

e) Du har en tekstfil readme.txt og utfører kommandoene

cat readme.txt > /dev/null
cat readme.txt
Forklar kort forskjellen på de to kommandoene og hva de vil resultere i.

f) Du har en fil /home/hh/.deleted/:home:hh:prosjekt som tidligere lå i katalogen /home/hh og da hadde navnet prosjekt. Du flytter den tilbake med kommandoen

mv /home/hh/.deleted/:home:hh:prosjekt /home/hh/prosjekt
men nå finnes det en katalog /home/hh/prosjekt. Forklar kort hva som skjer.

g) Studer følgende utdrag av manualsiden for date:

NAME
       date - print or set the system date and time
SYNOPSIS
       date [OPTION]... [+FORMAT]
DESCRIPTION
       Display the current time in the given FORMAT, or set the system date.

       -d, --date=STRING
              display time described by STRING, not `now'

       -f, --file=DATEFILE
              like --date once for each line of DATEFILE

       -r, --reference=FILE
              display the last modification time of FILE

FORMAT  controls  the  output.  

       %%     a literal %
       %a     locale's abbreviated weekday name (Sun..Sat)
       %A     locale's full weekday name, variable length (Sunday..Saturday)
       %b     locale's abbreviated month name (Jan..Dec)
       %B     locale's full month name, variable length (January..December)
       %c     locale's date and time (Sat Nov 04 12:02:33 EST 1989)
       %C     century (year divided by 100 and truncated to an integer) [00-99]
       %d     day of month (01..31)
       %D     date (mm/dd/yy)
       %e     day of month, blank padded ( 1..31)
       %F     same as %Y-%m-%d
       %m     month (01..12)
       %R     time, 24-hour (hh:mm)
       %T     time, 24-hour (hh:mm:ss)
       %Y     year (1970...)
Eksempelvis gir
$ date
Tue Nov 29 21:52:14 MET 2005
$ date +%A%B
TuesdayNovember
Gi en kommando som gir output 2005-11-29_16:04:00 der dette tidspunktet er forrige gang innholdet av filen sendt.log ble endret.
$ ls -l sendt.log
-rwx------  1 haugerud drift 54 Nov 29 16:04 sendt.log

Oppgave 2

I denne oppgaven skal du lage to bash-script som skal brukes til å teste en firewall (brannmur). Scriptene du lager skal ikke foreta selve testingen, men starte programmene som skal utføre testen. Følgende figur viser at firewall.iu.hio.no beskytter server.iu.hio.no på innsiden og er forbundet med blant andre shadowfax.iu.hio.no på utsiden. Scriptene du skal lage er angitt. fsendshadowfax sender TCP-pakker, noen stoppes av firewall'en og ftaimotserver tar imot de pakkene som passerer.

\includegraphics[width=16cm]{f.eps}
Du kan anta at du har root-rettigheter på alle maskinene og at du ikke trenger å skrive passord for å gå mellom de tre maskinene med ssh. Figuren viser også hvordan log-filene skal sendes, dette forklares nærmere nedenfor.

a) På maskinen shadowfax.iu.hio.no skal du i katalogen /root/ftester lage et bash-script med navn frun.bash. Angi først en eller flere kommandoer du bruker for å åpne en editor og skrive dette scriptet etter at du har logget inn. Dette scriptet skal utføre følgende oppgaver:

b) I denne deloppgaven skal du lage scriptet /root/ftester/fstart.bashfirewall.iu.hio.no. Dette scriptet kjøres på denne maskinen og styrer derfra hele testen ved at

  1. server.iu.hio.no startes et program ftaimot som lytter etter nettverkspakker fra shadowfax.iu.hio.no og logger de den mottar i filen mottatt.log
  2. /root/ftester/frun.bash fra a)-oppgaven startes på shadowfax.iu.hio.no. Det starter fsend som sender en rekke testpakker over nettet til server.iu.hio.no og lagrer en log over hva som er sendt i sendt.log. Til slutt sendes denne log-filen til firewall.iu.hio.no.
  3. Filen mottatt.log hentes fra server.iu.hio.no og programmet freport kjøres for å lage en rapport om hvilke pakker som slapp igjennom utifra filene sendt.log og mottatt.log.
Skriv et script /root/ftester/fstart.bash som skal kjøres på firewall.iu.hio.no og som gjør følgende:

Oppgave 3

I de tre første deloppgavene av denne oppgaven, skal du tenke deg at du er ansatt i et firma som kun kjører Linux (joda, de finnes!) Du skal velge et programmeringsspråk eller scriptspråk for å løse tre oppgaver. Det finnes ikke eksakte fasitsvar til disse tre oppgavene, men gi en kort begrunnelse utifra dine nåværende kunnskaper. Legg vekt på at du hurtigst mulig skal løse oppgaven og at programmet du lager ikke skal bruke uforholdsmessig mye tid når det kjøres.

a) Du skal lage et stort program som kun ved hjelp av den koden du skriver skal simulerer et nettverk av maskiner som hver har mange brukere. Ved å kjøre tidkrevende simuleringer, skal programmet generere statistikk over hva som skjer. Gi en kort begrunnelse for hvilket programmeringsspråk eller scriptspråk du vil velge for å løse oppgaven.

b) Du skal lage et program som tar kopi av alle filene i en log-katalog til ditt eget område, gjør filene leselig kun for deg selv og deretter starter et program som analyserer disse logfilene. Gi en kort begrunnelse for hvilket programmeringsspråk eller scriptspråk du vil velge for å løse oppgaven.

c) Du får beskjed om å lage et program som ut ifra en stor log-fil fra webserveren skal lage en statistikk over hvor mange ganger hver side er lastet ned, samt hvilke IP'er som forekommer oftest. Linjer fra filen ser ut som

128.39.75.4 - - [19/Oct/2001:13:34:11 +0200] "GET /~truongc/prh2001/bilder/meny.jpg HTTP/1.1" 
128.39.75.38 - - [19/Oct/2001:13:34:11 +0200] "GET /~sivaliv/BOTTOM.HTM HTTP/1.1"
Og det skal gjøres idag! Gi en kort begrunnelse for hvilket programmeringsspråk eller scriptspråk du vil velge for å løse oppgaven.

d) Forklar kort hvordan et operativsystem (tilsvarende det som ble simulert i andre obligatoriske oppgave) kan gi forskjellig prioritet til forskjellige prosesser.

e) Et operativsystem (tilsvarende det som ble simulert i andre obligatoriske oppgave) kontrollerer tilgangen til en felles variabel ved hjelp av en semafor. Forklar kort hva som skjer når tre prosesser samtidig prøver bruke denne felles variabelen. Er serialiseringen av prosessene avhengig av at prosessene bruker semaforen riktig?

f) Tenk deg at et Perl program som kan startes fra web bruker følgende metode for å unngå at to brukere skriver samtidig til en fil

`touch /tmp/lockfile`;   # Lager /tmp/lockfile
while(-f /tmp/lockfile) {}
# skriver til en felles fil
`rm /tmp/lockfile`;      # Fjerner /tmp/lockfile
I hvilke tilfeller virker ikke denne metoden? Forklar kort.

g) Hva gjør at følgende Mutex-algoritme mellom to prosesser er ubrukelig? Forklar kort.

static boolean[] flag = new boolean[2]; // Begge false i utgangspunktet
GetMutex(int t)
   {
   int other;
   other = 1 - t;
   flag[t] = true; // Ønsker å gå inn i kritisk avsnitt
   while (flag[other] == true){}
   }
 
ReleaseMutex(int t)
   {
   flag[t] = false;
   }

Oppgave 4

a) Skriv en Perl-subrutine addLine() som tar en streng som parameter. Hvis denne strengen ikke er eksakt lik noen av linjene i tekstfilen data.txt, skal subrutinen legge strengen til på slutten av filen data.txt. Hvis strengen som sendes som parameter er eksakt lik en av linjene i tekstfilen data.txt, skal subrutinen returnere uten å gjøre noe.

Bruk deretter subrutinen addLine() til å lage et Perl-script som for hver linje i filen nyeLinjer.txt som ikke finnes i filen data.txt fra før, legger linjen til på slutten av filen data.txt. Ingen linjer i nyeLinjer.txt er like hverandre.

b) I denne oppgaven skal du skrive en Perl-server som skal

Når en klient kobler seg til på port 9020 skal server -SLUTT-



Hårek Haugerud 2005-12-05