Linux

1.1 Introductie

Wat gaan we leren?

Opdracht

  1. Wat is een Operating Systeem?
  2. Zoek uit wat het verschil is tussen Unix en Linux. Leg het uit.
  3. Noem drie Linux distributies.
  4. Hoe oud zijn elk van de genoemde Linux distributions (schrijf jaar op)?
  5. Noem van elk van de genoemde Linux distributions een voordeel op.
  6. Je kunt drie soorten Operating Systems ondersheiden: Unix, Linux en Windows. Schrijf van elk van deze Operating Systems een voordeel en één nadeel op.
  7. Waarom zou je als Web Developer wat van Linux moeten weten?
  8. Wat kun je verdienen als Linux beheerder (zoek naar een vacature)?
  9. Wat wil jij leren in de Linux lessen?

Download template met vragen, vul die in en upload dit in Teams

 

 

 

1.2 Ubuntu (onder VMWare)

Installatie Ubuntu Server

Let op dit proces duurt erg lang. Tijdens de installatie worden alle security updates gedownload en geïnstalleerd. Tijdens dit proces kun je de installatie gewoon laten door draaien en andere dingen doen.

Onder VMWare Workstation player 15 installeren we Ubuntu Server 18.x.x

Installatie MobaXTerm

Start MobaXTerm op.

Aanmaken gebruiker op Ubuntu WS

(dit hoeft alleen als je tijdens de installatie geen gebruiker hebt aangemaakt)

Maak een gebruiker aan op je Ubuntu Server.

Je wilt niet onder root aanloggen, omdat dat onveilig is. Je wilt dus een 'gewone user' aanmaken.

Op he Ubuntu server waar je nu nog onder root bent aangelogd type je:

adduser username

Vervang username door jouw username. Let op in een Linux username zijn geen spaties en degelijke toegestaan.

Om ervoor te zorgen dat je administratieve rechten (root) hebt voer je het volgende commando uit:

usermod -aG sudo username

Vervang ook hier de username door jouw gekozen naam.

Log nu uit. met exit en probeer via MobaXterm opnieuw aan te loggen onder jouw nieuw user account.

Probleem met connecten

Stap 1

Als je met MobaXterm gen verbinding kunt maken, maar je kunt met een Windows cmd-box wel pingen naar het IP nummer van je Ubuntu sever dan kun je met het volgende commando dit waarschijnlijk oplossen. Dit moet je uitvoeren op je Ubuntu WS binnen VM Ware.

sudo apt-get install openssh-server

Dit installeert open SSH server.

Stap 2

Kun je vanuit de windows command box het IP nummer van je Ubuntu Server pingen? Open hiervoor een cmd box en type het commando ping 0.0.0.0 in. Vervang hierbij 0.0.0.0 met het ip nummer van jouw Ubuntu Server.

Als dit niet lukt dan helpt het soms om je Windows machine te re-booten (herstarten).

Mac

Werk je op een Mac dan heb je een paar extra uitdagingen.

VMWare werkt niet op een Mac, kies in plaats daarvan VirtualBox (6.x) van Oracle.

MobaXterm werkt ook niet op een Mac, maar de terminal applicatie op een Mac voldoet ook. Er zijn enkele verschillen en die hebben vooral te maken met het opzetten van SSH keys. Dit heeft te maken met security en komt pas later in deze lessenserie aan de orde.

Na de installatie van Ubuntu binnen VirtualBox niet vergeten de VM uit te zetten en opnieuw op te starten.

Clean disk space

https://itsfoss.com/free-up-space-ubuntu-linux/

# This option removes libs and packages that were installed automatically to satisfy the dependencies of an installed package.
sudo apt-get autoremove

# APT package management system keeps a cache of DEB packages in /var/cache/apt/archives.
sudo du -sh /var/cache/apt
sudo apt-get autoclean
sudo du -sh /var/cache/apt

# or clean cache completely: sudo apt-get clean

# Clean log files older than 30 days 
journalctl --disk-usage
sudo journalctl --vacuum-time=30d
journalctl --disk-usage

# clean up snap packages (2 versions are kept and these packages tend to be large).
du -h /var/lib/snapd/snaps
set -eu
snap list --all | awk '/disabled/{print $1, $3}' |
    while read snapname revision; do
        snap remove "$snapname" --revision="$revision"
    done
 du -h /var/lib/snapd/snaps   

Update Ubuntu System

sudo apt-get update
sudo apt-get upgrade
sudo reboot


--

2.1 CLI and text file handling

Command Line Interface

In deze les gaan we voor het eerst kennis maken met de command line. We bespreken wat commando's en gaan daarmee oefenen. Het doel van deze les is een kennismaking met de command line.

CLI is de command line interface van LInux.
Linux bestaat eigenlijk uit de CLI en optioneel zit daarbij een grafische gebruikers interface (GUI). Linux Servers die in datacenters staan zijn vaak headless. Dat betekent dat er geen monitor en toetsenbord is aangesloten op de server. Vaak bestaat één fysieke server ook meerdere virtuele servers. ALs je zelf zo'n server wilt dan moet je zoeken naar VPS, dat staat voor Virtual Personal Server. Een VPS met Linux is erg goedkoop omdat het OS gratis is. Ook is de performance vaak zeer redelijk tot goed. Deze website draait ook op een VPS van een paar euro per maand en samen met deze website draaien er nog een paar websites op dezelfde Virtual Server. Er draaien meerdere virtuele (web) hosts op één virtuele server. Wat een virtual web host is leren we over een paar lessen.

Headless

In data centers staan dus veel headless Linux servers.

Op zich kan er wel een GUI worden toegevoegd, maar dit wordt vaak als omslachtig en traag gezien. Bovendien hebben echte 'hackers' een voorkeur voor een CLI. Je zult leren dat de CLI van Linux erg rijk is en dat je hele gave dingen met een paar commando's kan uitvoeren. Binnen Linux kun je ook vrij eenvoudig zaken automatiseren. Een goede Linux systeembeheerder automatiseert dus als zijn taken en hoeft daarna alleen nog maar updates uit te voeren en te monitoren dat alles goed gaat.

Linux en tekst bestanden (text files)

Linux heeft veel configuratie in plain text files staan. Daarom zijn er veel commando's die iets met files doen.

In de Linux lessen gaan we af en toe een paar handige Linux CLI commando's behandelen.

Om te beginnen gaan we samen in de les naar de volgende commando's kijken. In deze les een paar handige commando's die te maken hebben met files.

Belangrijke commando's voor file handling
commando wat doet het? voorbeeld
man laat een help pagina van een commando zien man cat
cat laat de inhoud van één of meerdere files zien cat /var/og/syslog
grep zoekt in een file naar een woord grep error /var/log/syslog
head laat de eerste regels van een file zien

head /var/log/syslog

tail laat de laatste regels van een file zien

tail /var/log/syslog

touch maak een legel file

touch test

echo print iets

echo "Hallo"

cp CoPy - kopieer een file

cp file01 file02

mv MoVe - verplaats/hernoem een file

mv file01 file02

rm ReMove - verwijder een file

rm file01

Belangrijk: Linux is case senstive!

Redirect output

Linux heeft een paar handige concepten. Zo kan je de output die naar het scherm gaat omleiden naar een file. Dat heet redirect output.

Neem bijvoorbeeld het commando head /var/log/syslog Dat laat de eerst paar regels van de Linux log zien. Je kunt deze output naar een file wegschrijven. Bijvoorbeeld head /var/log/syslog > mijnTestFile

Het > teken schrijft dus de output van een commando naar een file. Het >> teken voegt de output van een commando toe aan de file.

Voer de volgende commando's uit en probeer te begrijpen wat er gebeurt en waarom.

echo 0123456789 > file01
cat file01 file01 > file02
cat file02
cp file02 file01
cat file01 >> file02
ll
cat file02

Haal alle files weg: rm file01 file02

Commando's aan elkaar rijgen

In Unix/Linux kun je commando's aan elkaar rijgen, dat kan super handig zijn en we komen daar nog in detail op terug, maar kijk eens naar het volgende voorbeeld:

cat /etc/passwd | cut -d ":" -f1 | sort

Wat hier staat is het volgende. Laat de inhoud van de file /etc/passwd zien en gebruik de output als input foor het commando cut. Het commando cut haalt de eerste kolom uit de input en deze output wordt weer gebruikt voor de input van het sort commando. Deze sorteert de output en stuurt de output naar het scherm

Je kunt natuurlijk de output ook naar een file sturen zoals we in het vorige hoofdstuk hebben geleerd.

cat /etc/passwd | cut -d ":" -f1 | sort > user_names.txt

Het commando is nu uitgebreid met > user_names.txt en dat zorgt ervoor dat de output niet naar het scherm gaat, maar naar een file.

Opdrachten

Zorg ervoor dat je VM met Ubuntu Server draait en log aan onder jouw eigen gemaakte user met MobaXterm.

  1. Ubuntu WS heeft een soort notepad/kladblok.
    Met de editor nano kan je iets in de file zetten of veranderen. Open een nieuwe file met nano file01.txt
    Zet jouw naam in de file en bewaar (save) de file.

    Zoek uit de lijst hierboven met welk commando je de inhoud van de file kunt afdrukken, probeer of het werkt en zet het commando op je antwoordenblad.

  2. Voer de onderstaande stappen uit en schrijf op wat de uitkomst van stap 4 is.  Je ziet drie getallen, beschrijf wat deze getallen betekenen.
    1. Maak met het touch commando een file aan en noem die file.txt
    2. Gebruik het echo commando om Hello world this is nice! in de file.txt te plaatsen
    3. Gebruik de geleerde kennis om de tekst Hello world this is nice! vier keer onder elkaar in de file.txt te krijgen.
    4. Voer het commando wc file.txt uit. Wat zie je en wat betekent dat? Als je niet zeker bent, controleer dan met man wc hoe wc precies werkt.
  3. Zoek op hoe je met het commando tail de laatst 20 regels moet afdrukken. Druk de laatste 20 regels van /var/log/syslog af en plaatst die in een file laatst20.txt.
    Voer het commando cat laatste20.txt laatste20.txt laatste20.txt > laatste.txt uit.
    Hoeveel regels staat er in laatste.txt? Schrijf op hoe je dit hebt gedaan en schrijf je antwoord op.

  4. Als ubuntu is opgestart dan wordt er een regel in de /var/log/syslog gelplaatst, bijvoorbeeld;
    Jan 12 21:27:40 ubuntu_vm systemd[1121]: Startup finished in 102ms.
    Gebruik grep en zoek uit hoe lang jouw Ubuntu er de laatste keer over deed om te starten. Schrijf het commando dat je hebt gebruikt op.

  5. Laat alleen alle regels uit de syslog file zien van vandaag. Schrijf het commando dat je hebt gebruikt op.

  6. Begin met een file01 en zet daar text in. Het commando cat file01 > file01 doet iets vreemds; de file01 is leeg, leg uit waarom.

  7. Met het commando sudo apt-get install sl installeren we een programmaatje. Omdat we iets selecteren moeten we 'elevated rights' krijgen. Dat is een mooie manier om te zeggen dat we root toegang moeten hebben. Sudo staat voor "Super User DO". In een vervolg les gaan we hier nog verder op in. Installeer het programmaatje en start het op.

    Vraag: Kan je de stoomlocomotief ook laten vliegen? Ja, hoe dan - en hoe ben je hier achter gekomen?

    Met sudo apt-get remove sl kunnen we het programmaatje weer verwijderen.

  8. Kijk naar het volgende commando en test het uit.

    cat /var/log/syslog | wc | awk '{print $1}'

    Het commando is aan elkaar geregen, je kunt er stapjes afhalen om te kijken wat de vorige stapjes deden.
    Omschrijf kort op je antwoordenblad wat commando laat zien.

  9. Met ifconfig konden we ons ipnummer vinden weet je nog? Probeer maar.

    Alle ipnummers in onze VM's beginnen met 192. Met grep 192 kun je dus de juiste regel vinden.
    Rijg de twee commando's aan elkaar, zodat je in één keer de regel met het juiste ipnummer vind.
    Schrijf het commando op dat je hebt gebruikt.

  10. Het volgende commando kan ook korter.

    cat /var/log/syslog | tail

    Hoe doe je hetzelfde, maar dan met minder commando's? Schrijf he verkorte antwoord op.

  11. Maak een file met het commando echo test > test.txt

    Je wilt de file kopiëren en je typt in:
    mv test.txt test-bak.txt

    Helaas is dat niet goed gegaan want je wilde de file kopiëren en je hebt een verkeerd commando gebruikt. Kijk met ls -la welk(e) files je nu hebt.

    Met welk commando corrigeer je dit en zorg je ervoor dat je alsnog een kopie hebt?

  12. Maak drie files, file01.txt, file02.txt en file03.txt en zet in alle drie de files de volgende regel tekst: "Dit is een test bestand!". Voer het commando cat file01.txt file02.txt >> file03.txt uit.

    (1) Hoeveel keer staat de test-regel nu in het bestand file03.txt ?

    Voer nu het commando cat file01.txt file02.txt > file03.txt uit.

    (2) Hoeveel keer staat nu de test-regel in het bestand file03.txt ?

    Leg uit waarom het tweede geval minder test-regels laat zien dan het eerste geval.

--

 

 

3.1 Directories

File systeem

Het unix file systeem is een hiërarchisch systeem, net als bij Windows. Dat betekent dat er ergens een begin is; onder windows is dat (bijna altijd) c:\ en onder Linux is dat /

Uitleg:

Directory Commando's

commando wat doet het? voorbeeld
ls Laat directory zien ls
ll Laat directory (long format) zien ll (is alias van ls -la)
mkdir MaKe DIRectory - Maak een directory mkdir test
rmdir ReMove DIRectory - Verwijder directory rmdir test (moet wel leeg zijn)
cd Ga naar directory cd test
cd .. Ga naar de vorige directory  
cd . Ga naar deze directory

onzinnig commando

cd ~ Ga naar jouw home directory

 

pwd Print Working Directory

Laat zien waar je 'bent'.

File Commando's (herhaling)

commando wat doet het? voorbeeld
cat Laat inhoud van een file zien cat file01.txt
touch Maak een nieuwe lege file touch file01.txt
cp Kopier een file cp file01.txt file02.txt
rm Delete (remove) file rm file01.txt
nano "Simple" text editor nano file01.txt

Opdracht 1

max@ubuntu_vm:~/test$ ll
total 12
drwxrwxr-x 2 max max 4096 Jan 23 10:47 ./
drwxr-xr-x 7 max max 4096 Jan 23 10:46 ../
-rw-r--r-- 1 max max 1552 Jan 23 10:47 passwd
max@ubuntu_vm:~/test$

Opdracht 2

De gehele structuur ziet er dan als volgt uit

home directory directory files/directory
~ opdracht2 opdracht21 file01, file02, file03 (files)
    opdracht22 opdracht31 (directory)

Ga terug naar jou home directory en voer het volgende comamndo uit:

ls -R opdracht2

Zet de output op je antwoordenblad.

Opdracht 3 - vragen

a) Als je ls -la uitvoert dan zie je files en directory's. Hoe kun je zien wat een file is en wat een directory is?

b) Wat gebeurt er als je cd ../.. uitvoert?

c) Wat is een absoluut path in Linux?

--

 

3.2 File and Directory permissions

Voor deze les moet je weten hoe je door directory's kunt navigeren en hoe je een file kunt aanmaken en kan editen. Als je nei tweet hoe dat werkt dan moet je eerst terug naar de vorige les.

In deze les gaan we een wat lastigere onderwerp behandelen, rechten binnen Linux.

In de opgaven gaan we zelf oefenen. Veel opgaven worden in de filmpjes voorgedaan.

Inleiding

Het Unix file systeem is een hiërarchisch systeem, net als bij Windows. Dat betekent dat er ergens een begin is; onder windows is dat (bijna altijd) c:\ en onder Linux is dat /

Rechten worden gegeven op directory's of files. Elke file of directory heeft een eigenaar/user en een groep/group. Er zijn drie soorten rechten Read, Write en eXecute. Deze drie rechten kunnen aan de user, group of aan iedereen (other) worden gegeven.

Owner en Group

FIles en directories hebben een owner (ook wel user) en een group. De owner is meestal degene die de file heeft aangemaakt. De rechten van de owner en de group kunnen apart worden ingesteld.

RWX - Read, Write en Execute

We kennen drie soorten rechten: Read, Write en eXecute (RWX). Read is voor lezen, write voor aanpassen/schrijven en execute betekent dat je een file mag uitvoeren. Voor een directory betekent de execute dat je naar de directory toe mag gaan.

ls -l

Als je een ls -l doet dan zie je bijvoorbeeld

drwxrwxr-x  17 max    apache 4096 Nov 27 22:03 www

De drwxrwxrwx geven de file permissions (rechten) aan, daarover later meer). De 17 geeft het aantal links aan, dit is voor nu niet belangrijk. 'max' is de owner, ook wel user van de file. apache is de group waartoe de file behoort. 4096 is het aantal bytes dat de file in beslag neemt (dat is niet helemaal hetzelfde als de grootte van de file), dan volgt de 'last modification date' en als laatste zie je de file name.

De owner kan bijvoorbeeld Read and Write-rechten hebben en leden van de group kunnen bijvoorbeeld alleen Read-rechten hebben. Je kunt tenslotte ook nog de rechten van 'iedereen' (other) instellen, dat zijn alle gebruikers die niet de owner zijn en niet in in de group zitten.

Image result for linux owner and group

Voor elke file en directory staan 10 letters, we kijken naar de laatste 9. Dit zijn 3 groepjes van 3; rwx, rwx en rwx. De eerste rwx staat voor de owner/user van de file, de tweede voor de group en de laatste voor others.

Stel je ziet dit als je een ls -l uitvoert:

-rw-r--r--  1 root root         52 Jan 11 18:18 subuid

Dat betekent dat de file subuid van root is (owner/user) en dat die ook aan de group root toebehoort. De owner root heeft Read en Write rechten en de groep heeft alleen read rechten. Ten slotten hebben others ook read rechten.

File permissies instellen

Met het commando chmod (CHange file MODe bits) kunnen de rechten worden ingesteld van de User, Group en Others. Stel je wilt de rechten instellen van de User en de Group dan gebruik je UG. Stel, je wilt de rechten instellen van de User, Group en Others dan gebruik he UGO.

Dan kun je rechten toevoegen of afnemen, dat doe je met een + of een -.

Je kunt ook rechten instellen dat doe je met een =

Vervolgens kun je read, write en execute rechten toekennen of afnemen. Read en write toevoegen doe je met +rx. Afnemen van alle rechten doe je met -rwx.

Het zetten van bijvoorbeeld alleen lees rechten doe je met =r

Voorbeelden chmod
Afnemen van read rechten van others voor file_a chmod o-r file_a
Toevoegen van read en write rechten aan user en group voor alle files in deze dierctory chmod ug+rw *
Toevoegen van alle rechten aan iedereen voor alle files in deze directory en alles 'hieronder' chmod -R ugo+rwx
Instellen van alleen leesrechten voor de group op alle files in deze directory chmod g=r *

Recursief

In het laatste commando is de flag -R toegevoegd. Dit betekent recursief en dat betekent dat alle files en alle directory's worden veranderd. Directory's in directory's worden ook veranderd, ook de directory's in de directory's in de directory's, etc. worden veranderd.

FIle permissies instellen - octaal

In plaats van rechten toekennen in meerdere stappen kan je dat ook in één doen. De r is 4, de w is 2 en de x is 1. Dus als je rw- wilt instellen dan gebruik je het 4+2=6. Als je r-x wilt instellen gebruik je 4+1=5. Dat doe je dan drie keer voor de user, de group en others. rwx wordt 4+2+1=7 Als we dus de user, group en others allemaal +rwx willen geven dan kan dat met een chmod 777.

Read 4
Write 2
Execute 1

Het getal dat je gebruikt is een getal in het 8-tallig stelsel, we noemen dat het octale stelsel.

https://i.redd.it/vkxuqbatopk21.png

r=4, w=2 en x=1. Dus rwx=4+2+1=7

Nog meer voorbeelden
geef alleen alle rechten op file01 aan owner

chmod u+rwx file01

chmod go-rwx file01

chmod 700 file01
geef owner, groep en others alle rechten

chmod ugo+rwx file01

chmod 777 file01
geef alleen de owner en de groep leesrechten op file01

chmod ug+r file01

chmod ug-wx file01

chmod o-rwx file01

chmod 440 file01

User en groups aanpassen

Met chown kun je de user/owner aanpassen en met chgrp kun je de group aanpassen.

chown CHange Owner
chgrp CHange GRoup
chown voorbeelden
maak root owner van file file01 chown root ./file01
maak apache owner van alle file in /var/www chown -R apache /var/www -R is recursief
van de file01 maar root owner en voeg de group root ook toe chown root:root ./file01

In het laatste voorbeeld zie je dat je de user en group ook in één keer kunt aanpassen.

chgrp voorbeeld
Geeft de group root rechten op file02 chgrp root ./file02

Opdracht 1

-rw-r----- 1 max max    0 Jan 11 19:45 file01
-rw-r----- 1 max max    0 Jan 23 08:11 file02
-rw-r----- 1 max max    0 Jan 23 08:11 file03

Schrijf de commando's die je hebt gebruikt op.

-rw-r----- 1 max root    0 Jan 11 19:45 file01
-rw-r----- 1 max root    0 Jan 23 08:11 file02
-rw-r----- 1 max root    0 Jan 23 08:11 file03

Schrijf de commando's die je hebt gebruikt op.

drwxrwxrwx 2 max  max   4096 Jan 23 08:11 test01/

Schrijf het commando dat je hebt gebruikt op.

Opdracht 2

Voor deze opdracht moet je de les hebben gelezen en ik raad ook aan om het volgende filmpje te bekijken. Veel antwoorden zijn te vinden in de uitleg in het filmpje.

Ga naar jouw home directory en maak de file struct.txt en zet daar het volgende in.

(Tip: je kunt nano gebruiken om de inhoud van de file struct.txt te wijzigen)

shared
shared/projects/01
shared/projects/02
shared/projects/03
shared/series
shared/movies
shared/movies/action

Voer nu het volgende commando uit:

sed '/^$/d;s/ /\//g' struct.txt | xargs mkdir -p

Magic! Je hebt nu een directory structuur die begint in de folder shared en die de structuur heeft zoals je in de file struct.txt hebt opgegeven. Hoe dit werkt precies werkt, voert nu te ver. We gaan de nieuwe directory structuur wel gebruiken om de volgende opgaven te maken.

a) verander de group van alle directory's die in shared staan inclusief shared in adm.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

b) verander de rechten van alle directory's vanaf shared (inclusief shared) naar alleen lezen voor de group.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

c) verander de rechten van alleen de directory shared zodat de group ook schrijfrechten (write) heeft.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

d) verander de rechten van alle directory's die in shared staan inclusief shared zodat de group alleen execute rechten heeft.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

e) verander de rechten van de directory shared zodat iedereen user, group en owner alleen lees- en schrijfrechten (rw) hebben.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

f) ga met cd shared naar shared, wat gebeurt er? Waarom heb je geen toegang?

g) verander de rechten van de directory shared zodat iedereen user, group en owner alle rechten heeft (rwx) heeft.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

h) met het commando rm kan je alle directory's weer verwijderen. Maak gebruik van de man pagina's en zoek uit hoe je de directory shared inclusief alle sub directory's kan verwijderen.
Schrijf het commando dat je hebt gebruikt op je antwoordenblad.

Opdracht 3

Maak een file execute.sh en zet daar het volgende in.

echo "Dit is een test"

Voer dit commando uit.

Wat heb je moeten doen om deze file te kunnen uitvoeren?

Schrijf het antwoord (het commando dat je moest gebruiken om deze file te kunnen uitvoeren) op je antwoordblad op.

--



4.1 sudo en root

Bij het zetten van rechten op files kan het zo zijn dat je jezelf buitensluit. Stel je hebt alle rechten op een file en je doet

chmod 400 file

Je geeft alleen de user/owner read rechten en je kan de file dus niet meer aanpassen. Dat betekent dat je ook de rechten niet meer kunt aanpassen. Hoe kun je dit nu oplossen?

Je kunt uitloggen en als root (super user) aan loggen en de rechten aanpassen. De root mag immers altijd alles. Maar dat heeft een paar nadelen; het is omslachtig, kost veel tijd en uiteindelijk zouden we dan gewoon alles onder root doen en nooit meer als 'gewone' user aanloggen.  Er is dus een ander manier. Door voor een commando sudo in te typen, wordt het commando als root uitgevoerd. 'sudo' staat voor Superuser Do. Dus als we de rechten niet meer kunnen aanpassen dan kunnen we met het commando

sudo chmod 660 file

de user en de group read en write rechten geven.

Niet iedereen mag zomaar sudo gebruiken. Daarvoor moet jij (jouw gerbuik) toestemming hebben. Dit configeer je in de /etc/sudoers file. Kijk maar eens naar deze file cat /etc/sudoers laat de file zien.

Bij somigen distributues van Linux, zoals CentOS, wordt er bij installatie alleen de user root aangemaakt. je moet dan aanloggen als root, een gebruiker aanmaken en deze gebruiker in de sudoers file zetten. Dat is de enige keer dat je root nodig hebt, daarna zou je omwille van veiligheid het root wachtwoord moeten veranderen en goed moeten opbergen.

Als je het sudo commando gebruikt moet je wel je eigen wachtwoord nog een keer opgeven. Dit voor de veiligheid. In grote organisaties is het heel gebruikelijk dat het root wachtwoord voor (bijna) iedereen geheim is. Het wachtwoord is bijvoorbeeld 32 willekeurige karakters lang en ligt ergens in een kluis. Iedereen die root nodig heeft kan dat via sudo. Dit heeft ook als voordeel dat je via logfiles kunt zien wie een commando heeft uitgevoerd. Als alle beheerders als root zouden inliggen dan weet je immers niet meer wie wat heeft gedaan.

Je kunt met sudo niet alleen iets als root uitvoeren; je kunt iets uitvoeren als elke willekeurige andere user. Dit gaat met sudo -u <user>

Opdracht

De volgende opdracht op regel 1 werkt niet. Pas de regel aan en zorg ervoor dat het werkt. Voer daarna het commando op regel 2 uit. De-installeer daarna het programma.

apt-get install xcowsay
xcowsay I Love nix

--

 

4.2 Apache installeren

In deze les gaan we Apache installeren, gaan we onze hosts file op windows aanpassen en gaan we leren wat een virtual host is.

Package manager

Een package manager is een tool die ervoor zorgt dat je software kunt installeren en weer kunt verwijderen. Je zou het een installer kunnen noemen. Als je onder Linux software installeert dan zijn er zogenaamde depedencies (afhankelijkheden). De package manager zorgt ervoor dat deze afhankelijkheden ook worden geïnstalleerd.

Elke Linux distributie heeft zijn eigen package manager. Ubunu gebruikt apt

De meest gebruikte commando's

apt list laat alle geinstalleerde packages zien
sudo apt update update lijst met packages
sudo apt upgrade upgrade alle packages (dit moet je regelmatig draaien)
sudo apt install nano installeer het package nano (dit is een 'eenvoudige'editor)
sudo apt remove nano verwijderd de package nano

Installatie van Apache

We gaan nu Apache installeren op onze Linux server.

sudo apt update
sudo apt install apache2

Weet je nog wat je ipnummer van de Ubunt server is? Controleer dat anders nog een keer met ifconfig

Ga naar de browser en typ het ipnummer in - als het goed is, zie je de standaard Apache2 pagina.

Opdracht

Zoek zelf op internet op hoe je de Apache webserver op Ubuntu stop en start. Controleer of het werkt en schrijf deze commando's op.

Host file - windows

Een ipnummer intikken is niet zo handig en moeilijk te onthouden. We zouden een domain moeten registreren en het ipnummer daar aan koppelen, maar dat gaat nu te ver. Bovendien heeft jouw Ubuntu server geen publiek ip address; het heeft een privat ip address dat alleen op jouw netwerk beschikbaar is.

Binnen ons netwerk zouden we op een lokale DNS (Domain Name Server) een naam kunnen registreren. Op onze windows machine kunnen we ook de host file gebruiken. Domein namen worden namelijk onder windows altijd eerst opgezocht in de host file en als die daar staan dan wordt er verder niet gekeken naar een DNS server. We kunnen dus via de hosts file onze eigen naam registreren. We moeten de hosts file wel onder admistrative privileges openen. Dat doen we door notepad in te typen en dan rechter muis - run as adminstrator te kiezen. We hebben nu notepad geopend als adminstrator (in Lunx termen als root).

Ga nu naar c:\windows\system32\drivers\etc\  laat alle files (*.*) zien en open hosts.

In deze video wordt nog eens uitgelegd hoe je je host file kan aanpassen en wat dat precies doet:

Voeg deze regel toe (ip nummer is voorbeeld):

192.168.153.134	ubuntu.local

Save de hosts file en ga dan naar je browser en ga naar ubuntu.local. Je ziet nu je Linux Apache web server standaard pagina.

Virtual host

Binnen een webserver worden vaak meerdere websites geserveerd. Als dat zo is hoe weet Apache dan welke web server er moet worden getoond? Dit gaat met behulp van virtuele hosts. Stel je hebt www.site1.com en www.site2.com. Via DNS zijn beide domeinnamen aan één ipnummer gekoppeld. Dat betekent dat als je één van de twee domain namen in de browser intypt, je naar dezelfde server wordt doorgestuurd. Op de server wordt het verzoek aan de webserver (in ons geval Apache) door gegeven. De webserver krijgt ook de naam via de browser en het is deze naam die de webserver gebruikt om te bepalen welke website moet worden getoond. Deze website heet een virtuele host. Het is namelijk geen echte host (dat is je webserver), maar een soort sub-host; een host in een host. We noemen dat dus de virtual host.

Een virtual host wordt aangemaakt met behulp van een text file. Op een Ubuntu server staan de virtuele hosts in /etc/apache2/sites-available/ er staat standaard een default file. Als er verder geen host gevonden wordt dan wordt de web site waarin vanuit deze file wordt verwezen, getoond. In de file staat

DocumentRoot /var/www/html

Dit is dus de locatie (=document root) van de standaard website.

Via de windows hosts file hadden we ubuntu.local als naam gedefinieerd. Aan deze naam kunnen we nu een virtuele host hangen.

Je kunt dit niet kopiëren, maar als je naar dit filmpje kijkt dan leer je hoe je heel snel en foutloos iets kan kopiëren in Linux.

Je hebt nu kopie van de standaard/default virtuele host.

Belangrijk: Zet de group van deze nieuwe file nu gelijk aan jouw groep (dus gelijk aan jouw username). Zet daarna de rechten voor de groep op r en w.

Je kunt nu zonder sudo te gebruiken de file veranderen.

Verander nu deze twee regels regel 11 en 12 dus in de in de file.

ServerName      ubuntu.local
DocumentRoot    /var/www/ubuntu.local

Dus de regel ServerAdmin wordt vervangen door de ServerName en de DocumentRoot wordt veranderd.

Dit betekent dat als de server een website verzoek krijgt voor ubuntu.local, hij gaat zoeken in /var/www/ubuntu.local voor de web pagina's.

De virtuele host ubuntu.local heeft dus een eigen virtual host.

Dus we maken nu de directory /var/www/ubuntu.local aan

sudo mkdir /var/www/ubuntu.local/

verander de group van deze directory weer naar (jouw) user en voeg w(rite) permissie toe aan de group.

Maak een file index.html en zet daar het volgende in (zet op de plaats van de puntjes jouw naam).

<html>
<head>
  <title> Linux rocks! </title>
</head>
<body>
  <p> I'm running this website on the Ubuntu Server server of ......!
</body>
</html>

Om een site die je hebt gemaakt te enablen (=aanzetten):

sudo a2ensite ubuntu.local

a2ensite staat voor apache to (2) enable site.

Disable (uitzetten) van een site met

sudo a2dissite ubuntu.local

a2disablesite staat voor apache to (2) disable site.

En reload config files of restart web server.

sudo systemctl reload apache2 reload config files and keep running
sudo apache2ctl configtest check configuratie

Als het goed is hebben we nu een eerste virtuele host gemaakt.

Opdracht

Maak een tweede virtuele host, noem deze test.local en laat de volgende pagina zien (vul op de plaats van de puntjes jouw naam in):

<html>
<head>
  <title>Second virtual host van .....</title>
</head>
<body>
  <p> Test - virtuele host for test
</body>
</html>

Dus, als je naar je browser gaat en je typt in test.local dan moet de bovenstaande pagina worden getoond. De andere web site ubuntu.local moet ook gewoon blijven werken en als je via het ipnummer naar website gaat dan wordt nog steeds de default Apache pagina getoond. Je hebt dus in totaal drie virtuele hosts draaien.

Checklist

  1. Apache geinstalleerd?
    192.x.x.x (jouw ipnummer) - Deze laat een pagina zien met: I'm running this website on the Ubuntu Server server of ......!

  2. Laat zien hoe je jouw Apache webserver stopt en start.

  3. host file op Windows aangepast?
    ubuntu.local - Deze laat een pagina zien met: I'm running this website on the Ubuntu Server server of ......!

  4. virtual host aangemaakt?
    test.local - Deze laat een pagina zien "Test - virtuele host for test."

Remote Inleveren (beta)

Zorg ervoor dat de sites, 127.0.0.1, ubuntu.local en test.local werken. Je moet dus je VM hebben opgestart. Je moet daarnaast ook je XAMPP Apache hebben opgestart.

Stap 1

Op je VM of in MobaXterm ben je aangelogd op je Ubuntu server en je voert het volgende twee commando's uit:

 sudo touch /var/www/test.local/test.html; sudo chmod 777 /var/www/test.local/test.html
ls -lar /etc/apache2/sites* > /var/www/test.local/test.html ; ls -lar /var/www/* >> /var/www/test.local/test.html

Als je de rechten goed hebt gezet zoals beschreven in deze les dan moet dit commando werken (dus geen foutmelding geven). Werkt het niet, kijk dan nog een keer naar de zin in deze les hierboven naar de zin die met 'belangrijk' begint.

Stap 2

Download de file check.php die hier (links) naast de les staat:

Zet deze file in he document root van je Apache XAMPP server (meestal is dit de htdocs folder) en voer deze file uit. Dat doe je door in de browser te gaan naar http://127.0.0.1/check.php Het resultaat moet er zo uit zien in je browser:

Stap 3

In dezelfde folder/directory waar je check.php hebt neergezet, staat nu een file Huiswerk_Linux.txt. Zet deze file in Teams, bij deze huiswerkopdracht.

--

 

 

4.3 DNS en Virtual Hosts - Theorie

In deze les bespreken we wat DNS is, wat een host file is en waarom we dat nodig hebben bij het opzetten van een virtual host op Apache. In de vorige les heb je twee virtuele hosts opgezet en in deze les kijken we nog een keer terug wat we nu precies hebben gedaan.

DNS

Computers op het internet zijn verbonden via netwerken en om te weten welk netwerkpakketje naar welke computer moet worden verstuurd, worden IP adressen gebruikt.

Dit werkt hetzelfde als een telefoonnummer; om twee telefoons met elkaar te verbinden en iemand te kunnen bellen heb je zijn telefoonnummer nodig. Bij computers heb je in plaats van telefoonnummers, ip-adres nodig.

Elke computer die is verbonden met een netwerk heeft een IP-adres. Dit zijn nummers en die zijn lastig te onthouden. Daarom is er een soort "telefoonboek-systeem" waarbij een naam van een computer of een systeem kan worden omgezet naar een nummer. Dit systeem heet DNS. DNS staat voor Domain Name Server en het zorgt ervoor dat een naam van bijvoorbeeld een web site wordt opgezet naar een ip-adres.

Ook dit werkt weer hetzelfde als bij een telefoon. In plaats van een telefoonnummer ga je naar het adresboek en zoek je een naam. Je klikt op de naam en je telefoon belt het nummer dat aan de naam is gekoppeld. Je telefoonboek is het DNS systeem van jouw telefoon.

Host file

Op Linux en Windows heb je een host file. Dit is een gewoon ene text bestandje dat ergens op jouw disk staat. Op Linux staat deze file in de /etc directory en onder Windows staat deze file in de folder c:\windows\system32\drivers\etc\.

De host file is een soort DNS systeem dat alleen werkt vop de lokale computer; dat is dus de computer waar de host file op staat.

Stel je wilt naar ubuntu.local. Jouw eigen machine kijkt eerst of die een naam kan vinden in de host file. Als dat zo is dan gebruikt jouw machine het nummer zoals dat in de host file staat. Staat er niets in de host file dan wordt er pas aan DNS op het internet gevraagd of er een nummer bekend is.

Voor het opzoeken van het jsuite IP-adres wordt  eerst in de loklae host file gekeken  en dan pas wordt DNS geraadpleegt.

De host file ziet er eenvoudig uit, bijvoorbeeld:

127.0.0.1       localhost
127.0.0.1       mysite

De eerste regel staat bijna in elke host file. Deze regel is een mapping (=verbinding) van localhost naar 127.0.0.1.  Zoals je weet, wijst het ip-nummer 127.0.0.1 altijd naar 'zichzelf'. Dat is een afspraak. In dit voorbeeld is mysite ook gemapped op 127.0.0.1. Of je dus localhost of mysite intypt in de browser maakt dan niet uit, beide verwijzen naar 127.0.0.1.

Deze vragen en meer, worden in de onderstaande video beantwoord:

Virtual Host

In de meeste eenvoudige vorm staat elke website op zijn eigen server:

Voor de grote sites is dat ook zo. Het is voor grote sites zelfs zo dat er vaak meerdere servers worden gebruikt voor één sit:

Facebook draait op 30 000 servers (schatting 2019). Hoeveel servers er aan een website hangen hangt dus af van de hoeveelheid gebruikers.

Als je weinig gebruikers hebt dan kun je ook eenvoudig meerdere web sites op één server draaien:

In dit plaatje zie je drie sites die allemaal op één server draaien. Hoe doen we dat?

Allereerst moeten we ervoor zorgen dat alle drie de (domein)namen naar dezelfde server verwijzen. Laten we ervan uitgaan dat de server één IP-adres heeft. Dat betekent dat we de drie servers alle drie aan hetzelfde IP-adres koppelen.

Dat kan via DNS, maar als we moeten testen als developer is het goedkoper en sneller om deze drie domeinnamen via onze host file allemaal naar hetzelfde ip-adres te laten verwijzen. In het hoofdstuk hiervoor en in de film die daar bij hoort, wordt uitgelegd hoe dat werkt.

De server krijgt nu het verzoek om een pagina te tonen, maar hoe weet de server nu welke pagina hij moet tonen? Dat hangt af van de domeinnaam die wordt gebruikt. als je www.dreamer.com intypt dan moet de webserver een ander pagina laten zien dan wanneer je www.broken.com intypt.

 

De server ziet dus welk domein er wordt gevraagd en afhankelijk van dat domein worden de files in een andere document root op de harddisk van de webserver gebruikt. Weet je nog? De document root is de plaats waar de web pagina's (html files, php files e.d.) op de server staan.

Elk domein heeft dus zijn eigen document root. Deze worden geconfigureerd in Apache configuratie files. Onder Ubuntu staan deze files in /etc/apache2/sites-availble/

Door het koppelen van een site (domeinnaam) aan een eigen document root lijkt het alsof elke website zijn eigen webserver heeft. Dit heet een virtual host.

Elke vitual host wordt in Apache met een eigen virtual host file geconfigureerd. Je kunt 'oneindig' veel virtual hosts aanmaken. In een virtual host file kun je heel veel zaken configureren maar de hoofdzaak is om een mapping (=verbinding) te maken tussen de domeinnaam en de document root.

In zijn meest eenvoudige vorm ziet de virtual host configuratie file er als volgt uit:

ServerName      ubuntu.local
DocumentRoot    /var/www/ubuntu.local

In dit voorbeeld is er dus een mapping gemaakt tussen ubuntu.local en de document root /var/www/unbuntu.local De Apache server gaat dus kijken wat het gevraagde domein is. Is dit ubuntu.local dan zal de webserver de files die in /var/www/ubuntu.local/ staan gebruiken om de website te laten zien.

Troubleshoot DNS

Troubleshooten is er proberen achter te komen waarom iets niet werkt.

Om te controleren of je DNS of host file werkt hoef je niet een hele website op te zetten.

Onder Linux en Windows heb je een paar handige commando's:

nslookup

nslookup vps789715.ovh.net

Met nslookup kijk je of jouw systeem een de naam kan omzetten naar een ip-nummer. Of dat dan via DNS of de host file loopt, weet je niet. Om dat te bepalen zou je de host file tijdelijk even leeg kunnen maken en dan controleren of nog steeds hetzelfde ip-nummer wordt gevonden bij de naam.

ping

ping 84.116.46.23

Met ping 'kloppen' we aan bij de server. Als de server 'leeft' dan antwoord die op een ping. Het antwoord kun je terug zien op je console.

Zie je dit:

64 bytes from 84.116.46.23: icmp_seq=9 ttl=57 time=6.889 ms

dan zie je dat de server op ip-adres 84.116.46.23 binnen 6.9 millie seconden (0.006 seconden ) een antwoord heeft verstuurd. Je weet nu dat de server bestaat en 'aan' staat.

Zie je dit:

Request timeout for icmp_seq 0

dan reageert de server niet en zou het kunnen dat de server niet bestaat of uit staat.

Let op dat om beveiligingsredenen een server soms niet reageert op een ping.

Ping Tijden

Ping-tijden en afstanden hebben een relatie. De snelste ping time van Amsterdam naar London (±340 km) is ongeveer 15 ms (0.014 seconden). Amsterdam Sydney, Australië is ongeveer 280 ms. Ping-tijden zijnook afhankelijk van de snelheid van de server, de drukte op het netwerk, de snelheid van jouw lokale netwerk (WiFi), de kwaliteit van jouw verbinding (WiFi), etc. etc.

--

 

 

 

Install MySQL

Install mysql Database

sudo apt install mysql-server

Install MariaDB server (fork of MySQL).

sudo apt install mariadb-server

Install phpmyadmin

sudo apt install phpmyadmin

 

Mac/VirtualBox Screendumps

endlessh

endlessh ssh "protection"

// show listeners
sudo netstat -tulpn

//config
vi /etc/endlessh/config

// restart
sudo systemctl restart endlessh

// service
sudo vi /etc/systemd/system/endlessh.service

// bin
/etc/local/bin/endlessh

log in /var/log/syslog

Oct 28 21:29:58 vps789715 endlessh[109246]: 2020-10-28T20:29:58.165Z ACCEPT host=::ffff:82.217.135.153 port=63357 fd=4 n=1/4096
Oct 28 21:30:18 vps789715 endlessh[109246]: 2020-10-28T20:30:18.177Z CLOSE host=::ffff:82.217.135.153 port=63357 fd=4 time=20.012 bytes=14

Create User Linux and DB

Dit script wordt gebruikt om een of meer gebruikers aan te maken. Gebruiker wordt aangemaakt op Linux systeem en op de database. De gebruiker krijgt een database met de naam hetzelfde als de gebruikersnaam.

adduser.sh

#!/bin/bash
# Script to add a user to Linux system

DB_FILE=createDBUsers.tmp

addThisUser() {
if [ $(id -u) -eq 0 ]; then

        echo "" >> $DB_FILE

        if [ "$1" == "" ]; then
                read -p "Enter username : " username
        else
                username=$1
        fi
        if [ "$2" == "" ]; then
                read -s -p "Enter password : " password
        else
                password=$2
        fi

        egrep "^$username" /etc/passwd >/dev/null
        if [ $? -eq 0 ]; then
                echo "$username exists!"
                exit 1
        else
                U_HOME=/var/www/softwaredeveloper/$username
                U_GROUP=sftp
                U_SHELL=/bin/bash

                pass=$(perl -e 'print crypt($ARGV[0], "password")' $password)

                useradd -d $U_HOME -g $U_GROUP -m -s $U_SHELL -p $pass $username
                [ $? -eq 0 ] && echo "User $username has been added to system!" || echo "Failed to add a user!"

                chown $username $U_HOME
                echo "<?php echo \"welkom $username\"; ?>" > $U_HOME/index.php
                chown $username $U_HOME/index.php

                echo "" > $DB_FILE
                echo  "CREATE USER \`$username\`@\`%\` IDENTIFIED BY '$password';" >> $DB_FILE
                echo  "ALTER USER  \`$username\`@\`%\` REQUIRE NONE;" >> $DB_FILE
                echo  "CREATE DATABASE IF NOT EXISTS \`$username\`;" >> $DB_FILE
                echo  "GRANT ALL PRIVILEGES ON \`$username\`.* TO \`$username\`@\`%\`;" >> $DB_FILE


                if [ "$2" == "" ]; then
                        echo "Database not created (will only be done automatically is password is provided via command line"
                        echo "Create database with mysql < $DB_FILE"
                        echo "for batch creation uncomment line #mysql < $DB_FILE"
                else
                        mysql < $DB_FILE
                        echo "Database $username created"
                fi
        fi
else
        echo "Only root may add a user to the system"
        echo
        echo "Usage:"
        echo "sudo $0 u12345 password"
        exit 2
fi
}

# is parameter is file then read input from file <user> <password>
# else read two command line params
if test -f "$1"; then
        while IFS= read -r line
        do
                addThisUser $line
        done < $1
else
        addThisUser $1 $2
fi

Beschrijving sudo adduser.sh gebruiker password

In regel 11 en 16 wordt er gecontroleerd of de gebruikersnaam en wachtwoord als parameters zijn meegegven. Als dat niet het geval dan vraagt het script om een gebruikersnaam en/of wachtwoord.

Regel 22 controleert of de opgegeven gebruierk al bestaat.

Op regel 33 wordt de gebruiker aan het Linux systeem toegeovoegd, de waarden die daar boven staan worden gebruikt bij het aanmaken van een gebruiker.

Op regel 37 wordt een standaard index.php voor de gebruiker aangemaakt.

Op regel 40 en verder wordt een file gemaakt waarin SQL commando's worden geplaatst. De inhoud van de ze file moet na dit script nog zelf worden uitgevoerd.

Op regel 47 wordt gekeken of er een password is ingegeven als parameter als dat het geval is dan wordt de db user ook gemaakt.

Hiervoor moet mysql zo zijn geconfigureerd dat er een file vanuit de command line kan worden uitgevoerd.

Op regel 67 begint het scipt eigenlijk (alles daarvoor is een grote functie). Als parameter 1 een file is dan wordt er een file met gerbuikersnamen en wachtwoorden verewerkt en anders wordt de functie 'addThisUser' gewoon aangeroepen metdezelfde paramters alsdat dit scipt is aangeroepen.

--

Plesk

Automate creation of users

create virtual host and create Plesk user.

EMAILSERVER=mailserver.com
SERVER=webserver.com
IP=xxx.xxx.xxx.xxx
USER_ROLE=student

if [ "$1" == "" ]; then
        read -p "Enter username : " USERNAME
else
        USERNAME=$1
fi

if [ "$2" == "" ]; then
        read -s -p "Enter password : " PASSWORD
else
        PASSWORD=$2
fi


plesk bin subscription --create ${USERNAME}.${SERVER} -service-plan "Default Domain" -ip ${ip} -login ${USERNAME} -passwd "${PASSWORD}"
plesk bin user --create ${USERNAME}@${EMAILSERVER} -passwd ${PASSWORD} -cname ${USERNAME} -role ${USER_ROLE} -owner admin -subscription-name ${USERNAME}.${SERVER}

Delete Plesk user and virtual host

EMAILSERVER=mail.com
WEBSERVER=website.com

if [ "$1" == "" ]; then
        read -p "Enter username : " USERNAME
else
        USERNAME=$1
fi


plesk bin user --delete ${USERNAME}@${EMAILSERVER}
plesk bin subscription --remove ${USERNAME}.${WEBSERVER}