Oppgave 1 - Bash (10%)
a) Hvilke av disse fire kommandoene lager en kopi av filen mintekst.txt
?
ls mintekst.txt > mintekst2.txt cat mintekst.txt > mintekst2.txt mv mintekst.txt > mintekst2.txt cat mintekst.txt > mintekst.txt
b) Skriv en kommando som kopierer alle mapper og undermapper fra /etc/
til /mnt/backup
.
c) Hva gjør følgende kommando:
ps aux | grep "^ola"
d) Sett inn riktig kommando istedet for "???" slik at vi teller kun EN linje per bruker
ps aux | cut -f 1 -d " " | sort | ??? | wc -l
e) Hva gjør følgende kommando:
cat /var/log/auth.log | grep "failure"
f) Manualsiden for tail
gir blant annet følgende
NAME tail - output the last part of files SYNOPSIS tail [OPTION]... [FILE]... DESCRIPTION Print the last 10 lines of each FILE to standard output. -f output appended data as the file growsForklar med egne ord hva kommandoen
tail -f filnavn
gjør. Vis et eksempel på en situasjon der det er nyttig å bruke denne kommandoen.
Oppgave 2 - Brukere (30%)
Ola og Kari jobber sammen på et prosjekt på en Linux maskin. De bestemmer seg for å opprette en felles mappe /felles
der de skal ha filene de jobber sammen om. Ola sier han kan litt om Linux og fil-rettigheter og tar på seg oppgaven med å sette dette opp. Han kjører følgende kommandoer:
sudo su mkdir /felles chown ola /felles chown kari /felles
Etter at disse kommandoene er kjørt prøver Ola å kopiere noen filer dit som brukeren "ola", men får feilmelding:
ola@linuxmaskin:~$ cp dokument.txt /felles cp: cannot create regular file `/felles/dokument.txt': Permission denied
a) Kan du forklare hvorfor Ola får den feilmeldingen? Ville Kari også fått samme feilmelding?
Etter litt lesing forstår Ola at han må bruke grupper for å få dette til ordentlig. Han kjører nå følgende kommandoer:
sudo su addgroup fellesgruppe adduser ola fellesgruppe adduser kari fellesgruppe chgrp fellesgruppe /felles
b) Ola husker at det er en kommando for å sette rettigheter, slik at gruppen kan lese/skrive til filer i mappen, men er usikker på detaljene. Kan du skrive kommandoen slik at kun eier og gruppe kan lese/skrive/kjøre filer i den mappen men ingen andre?
Kari kopierer hennes fil karidokument.txt til /felles
og det går uten feilmeldinger. Ola åpner nå denne filen og skal endre på den, men får beskjed om at han ikke har skrivetilgang. Han kjører følgende kommando for å sjekke hva som er galt:
ola@linuxmaskin:~$ ls -l /felles total 4 -rw-r--r-- 1 kari kari 270 2009-06-08 12:13 karidokument.txt
c) Forklar hva som er i veien utifra utskriften over.
d) Hva må Ola og Kari gjøre for hver fil de ønsker å ha i felles-katalogen som begge skal kunne skrive til? Skriv gjerne kommandoene.
e) Lag et script fcp.sh
som skal fungere som en alternativ kommando til cp når Ola og Kari skal kopiere en fil til /felles
katalogen. Scriptet skal ta filen som skal kopieres som argument og kopiere den til /felles
, samt sette rettighetene og eierskap riktig.
f) Etterhvert blir Lisa også med på prosjektet og vil ha tilgang til filene. Hun har ennå ingen bruker på Linux systemet. Hva må Ola gjøre for at Lisa skal få samme tilgang som Ola og Kari? Skriv gjerne kommandoene.
g) Ola og Kari har også hver sin brukerkonto på en Windows-PC der Kari også kan logge seg på som Administrator. Forklar kort og uten tekniske detaljer hvordan Kari kan lage en tilsvarende mappe C:\felles
som begge skal kunne skrive til.
h) Forklar kort om løsningen du foreslår er avhengig av om det er FAT eller NTFS filsystem som brukes.
i) Forklar kort hva settingen Simple file sharing
har å si for den løsningen du foreslår.
j) Kari vil teste ut Windows-løsningen før den tas i bruk. Hun har fått Olas passord og bruker mye tid på å logge inn og ut for å teste hva de to brukerne Ola og Kari får lov til på mappen C:\felles
. Forklar kort hvordan det er mulig for Kari å teste dette uten å logge helt ut og inn for hver gang hun skal teste hva brukerne Ola og Kari får lov til.
Oppgave 3 - Prosesser (20%)
a) Forklar hva som menes med PID.
b) Du utfører Linux-kommandoen ls /etc/passwd
. Forklar kort om dette vil medføre at det utføres systemkall og isåfall hvorfor dette er nødvendig.
c) Forklar hva som menes med kontekst bytte (context switch).
d) I Linux finnes det en mappe /proc
som inneholder en undermappe for hver prosess som kjører akkurat nå. I hver undermappe finner man en fil "status" som beskriver den prosessens tilstand. To linjer i denne filen handler om kontekst bytter, f.eks:
ola@linuxmaskin:~$ cat /proc/3452/status | grep "ctxt_switches" voluntary_ctxt_switches: 5268292 nonvoluntary_ctxt_switches: 1186694
Som vi ser, skiller kjernen mellom frivillige og ufrivillige kontekst bytter. Disse representerer situasjoner hvor enten prosessen selv tok initiativ til kontekst bytte (frivillig) eller kjernen gjorde det uten at prosessen valgte det (ufrivillig). Kan du gi et eksempel på hver av disse situasjonene?
e) Lag et Perl script ctxt.pl
som tar et navn som argument og skriver ut disse to linjene som vist overfor for alle prosesser som matcher det navnet. F.eks:
ola@linuxmaskin:~$ ctxt.pl gedit PID: 3452 voluntary_ctxt_switches: 5268292 nonvoluntary_ctxt_switches: 1186694 PID: 14596 voluntary_ctxt_switches: 8468 nonvoluntary_ctxt_switches: 597
Oppgave 4 - Prosesser og Perl (20%)
Ryktene om dine egenskaper som Linux-guru sprer seg fort og en dag gir firmaet ditt deg oppdrag i å hjelpe den noe mystiske oppdragsgiveren Dobelo Seven med et problem. Han trenger et program som hurtig kan prøve å finne hvilke passord som skjuler seg bak hash-strenger av typen "07/QOvcL0LPVk". Du løser raskt problemet og gir ham følgende Perl-program som bruker fire omfattende ordbøker for å prøve å finne passordet:
#! /usr/bin/perl $hash = "07/QOvcL0LPVk"; $salt = "07"; crack("norsk",$hash,$salt); crack("english",$hash,$salt); crack("russian",$hash,$salt); crack("spanish",$hash,$salt); sub crack() { $ordbok = $_[0]; $hash = $_[1]; $salt = $_[2]; open(FIL,"/usr/share/dict/$ordbok"); while($ord = <FIL>) { chomp($ord); $streng = crypt($ord,$salt); if ($streng eq $hash) { print "Passordet som gir $hash er $ord\n"; } } close(FIL); }
a) Forklar kort hvordan dette programmet virker og hva det gjør. Forklar i store trekk hva programmet gjør og ikke hver eneste kodelinje i detalj.
b) Dobelo Seven synes programmet ditt er bra, men at det går litt for sakte. Det bruker ett minutt på å kjøre igjennom alle ordbøkene. Han lurer på om du ikke kan skrive et program som utnytter at du har to CPU'er i PC'en din? Jo, svarer du og kommer opp med følgende endring i programmet som erstatter de fire linjene der subrutinen crack()
kalles:
if(fork()) { crack("norsk",$hash,$salt); crack("english",$hash,$salt); } else{ crack("russian",$hash,$salt); crack("spanish",$hash,$salt); }Ordbøkene er like store og nå får du ut resultatet på et halvt minutt. Forklar kort hvorfor dette går dobbelt så fort.
c) Dobelo Seven er fortsatt ikke helt fornøyd. En venn av ham som kaller seg Kiu kommer innom og bytter ut de to CPU'ene dine med to CPU'er med ellers like spesifikasjoner men som begge er hyperthreading. Han er overbevist om at programmet da vil fullføres på halve tiden, 15 sekunder. Men programmet bruker fortsatt 30 sekunder, til tross for at ingen andre prosesser bruker CPU'ene. Forklar kort hvorfor.
d) Du lever opp til ditt Guru-rykte og kommer opp med en ny løsning hvor du endrer den samme delen av programmet til:
if(fork()) { if(fork()) { crack("norsk",$hash,$salt); } else { crack("english",$hash,$salt); } } else { if(fork()) { crack("russian",$hash,$salt); } else { crack("spanish",$hash,$salt); } }Du kjører det på nytt. Programmet blir riktignok ikke ferdig på 15 sekunder som Kiu håpet på, men på 22 sekunder. Forklar kort hvordan dette resultatet kan forklares.
Oppgave 5 - Perl sockets (20%)
a) Forklar kort hva følgende Perl-server gjør. Forklar i store trekk hva programmet gjør og ikke hver eneste kodelinje i detalj.
#! /usr/bin/perl use IO::Socket::INET; $port = "9002"; $socket = IO::Socket::INET->new(LocalPort => $port, Listen => 5) or die "Can't start tcp-server at port $port ($!)\n"; while ($socketConnection = $socket->accept()) { open(AUTH,"tail -f /var/log/auth.log|"); while ($line = <AUTH>){ print $socketConnection $line; } close($socketConnection); }
b) Anta at denne serveren startes opp og kjører på Linux-host'en os11.vlab.iu.hio.no
. Skriv et tilhørende client-program i Perl som kobler seg opp mot denne serveren og bruker den på en fornuftig måte.
c) Du ønsker å lage et realtime overvåkningssystem for de 70 host'ene med navn fra os11 til os80. På hver av disse hostene starter du opp serveren fra deloppgave a). Skriv et client-program som kobler seg opp mot alle disse-serverene og bruker dataene den mottar på en fornuftig måte.
d) Det viser seg at Perl-serveren må restartes for hver gang du avslutter client-programmet og kobler deg til serveren på nytt. Når du leter etter en måte å løse problemet på, finner du i perldoc metoden $socketConnection->connected()
som returnerer true hvis forbindelsen er oppe og false hvis den har blitt koblet ned. Forklar hvorfor den opprinnelige Perl-serveren må restartes for hver gang du starter client-programmet på nytt og foreslå hvordan koden kan endres slik at dette ikke lenger er nødvendig.