Eksamen vår 2004 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 35%, oppgave 3 teller 25% og oppgave 4 teller 30%. 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 en kommando som sletter filen fil.txt som ligger i katalogen /tmp..

b) Gi en kommando som setter rettighetene til din fil /tmp/open slik at eieren (du) har alle rettigheter mens gruppen og alle andre bare kan lese filen.

c) Gi en kommando som laster ned siden http://www.vg.no/index.html til katalogen du står i.

d) Gi en kommando som gir antall linjer i filen index.html som inneholder ordet 'sport'

e) Du utfører følgende:

$ PATH=""
$ ls
Hva blir output?

f) Hva skjer når du utfører følgende script?

#! /bin/bash
$0 &

g) Hva skjer når du utfører følgende script og hvorfor bør du IKKE kjøre dette scriptet?

#! /bin/bash
$0 &
$0 &

Oppgave 2

a) Et "Network Intrusion Detection System" er et system som prøver å oppdage om noen forsøker å bryte seg inn på et nettverk. Et meget utbredt slikt system heter snort og oppdager innbruddsforsøk ved å sammenligne nettverkstrafikk med en rekke regler for hvordan kjente innbrudd ser ut. Dette settet med regler oppdateres jevnlig og ligger i en fil på web-adressen http://www.snort.org/dl/rules/snortrules-snapshot-2_1.tar.gz. I denne deloppgaven skal du lage et bash-script som henter denne filen og pakker den ut. Du kan tenke deg at f. eks. cron sørger for at scriptet kjøres en gang i døgnet og at det blir kjørt av root. Når du pakker ut tar.gz-filen, lages det en katalog med navn rules som inneholder alle filene som snort trenger.

Scriptet skal oppfylle følgende:

b) Skriv et bash-script rename som endrer filendelse på filer i katalogen det kjøres. Brukeren angir en filendelse og hva den skal endres til med to argumenter. Hvis man bruker rename som følger:

$ rename wav mp3
Endrer fil.wav til fil.mp3
Endrer fil2.wav til fil2.mp3
skal alle filer i katalogen som har filendelse wav endres til mp3. En opplysning om hver endring skal gis som i eksempelet. Hvis brukeren ikke angir to argumenter skal scriptet avslutte og oppgi riktig syntaks. Hvis det ikke finnes filer med den filendelsen brukeren angir som første argument, skal scriptet gi en melding om det. Manualsiden for kommandoen basename kan være til hjelp for å løse denne oppgaven.
NAME
       basename - strip directory and suffix from filenames

SYNOPSIS
       basename NAME [SUFFIX]
       basename OPTION

DESCRIPTION
       Print  NAME with any leading directory components removed.  If specified, also remove a
       trailing SUFFIX.

Oppgave 3

I denne oppgaven skal vi se på forskjellene mellom programmer skrevet i Java, C og bash og deres avhengighet av hvilken maskinplattform og hvilket operativsystem man kjører dem på. På din x86-PC som kjører Linux har du kildekoden til et Java-program med navn Hello.java. Du gjør følgende:

$ javac Hello.java
$ java Hello
Hello world!

a) Forklar kort de to kommandoene, hva som skjer og hva filen Hello.class er.

b) Du kopierer Hello.class til en Sun Unix-maskin som kjører Solaris og kjører det med

$ java Hello
Vil programmet kunne kjøre her? Forklar kort. Krever det eventuelt spesielle forutsetninger?

c) Du kopierer Hello.class til en Windows 2000 PC og kjører det fra Command Prompt med

C:\>java Hello
Vil programmet kunne kjøre her? Forklar kort. Krever det eventuelt spesielle forutsetninger?

d) På din Linux-PC kompilerer du C-programmet Hello.c og får den eksekverbare filen a.out. Du gjør følgende:

$ a.out
Hello world!
Forklar kort hva som skjer.

e) Du kopierer a.out til en Sun Unix-maskin som kjører Solaris og kjører det med

$ a.out
Vil programmet kunne kjøre her? Forklar kort. Krever det eventuelt spesielle forutsetninger?

f) Du kopierer a.out til en Windows 2000 PC (som kjører på nøyaktig samme hardware som din Linux-PC) og kjører det fra Command Prompt med

C:\>a.out
Vil programmet kunne kjøre her? Forklar kort. Krever det eventuelt spesielle forutsetninger?

g) På din Linux-PC kjører du bash-scriptet Hello.bash som ser slik ut

#! /bin/bash
echo "Hello world!"
Forklar kort hva som skjer når du kjører det (ikke bare hva output blir, men også litt om hvordan maskinen utfører koden).

h) Du kopierer Hello.bash til en Sun Unix-maskin som kjører Solaris og kjører det med

$ Hello.bash
Vil programmet kunne kjøre her? Forklar kort. Krever det eventuelt spesielle forutsetninger?

i) Du kopierer Hello.bash til en Windows 2000 PC og kjører det fra Command Prompt med

C:\>Hello.bash
Vil programmet kunne kjøre her? Forklar kort. Krever det eventuelt spesielle forutsetninger?

Oppgave 4

Programmet traceroute gir deg en mulig rute som en nettverkspakke følger når man sender noe til en annen host. Fra en maskin på skolen kan det f. eks. se slik ut:

$ /usr/sbin/traceroute anyon.uio.no
traceroute to anyon.uio.no (129.240.86.20), 30 hops max, 40 byte packets
 1  cadeler30-gw.uninett.no (128.39.89.1)  1 ms  1 ms  1 ms
 2  pil52-gw.uninett.no (158.36.84.21)  4 ms  1 ms  1 ms
 3  stolav-gw.uninett.no (128.39.0.73)  2 ms  1 ms  1 ms
 4  oslo-gw1.uninett.no (128.39.46.249)  1 ms  1 ms  1 ms
 5  uio-gw7.uio.no (128.39.3.94)  1 ms  1 ms  1 ms
 6  abel-gw.uio.no (129.240.100.126)  1 ms  1 ms  1 ms
 7  fys-gw.uio.no (129.240.100.138)  1 ms  1 ms  1 ms
 8  anyon.uio.no (129.240.86.20)  1 ms  1 ms  2 ms
I denne oppgaven skal du skrive ditt eget traceroute program i Perl. Generelt lagres det ikke informasjon om hvilke gateways en pakke er innom. Men man kan finne det ut ved hjelp av et lite triks. I IP-headeren er det et felt som kalles "Time To Live" (ttl) og som inneholder et tall. Hver gang en pakke er innom en gateway, senkes dette tallet med en. Hvis det blir null, droppes pakken og gatewayen sender en melding til avsender om at pakken har blitt droppet. Dette gjøres for å være sikker på at en pakke ikke går i en evig løkke. Du skal i scriptet utnytte dette. Hvis man sender en pakke med ttl = 1, vil den droppes av den første gatewayen pakken kommer til. Kommandoen ping har en opsjon -t som gjør at man kan sette ttl-verdien. Dermed får man følgende resultat:
$ ping -w 1 -c 1 -t 1 anyon.uio.no
PING anyon.uio.no (129.240.86.20) from 128.39.89.9 : 56(84) bytes of data.
From cadeler30-gw.uninett.no (128.39.89.1) icmp_seq=1 Time to live exceeded
(Opsjonen -w 1 angir at man bare skal vente ett sekund på svar på den opprinnelige pakken. Opsjonen -c 1 angir at det kun skal sendes en pakke.) Dermed vet man at når man sender en pakke til anyon.uio.no, er cadeler30-gw.uninett.no den første gatewayen pakken går til. Neste steg blir å sende en ping-pakke med ttl = 2. Først går den til cadeler30-gw.uninett.no som senker ttl fra 2 til 1 og sender den videre i riktig retning. Neste gateway senker så ttl fra 1 til 0 og sier ifra til avsender om at pakken er droppet:
$ ping -w 1 -c 1 -t 2 anyon.uio.no
PING anyon.uio.no (129.240.86.20) from 128.39.89.9 : 56(84) bytes of data.
From pil52-gw.uninett.no (158.36.84.21) icmp_seq=1 Time to live exceeded
Slik kan man fortsette å øke ttl-verdier helt til man kommer helt fram. I vårt eksempel må vi øke ttl helt til 8 og da får vi en anderledes tilbakemelding:
$ ping -w 1 -c 1 -t 8 anyon.uio.no
PING anyon.uio.no (129.240.86.20) from 128.39.89.9 : 56(84) bytes of data.
64 bytes from anyon.uio.no (129.240.86.20): icmp_seq=1 ttl=248 time=1.51 ms
Lag et Perl-program ttl.pl som bruker output fra ping og denne strategien til å finne veien en pakke sannsynligvis vil ta. Output fra programmet skal i vårt eksempel være:
$ ttl.pl anyon.uio.no
1 cadeler30-gw.uninett.no (128.39.89.1)
2 pil52-gw.uninett.no (158.36.84.21)
3 stolav-gw.uninett.no (128.39.0.73)
4 oslo-gw1.uninett.no (128.39.46.249)
5 uio-gw7.uio.no (128.39.3.94)
6 abel-gw.uio.no (129.240.100.126)
7 fys-gw.uio.no (129.240.100.138)
8 anyon.uio.no (129.240.86.20)
Scriptet skal avsluttes hvis ttl blir over 100. Feilmelding skal gis om ikke nøyaktig ett argument blir brukt. Hvis man sender ping til en host som ikke finnes, får man følgende tilbakemelding:
$  ping -w 1 -c 1 -t 2 finnes.ikke.no
ping: unknown host finnes.ikke.no
Brukeren skal da få en melding fra scriptet om at angitt host ikke finnes. (NB! Vær oppmerksom på at ping sender "unknown host"-meldingen til stderr, men at konstruksjonen 2>&1 videresender stderr til stdout.)

-SLUTT-



Hårek Haugerud 2004-09-23