Løsningsforslag Prøveeksamen våren 2008 Operativsystemer og UNIX

NB! Tekstens apostrofer: ` er en liten \ mens ' er en liten /

Oppgave 1

a) cd (alternativt cd ~ eller cd $HOME)

b) ln -s undervisning/forelesning/threads threads (OK også uten threads til slutt)

c) chmod 700 run

d) chmod -R 755 ~/www

e) user=`whoami`

f) ssh-keygen -t dsa -N "" -f ~/.ssh/id_dsa

g) Den vil hete id_dsa.pub og blir lagt i ~/.ssh/

h) Hensikten er å kunne logge inn med ssh på en annen maskin (og kopiere filer til og fra samme maskin med scp) uten å måtte skrive passord hver gang og uten at det gir muligheter for andre å gjøre det samme. Hvis man kopierer filen id_dsa.pub til den andre maskinen og der legger innholdet til på slutten av filen ~/.ssh/authorized_keys, vil dette oppnås.

Oppgave 2

a)

#! /bin/bash

if [ ! "$1" ]; then
    echo "Usage: slogin host"
    exit
fi
user=`whoami`
host=$1

if [ ! -f ~/.ssh/id_dsa ]; then
   ssh-keygen -t dsa -N "" -f ~/.ssh/id_dsa
else
    echo "Bruker eksisterende fil ~/.ssh/id_dsa"
fi

scp ~/.ssh/id_dsa.pub $user@$host:
ssh $host "cat ~/id_dsa.pub >> ~/.ssh/authorized_keys "
ssh $host "/bin/rm ~/id_dsa.pub" 

# Følgende mer avanserte løsning gjør de 3 siste kommandoene i en operasjon:
# cat ~/.ssh/id_dsa.pub | ssh $host "xargs  >> ~/.ssh/authorized_keys"

b)

#! /bin/bash

if [ ! "$1" ]; then
    echo "Usage: slogin host [user]"
    exit
fi

host=$1
notdns=`host $host | grep "not found"`
if [ "$notdns" ]; then
    echo "Avslutter. Finner ikke $host: $notdns"
    exit
fi

if [ "$2" ]; then
    user=$2    
else
    user=`whoami`
fi

if [ ! -f ~/.ssh/id_dsa.pub ]; then
   ssh-keygen -t dsa -N "" -f ~/.ssh/id_dsa
fi

scp ~/.ssh/id_dsa.pub $user@$host:
ssh $user@$host "cat ~/id_dsa.pub >> ~/.ssh/authorized_keys "
ssh $user@$host "/bin/rm ~/id_dsa.pub" 

# Følgende mer avanserte løsning gjør de 3 siste kommandoene i en operasjon:
# cat ~/.ssh/id_dsa.pub | ssh $user@$host "xargs  >> ~/.ssh/authorized_keys"

Oppgave 3

a) 128.39.74.16 er cube's 32 bits IP-adresse.

b) MAC-adresse (Media Access Control) er en adresse som brukes i data link laget (lag 2) som adresse på lokalnettet og den er permanent lagret i nettverkskortet. IP-adresse (Internet Protocol) er en adresse som brukes i nettverkslaget(lag 3) som global adresse på Internett. IP-adressen tilordnes et nettverksinterface og kan dermed endres ved behov. MAC-adressen ligger i frame-headeren, IP-adressen i IP-headeren.

c) Kommandoen er ifconfig og den er utført på nix.

d) IP-adressen er 128.39.74.71, MAC-adressen 00:0F:1F:8D:70:2A og netmask 255.255.254.0.

e) Nei, den sendes direkte til nix sin MAC-adresse på lokalnettet og trenger derfor ikke å gå innom gatewayen.

f) Ja, nexus er ikke på samme lokalnett og pakken må derfor sendes til gatewayen som videresender den til nexus.

g) Siden pakken videresendes av en switch på lokalnettet vil den under normale forhold (når switchen har lært seg hvor de forskjellige MAC-adressene er) bare sendes til nexus.

h) Siden pakken videresendes av en HUB på lokalnettet vil den under normale forhold sendes til alle maskinene på lokalnettet, siden HUB'er vanligvis videresender alle pakker til alle.

i) IP-adressen til dax er 128.39.89.338 og den kan ikke være gyldig for det største tallet som kan representers med 8 bit er 255 og 338 kan ikke inngå i en gyldig IP-adresse.

j) Vi vet fra ifconfig kommandoen at netmask er 255.255.255.254 for dette nettet og det betyr at de første 23 bit'ene utgjør nettverksnummeret. De første 23 bit'ene av 128.39.74.0 og 128.39.75.0 er de samme og det betyr at de er på samme lokalnettverk. 128.39.75.0 er forøvrig en gyldig host IP-adresse på dette nettverket.

k)

sender adresse 128.39.74.16 cube
mottager adresse 158.36.89.12 nero
source port 23 sendt fra tjeneste 23, telnet, på server
destination port 3536 portnummer generert av telnet-klient, større enn 1024
SYN 1 SYN-flagg settes i første svarpakke i handshakingen
ACK 1 ACK-flagg er også satt i første svarpakke

l)

sender adresse 158.36.89.12 nero
mottager adresse 128.39.74.16 cube
source port 3536 telnet-klient beholder dette portnummeret
destination port 23 til tjeneste 23, telnet, på server
SYN 0 SYN-flagg er kun satt i de to første pakkene i handshakingen
ACK 1 ACK-flagg er satt i alle svarpakker

m) Ja, telnet sender passord i klartekst og det er da enkelt å lese det fra pil52-gw.uninett.no som alle pakkene må gå igjennom.

n) Brukeren på nero bør logge seg på cube med en tjeneste som krypterer passord og helst alt som sendes, som for eksempel ssh.

o) Et portnummer består av 16 bit og det høyeste mulige portnummeret er dermed $2^{16} -1 = 65535$.

Oppgave 4

#! /usr/bin/perl

10 if ( $#ARGV != 0 )
  {
    die "Gi passordfilen som eneste argument: cehck.pl /etc/passwd\n";
  }

5 $passwd = $ARGV[0];
5 $host = `hostname`;
5 $os = `uname`;
chomp($host);
5 print "Scriptet kjører på $host under OS'et $os";

5 if ( ! -f $passwd )
  {
    die "Passordfilen finnes ikke!\n";
  }
5 if ( ! -r $passwd )
  {
    die "Passordfilen er ikke lesbar!\n";
  }

$ls = `ls -l $passwd`;
5 print "$ls";

# root:x:0:0:root:/root:/bin/bash
open(PASS,"$passwd");
10while ($line = <PASS>)
{
  5$nr++; # Teller brukere
  10($user,$x,$uid,$gid,$navn,$home,$shell) = split(":",$line);
   if ("$uid" == 0)
     {
       $uid0 .= "   $user ($navn)\n";
     }
  if($userInfo{$user})
     {
       # Samme brukernavn $user finnes fra før
       $sammeUser{$user} .= "   UID $uid ($navn)\n";
     }
  else
     {
       # $user finnes ikke fra før
       $userInfo{$user} = "   UID $uid ($navn)\n";
     }

  if($uidInfo{$uid})
     {
       # Samme $uid finnes fra før
       $sammeUid{$uid} .= "   Brukernavn $user ($navn)\n";
     }
  else
     {
       # $uid finnes ikke fra før
       $uidInfo{$uid} = "   Brukernavn $user ($navn)\n";
     }
}
close(PASS);

print "Det er $nr $antall brukere i passordfilen\n";

if($uid0)
     {
       print "\nFølgende brukere har UID = 0: \n$uid0\n";
     }
if(%sammeUser)
     {
       print "Følgende brukere har samme brukernavn:\n";
       foreach $user (sort keys %sammeUser)
         {
            print "Brukernavn $user:\n$userInfo{$user}$sammeUser{$user}\n";
         }
     }
if(%sammeUid)
     {
       print "Følgende brukere har samme userID:\n";
       foreach $uid (sort keys %sammeUid)
         {
           print "Uid $uid:\n$uidInfo{$uid}$sammeUid{$uid}\n";
         }
     }



haugerud 2008-05-19