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 COMMANDO
Let op! Bash zoekt nooit in de huidige directory!
Wijzigen het gedrag van het commando
-a -b -c
-abc
--foo --bar
Let 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 *.class
set -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 /tmp
cp /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.txt
nano bestand.txt
touch 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!echo
System.in
System.out
System.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 bash
Wat is het verschil?
printf
printf
is beter dan echo
printf()
method in Java!bash -n script.sh
shellcheck script.sh
printf
)bash -x script.sh
set -x
en set +x
Begin 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_bar
FOO_BAR
useradd
, usermod
, userdel
groupadd
, groupmod
, groupdel
who
, 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
cd
permissies instellen met chmod
, symbolische notatie
chmod MODUS FILE
chmod u+r FILE
g-w
o=x
a
Voorbeelden:
chmod g+rw bestand
chmod +x bestand
chmod u+rw,g+r,o-rw bestand
chmod 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 script
chmod 600 file
chmod 644 file
chmod 775 dir
root
negeert bestandspermissies (mag alles), vb. /etc/shadow
stat -c %a BESTAND
umask
umask
bepaalt permissies van bestand/directory bij aanmakenumask
zonder optiesumask
umask 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+s
g+s
+t
Merk 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)test
test
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.conf
Wat 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 1049sec
lo
(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_log
error_log
$ sudo systemctl start mariadb
$ sudo systemctl enable mariadb
$ sudo systemctl start httpd
$ sudo systemctl enable httpd
start
: nu opstartenenable
: automatisch opstarten bij booten/var/www/html/info.php
Voorbeeld voor Apache:
ip a
ping 192.168.56.101
ping 192.168.56.1
Controleer 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 --reload
Probeer opnieuw de website te bekijken vanaf het fysieke systeem
Hou je wachtwoorden goed bij!
wordpress
localhost
$ 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.php
In /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 exit
Wat 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