HoGent Bedrijf en Organisatie
2020-2021
Lectoren:
Ik ga sowieso geen systeem- en netwerkbeheer volgen, waarom moet ik me dan hier mee bezig houden?
… en je kan er gewoon niet meer omheen
Ik wil me specialiseren in Windows. Linux interesseert mij niet
The ’70’s called, they want their terminal back!
Van een sysadmin wordt zelfstandigheid verwacht
De werkwijze in deze cursus is een eerste stap in die richting!
q - man-page verlaten/ - zoeken binnen de paginan - ga naar volgende zoekresultaatN - ga naar vorige zoekresultaatpasswd(1), passwd(5)… die niet over een commando gaan:
- of --)Het eerste “woord” van een opdrachtregel moet een commando zijn
man builtins)${PATH}which COMMANDOLet op! Bash zoekt nooit in de huidige directory!
Wijzigen het gedrag van het commando
-a -b -c
-abc--foo --barLet op! Niet alle commando’s volgen de conventie! (bv find)
Vóór uitvoeren van een commando vervangt Bash bepaalde uitdrukkingen:
{1..10}, dir/{subdir1,subdir2,subdir3}
mkdir -p project/{src,lib,build}~ wordt vervangen door home-directory, vb. /home/student/
ls ~/.ssh${USER} -> student$(commando) wordt vervangen door uitvoer van commando
date=$(date)*, ?, [abc], enz.
rm *.classset -x toont resultaat van expansie (“debug mode”)set +x zet optie terug uitVoorbeeld:

///home/student, /tmp, /var/www/pwd)ls Documents, mkdir linux/ |
De “root directory” |
. |
De huidige directory (pwd) |
.. |
De bovenliggende directory |
~ |
Je “home-directory” (vb. /home/student) |
Opm. De “home directory” van de gebruiker “root” is /root
| Commando | Taak |
|---|---|
pwd |
Toon huidige directory |
ls |
Toon inhoud huidige directory |
cd |
Ga naar een andere directory |
mkdir |
Maak een subdirectory aan |
rmdir |
Verwijder een lege directory |
| Commando | Taak |
|---|---|
cat |
Toon inhoud van een bestand |
less |
Toon inhoud, per pagina (navigeer met pijltjes) |
touch |
Maak leeg bestand aan |
| (eigenlijk: pas datum laatste wijziging aan) | |
cp |
Kopieer bestanden |
mv |
Verplaats bestanden (of hernoemen!) |
rm |
Verwijder bestanden of directories |
Commando uitvoeren op meer dan 1 bestand?
cp a.txt b.doc c.jpg /tmpcp /media/usbstick/*.jpg ~/Pictures/| Patroon | Betekenis | Voorbeeld |
|---|---|---|
? |
Eén willekeurig teken | ls /bin/?? |
* |
Willekeurige string (ook leeg) | ls *.txt, ls a* |
[...] |
Elk teken opgesomd tussen [] |
ls /bin/[A+_]* |
[A-Z] |
Van A t/m Z | ls /bin/*[A-D1-3] |
[!...] |
Niet 1 v/d opgesomde tekens | ls /bin/[!a-z]* |
Globbing ≠ Reguliere expressies!!!
case statement in Bash scriptingGebruik nooit regex om bestanden te selecteren!
In dit soort gevallen is find overbodig:
vim bestand.txtnano bestand.txttouch bestand.txt| Taak | Commando |
|---|---|
| Normal mode -> insert mode | i |
| Insert mode -> normal mode | <Esc> |
| Opslaan | :w |
| Opslaan en afsluiten | :wq |
| Afsluiten zonder opslaan | :q! |
^X -> Ctrl+Xvgl. zip-bestand
tar cjf documents.tar.bz2 Documents/
tar xf documents.tar.bz2
tar = Tape ARchiveprintf 'Hallo wereld!\n'
printf 'Hallo %s!\n' "${USER}"
printf 'Het gebruikers-ID van %s is %d\n' "${USER}" "${UID}" printf() methode in Java!echoSystem.inSystem.outSystem.err
| Syntax | Betekenis |
|---|---|
cmd > file |
schrijf uitvoer van cmd weg naar file |
cmd >> file |
voeg toe aan einde van file |
cmd 2> file |
schrijf foutboodschappen van cmd weg naar file |
cmd < file |
gebruik inhoud van file als invoer voor cmd |
cmd1 | cmd2 |
gebruik uitvoer van cmd1 als invoer voor cmd2 |
cmd > file

cmd 2> file

Probeer het volgende eens!
$ sudo dnf install fortune cowsay lolcat figlet
$ echo ${USER} | figlet
$ fortune
$ fortune | cowsay
$ fortune | cowsay | lolcat
(Equivalent van System.err.printf())
Als je meer dan één lijn wil afdrukken:
Let op: geen spaties toegelaten vóór de eindemarkering
Dit kan bv. ook:
stdin of bestand,stdout| (pipe) om complexe bewerkingen op tekst toe te passen
| Commando | Doel |
|---|---|
awk |
Veelzijdige tool voor bewerken van tekst |
cat |
Druk inhoud bestand(en) af op stdout |
cut |
Selecteer “kolommen” uit tekstbestanden |
fmt |
Herformatteer tekst (bv. bepaald aantal kolommen) |
grep |
Zoek ahv reguliere expressies naar tekstpatronen in bestanden |
head |
Toon de eerste regels van een tekstbestand |
join |
Voeg twee tekstbestanden samen ahv een gemeenschappelijke kolom |
nl |
Voeg regelnummers toe aan een bestand |
| Commando | Doel |
|---|---|
paste |
Voeg twee tekstbestanden regel per regel samen |
sed |
Veelzijdige tool voor bewerken van tekst (Stream EDitor) |
sort |
Sorteer tekst |
tail |
Toon de laatste regels van een tekstbestand |
tr |
Zoek en vervang lettertekens in tekst |
uniq |
Verwijder dubbele rijen uit een gesorteerd tekstbestand |
wc |
Tel karakters, woorden of lijnen in een tekstbestand |
Wat tussen accolades staat wordt uitgevoerd op elke regel
Maak bestand aan (bv. script.sh) met een teksteditor, bv.
Maak bestand uitvoerbaar: chmod +x script.sh
Voer uit: ./script.sh
#! (# = hash; ! = bang)#! /usr/bin/python#! /usr/bin/ruby#! /usr/bin/env bash
${PATH} naar bashWat is het verschil?
printfprintf is beter dan echo
printf() method in Java!bash -n script.shshellcheck script.sh
printf)bash -x script.shset -x en set +xBegin elk script met:
Bash-variabelen zijn (meestal) strings.
variabele=waarde
=${variable}${var}
"${var}"
set -o nounset ⇒ script afbrekenEnkel binnen zelfde “shell”, niet binnen “subshells”
export:Conventie naamgeving:
foo_barFOO_BARuseradd, usermod, userdelgroupadd, groupmod, groupdelwho, groups, id/etc/passwd, /etc/shadow/etc/group, (/etc/gshadow, van weinig belang)/etc/passwd (group ID)/etc/group. Gebruiker staat niet vermeld in de primaire groep!primaire groep aanpassen
gebruiker toevoegen aan opgegeven groepen en verwijderen uit alle andere groepen
gebruiker toevoegen aan opgegeven groep, blijft lid van andere groepen
= toegangsrechten voor bestanden en directories
ls -l voor een overzichtInstelbaar op niveau van:
u: gebruiker, userg: groep, groupo: andere gebruikers, othersa: iedereen, allr: lezen, readw: schrijven, writex: execute
cdpermissies instellen met chmod, symbolische notatie
chmod MODUS FILE
chmod u+r FILE
g-w
o=x
a
Voorbeelden:
chmod g+rw bestandchmod +x bestandchmod u+rw,g+r,o-rw bestandchmod a=r bestand u g o
r w x r - x - - -
1 1 1 1 0 1 0 0 0
4+2+1 4+0+1 0+0+0
7 5 0
Voorbeelden:
chmod 755 scriptchmod 600 filechmod 644 filechmod 775 dirroot negeert bestandspermissies (mag alles), vb. /etc/shadowstat -c %a BESTANDumaskumask bepaalt permissies van bestand/directory bij aanmakenumask zonder optiesumaskumask 0027, wat worden de permissies?
file directory
0 6 6 6 0 7 7 7 basis
- 0 0 2 7 - 0 0 2 7 umask
--------- ---------
0 6 4 0 0 7 5 0 permissies
u+sg+s+tMerk op: root-rechten nodig
chown user file
chown user:group file
chgrp group file
Bij uitvoeren van script zijn opties en argumenten beschikbaar via variabelen, positionele parameters
| Variabele | Betekenis |
|---|---|
${0} |
Naam script |
${1}, ${2}, … |
Eerste, tweede, … argument |
${10} |
Tiende argument (accolades verplicht!) |
${*} |
Alle argumenten: ${1} ${2} ${3}... |
${@} |
Alle argumenten: "${1}" "${2}" "${3}"... |
${#} |
Aantal positionele parameters |
Het commando shift schuift positionele parameters op naar links:
${1} verdwijnt${2} wordt ${1}${3} wordt ${2}echo "$?"A-blok wordt uitgevoerd als exit-status van COMMANDO 0 is (geslaagd, TRUE)B-blok wordt uitgevoerd als exit-status van COMMANDO verschillend is van 0 (gefaald, FALSE)testtest is [
[ is een commando, geen “haakje” in de traditionele betekenis$(( ... )) is arithmetic expansion
Itereren over een lijst
“Klassieke” for-lus, komt slechts uitzonderlijk voor
while)for)Om Internettoegang mogelijk te maken zijn er 3 instellingen nodig:
ip address (ip a)ip route (ip r)cat /etc/resolv.confWat is mijn publiek IP-adres?
$ ip -4 a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
2: enp0s3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic noprefixroute enp0s3
valid_lft 74751sec preferred_lft 74751sec
3: enp0s8: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic noprefixroute enp0s8
valid_lft 1049sec preferred_lft 1049seclo (loopback): 127.0.0.1/8enp0s3 (VirtualBox NAT interface): 10.0.2.15/24enp0s8 (VirtualBox Host-only Adapter): 192.168.56.101/24enp0s8 of geen/verkeerd IP-adres op enp0s8?/etc/httpd/: configuratie Apache
/etc/httpd/conf/httpd.conf/etc/httpd/conf.d/*.conf/var/www/html/: Apache DocumentRoot/var/log/httpd/: logbestanden
access_logerror_log$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
$ sudo systemctl start httpd
$ sudo systemctl enable httpdstart: nu opstartenenable: automatisch opstarten bij booten/var/www/html/info.phpVoorbeeld voor Apache:
ip a
ping 192.168.56.101ping 192.168.56.1Controleer instellingen Host-Only Netwerkinterface VirtualBox.
$ sudo firewall-cmd --list-all # = toon firewall-regels
$ sudo firewall-cmd --add-service http --permanent
$ sudo firewall-cmd --add-service https --permanent
$ sudo firewall-cmd --reloadProbeer opnieuw de website te bekijken vanaf het fysieke systeem
Hou je wachtwoorden goed bij!
wordpresslocalhost$ mysql -uroot -pR2rrbLV02TA1hAjN mysql
...
MariaDB [mysql]> SHOW DATABASES;
MariaDB [mysql]> SELECT user,password from user;
MariaDB [mysql]> quit-uroot: inloggen als MariaDB-root-pR2rrbLV02TA1hAjN: gekozen wachtwoord
-p)mysql: inloggen op database mysql/usr/share/wordpress/: installatie Wordpress/etc/wordpress/wp-config.php: configuratie/etc/httpd/conf.d/wordpress.conf: Apache-configuratieIn /etc/httpd/conf.d/wordpress.conf:
Daarna: sudo sytemctl restart httpd
In /etc/wordpress/wp-config.php:
wp-config.phpIn /etc/wordpress/wp-config.php:
Informatie uitwisselen tussen script en omgeving:
stdin, stdout, stderr$1, $2, enz.Een functie gedraagt zich als een script!
functie_naam arg1 arg2 arg3${1}, ${2}, enz.return STATUS ipv exitWat is de uitvoer van dit script?
# Usage: copy_iso_to_usb ISO_FILE DEVICE
# Copy an ISO file to a USB device, showing progress with pv (pipe viewer)
# e.g. copy_iso_to_usb FedoraWorkstation.iso /dev/sdc
copy_iso_to_usb() {
local iso="${1}"
local destination="${2}"
local iso_size
iso_size=$(stat -c '%s' "${iso}")
printf "Copying %s (%'dB) to %s\n" \
"${iso}" "${iso_size}" "${destination}"
dd if="${iso}" \
| pv --size "${iso_size}" \
| sudo dd of="${destination}"
}set -o ...\ op het einde van een regel)Meer tips op: https://gitpitch.com/bertvv/presentation-clean-bash