Oppgave 1 - Bash (10%)
a) Den eneste kommandoen som lager en kopi er:
cat mintekst.txt > mintekst2.txt
b)
cp -r /etc/* /mnt/backup
c) Denne kommandoen lister opp alle prosesser som kjører og filtrerer ut med grep slik at kun de linjene som begynner med "ola" blir skrevet ut. Resultatet er en liste over alle prosesser som er eid av brukeren ola.
d)
ps aux | cut -f 1 -d " " | sort | uniq | wc -l
e) Denne kommandoen henter ut alle linjene fra logfile /var/log/auth.log som inneholder ordet "failure". Resulatet blir en liste over mislykkede innloggingsforsøk, siden disse blir logget i denne logfilen.
f) Tail vil i utgangspunktet kun vise slutten av en fil. Dette er praktiskt når man vil undersøke noe i en logfil, hvor de nyeste meldingene kommer nederst. Med opsjonen -f, vil tail vise slutten av en fil, men ikke avslutte. Tail vil følge med på om filen vokser og skrive ut de nye meldingene fortløpende. Dette er praktisk når man vil følge nøye med på operativsystemet. Man kan da starte f.eks tail -f /var/log/auth.log i et eget terminalvindu og få fortløpende oppdateringer mens man tester.
Oppgave 2 - Brukere (30%)
a) Kommandoen chown setter hvem som skal eie en mappe eller fil. Først kjøres kommandoen for ola. Dette gjør ola eieren av /felles. Så kjøres kommandoen for kari, og nå er ola ikke lenger eieren. Når han så prøver å kopiere filer dit, får han ikke lov. Kari ville fått lov, siden hun er eieren.
b)
chmod 770 /felles
c) Selv om rettighetene til selve mappen er satt riktig, betyr det ikke at filene i den har riktige rettigheter. Når Kari kopierer hennes filer inn i /felles, er de fortsatt eid av henne. Standard rettigheter på en fil er 644, som vises utifra utskriften til ls -l. I tillegg at brukeren kari er eier, er filen også eid av gruppen "kari". Ola kan altså kun lese denne filen intil Kari endrer eierskap eller rettigheter.
d) Kari må først endre slik at gruppen fellesgruppe eier filen. Deretter må hun gi skriverettigheter til gruppen på den filen.
chgrp fellesgruppe karidokument.txt chmod 664 karidokument.txt
e) Den enkleste løsningen er slik:
#!/bin/bash cp $1 /felles chgrp fellesgruppe /felles/$1 chmod 664 /felles/$1En mer avansert løsning vil ta høyde for stier i argumentet, f.eks ./fcp.sh /home/ola/oladoukument.txt
#!/bin/bash filnavn=$(basename $1) cp $1 /felles/$filnavn chgrp fellesgruppe /felles/$filnavn chmod 664 /felles/$filnavn
f) Lisa trenger en bruker på linux maskinen. Deretter må hun bli medlem i gruppen.
adduser lisa fellesgruppe
Man kan også legge til lisa i linjen som tilhører fellesgruppe i filen /etc/group
g) Kari kan som Administrator lage en mappe C:\felles
fra File-menyen eller med mkdir
fra kommandolinjen. Deretter kan hun gi skrive og leserettigheter til mappen for både Ola og Kari (ved å høyreklikke på mappen og velge PropertiesSecurity). Alternativt kan hun lage en gruppe
fellesgruppe
ved å høyreklikke My Computer-Manage-Local users and groups-groups
legge til Ola og Kari og gi gruppen rettigheter til felles
.
h) Løsningen er avhengig av at NTFS filsystem som brukes, med FAT filsystem kan brukernes filer i liten grad beskyttes mot andre brukere, og det meste kan i utganspunktet betraktes som felles.
i) Settingen Simple file sharing
må være skrudd av, ellers er det ikke mulig å sette slike detaljerte rettigheter (settes i My Computer Tools
View).
j) Hun kan som Administrator starte IE fra Quick Launch bar ved å høyreklikke den, velge Run As og bruke navnet til den brukeren hun vil teste. Når IE starter kan hun skrive inn C: i URL-linjen og vil da aksessere alle filer som brukeren hun kjørte Run as som.
Oppgave 3 - Prosesser (20%)
a) PID betyr prosess-ID. Hver prosess får en unik ID. Denne ID'en kan brukes til å sende signaler til en prosess, f.eks ved hjelp av kill kommandoen.
b) Kommandoen ønsker å liste opp filen /etc/passwd med ls kommandoen. For at dette er mulig må kommandoen ls kunne lese mappe-informasjonen til /etc. Dette får den ikke lov til å gjøre selv, siden man må aksessere en ekstern enhet, så den må kjøre et systemkall readdir() hvor operativsystemet kommer til å returnere informasjonen tilbake til prosessen.
c) En "context switch" skjer hver gang operativsystemet bytter ut hvilken prosess som skal kjøre. Det innebærer bla.a at operativsystemet lagrer unna all informasjon i prosessoren om den oprinnelige prosessen og setter den vekk i en kø før den gjør klar neste prosess. Et slikt bytte vil alltid ta litt tid for operativsystemet. Dersom den må gjøre det ofte, vil det begrense tiden som er tilgjengelig til prosessene.
d) Hver prosess kan kun kjøre en bestemt tid før den blir byttet ut med en neste prosess i køen. Dette vil utgjøre et ufrivillig bytte, siden prosessen ikke var ferdig med det den skulle og ikke kan fortsette før det blir dens tur igjen. Dersom prosessen må kjøre et systemkall må operativsystemet overta kjøringen på vegne av prosessen. Dette er et frivillig bytte, siden prosessen frivillig gir fra seg kjøringen for å vente på at systemkallet blir ferdig.
e)
#!/usr/bin/perl # finn alle prosesser open(PS,"ps aux |"); # les utskriften linje for linje while( $prosess = <PS> ){ my @array = split /\s+/,$prosess; # sjekk om prosessen matcher argumentet if ( $array[10] =~ /$ARGV[0]/ ){ # hent informasjon fra proc print "PID: $array[1]\n"; open(FIL,"grep ctxt /proc/$array[1]/status |"); # skriv ut linjene while ( $line = <FIL> ){ print "$line"; } close(FIL); } } close(PS);
Oppgave 4 - Prosesser og Perl (20%)
a) Programmet tester ved hjelp av subrutinen crack()
ut om hashen $hash
er resultatet av funksjonen crypt()
brukt på ett av ordene i fire ordbøker på forskjellige språk. Hver av ordbøkene gås igjennom ord for ord og for hvert ord kjøres crypt()
funkjsonen med det gitte saltet. Hvis resultatet er likt, skrives det ut en beskjed om det. Alle ord gjemmomløpes, også hvis ordet blir funnet. Linjeskift i hvert ord fjernes før testen utføres.
b) I det nye programmet gjør kallet til fork()
at det startes opp en uavhengig child-prosess som går igjennom norsk og engelsk ordbok. Parent prosessen går igjennom russisk og spansk. Siden maskinen har 2 CPU'er vil child-prosessen settes igang på den andre prosessoren og dermed jobber prosessene samtidig og uvhengig av hverandre på hver sin prosessor. Dermed går det dobbelt så fort, når ordbøkene er like store.
c) Det er fortsatt bare to uavhengige prosesser som jobber på hver sin prosessor. Dermed kan ikke hyperthreadingen utnyttes og det tar like lang tid. For å kunne utnytte hyperthreading må fler enn en prosess være aktiv på samme prosessor.
d) Nå startes det opp 4 uavhengige prosesser. Da vil de startes to og to på hver sin prosessor. Dermed kan hyperthreadingen utnyttes, mens den ene prosessen venter på data fra disk kan den andre bruke CPU'en og omvendt. Men i noen tilfeller står begge prosesser i kø for å bruke CPU'en og da må de vente på hverandre. Derfor blir det ikke hele 15 sekunder som spares inn, men bare 8 (tidene er forøvrig hentet fra virkelige kjøringer av programmet på maskinen huldra, som har to hyperthreading CPU'er).
Oppgave 5 - Perl sockets (20%)
a) Serveren lytter på innkommende TCP-tilkoblinger til port 9002. Når en klient kobler seg til leses filen /var/log/auth.log
med tail -f
. Dette vil føre til at hver gang en ny linje skrives til denne filen, vil linjen sendes fra serveren over socket-forbindelsen til klienten.
b) Denne klienten kobler seg opp og skriver ut hver linje til stdout etter hvert som den mottar den. Dermed sees hver innlogging på serveren.
#! /usr/bin/perl use IO::Socket::INET; $socket = IO::Socket::INET->new("os11.vlab.iu.hio.no:9002") or die "Can't connect\n"; while ($answer = <$socket>){ print $answer; } close($socket);
c) Dene klienten kobler seg opp til alle de 70 serverne ved å fork'e en ny prosess for hver server. Alle skriver til samme stdout og dermed vil alle oppkoblinger til hver server skrives ut på skjermen fortløpende.
#! /usr/bin/perl use IO::Socket::INET; for ($i = 11;$i <= 80;$i++){ $server = "os$i.vlab.iu.hio.no"; $pid = fork(); if($pid == 0){ $socket = IO::Socket::INET->new("$server:9002") or die "Can't connect to $server\n"; while ($answer = <$socket>){ print $answer; } } }
d)
Den opprinnelige serveren vil stå i den evige while-løkken og lese fra auth.log
selv etter at forbindelsen er avsluttet. Derfor må den stoppes før en annen kan koble seg til. Følgende kode sjekker for hver gang den gjør noe om også socket-forbindelsen er oppe. Hvis forbindelsen er nede, lukker den socketen og fortsetter å lytte etter nye tilkoblinger.
while ($socketConnection = $socket->accept()) { print "Received connection.\n"; open(AUTH,"tail -f /var/log/auth.log|"); while ($socketConnection->connected() and $line = <AUTH>){ print $socketConnection $line if $socketConnection->connected(); } close($socketConnection); }