Linux – Shell enzo… deel 7
Welkom bij het 7e deel van “Linux – Shell enzo”. Zoals in deel 6 gezegd laten we in deze post de kracht van de shell echt tot zijn recht komen. We hebben al veel zaken besproken en in deze post combineer ik een aantal besproken zaken met elkaar en leer ik een aantal nieuwe zaken. Linux – Shell enzo deel 7 is de laatste post in de serie als we kijken naar shell commando’s. In deel 8 gaan ver verder met scripting en deel 9 zal bestaan uit mijn persoonlijke top 10 Linuix commando’s. Ik heb er zin in dus laten we starten.
We beginnen deze post met CRON (Schedulled Tasks):
Cron
Cron is afkomstig van het woord “chronos” ofwel “tijd”. Cron is vergelijkbaar met de “scheduled tasks” in Windows. Met Cron kunnen we bepaalde zaken instellen op een specifieke tijd. Zo zouden we een bepaald script elke dag om 11:00 kunnen laten draaien. Of slechts 1x per maand. Cron is de algemene naam voor de service die geplande taken regelt. Hiervoor wordt de “crond” deamon gebruikt. Crontab is het programma dat gebruikt wordt om een lijst van tabellen te bewerken en installeren die gebruikt worden door de cron daemon (de feitelijke scheduled tasks). Elke gebruiker heeft zijn eigen crontab, en commando’s in een bepaalde crontab zullen worden uitgevoerd als de gebruiker die de crontab bezit / aangemaakt heeft. Cron wordt automatisch gestart vanaf /etc/init.d en doorzoekt het spool gebied (/var/spool/cron/crontabs) voor crontab-bestanden (die zijn vernoemd naar de gebruikersaccounts in /etc/passwd). De gevonden crontabs worden in het geheugen geladen. Crontabs in deze directory mogen niet rechtstreeks worden benaderd. Het crontab commando moet worden gebruikt om toegang te krijgen en om de crontabs te verwerken.
Om te kijken hoe we CRON gebruiken moeten we eerst weten wat het format is.
Ieder CRON commando begint met een tijdsaanduiding die er als volgt uitziet:
0 2 10 1 * |
Deze tijdsaanduiding staat voor (van links naar rechts):
-Minuut
-Uur
-Dag van de maand
-Maand
-Dag van de week
Bovenstaande tijdsaanduiding is dus:
-De 0ste minuut (heel uur)
-Om 2 uur
-De 10e dag van de maand
-De eerste maand
-Op elke week
Deze taak draait dus elke keer wanneer het 10 Januari is om 2:00. 5 sterretjes betekenen dus dat Cron de taak elke minuut uitvoert.
I.p.v. deze 5 cijfers kunnen we een aantal defaults gebruiken.
-@reboot
Draai eenmalig tijdens het opstarten
-@yearly & annually
Draai 1x per jaar (0 0 1 1 *)
-@monthly
Draai 1x per maand (0 0 1 * *)
-@weekly
Draai 1x per week (0 0 * * 0)
-@daily & @midnight
Draai 1x per dag (0 0 * * *)
-@hourly
Draai elk uur (0 * * * *)
Aan een Cron commando zitten verschillende regels waaronder:
- Enters (witte lijnen) worden genegeerd
- Spaties aan het begin worden genegeerd
- Tabs aan het begin worden genegeerd
- Regels die beginnen met een # worden gezien als opmerking en worden genegeerd.
- De kleinste tijdseenheid is een minuut. Cron kan niet sturen op secondes
- Gebruik “dag van de maand (3) en dag van de week (5) niet door elkaar maar gebruik bij een van beide het * (any). Als deze samen ingevuld zijn is het niet “EN” maar een “OR” en wordt de task dus uitgevoerd wanneer 1 van beide variabelen correct is (dus op aangegeven dagen van de maand en aangegeven dagen van de week)
- Crontab werkt niet als de gebruiker geen toegewezen shell heeft (in /etc/passwd)
- Als de crontab niet draait controleer dan of de deamon actief is en of de gebruiker niet voorkomt in de /etc/cron.deny file (indien aanwezig) en als deze file aanwezig is dan moet de gebruiker wel voorkomen in de /etc/cron.allow file.
- Environment variabelen kunnen niet in het Crontab commando worden meegegeven. Doe dit via /bin/sh
Belangrijke flags zijn:
- -u
De -u (user) flag specificeert de gebruiker onder welke welke naam de crontab uitgevoerd moet worden. Zonder deze flag wordt automatisch de maker van de crontab aan de crontab toegewezen. Als het crontab commando als “su” wordt uitgevoerd is de “-u” flag verplicht - -r
De -r (remove) optie wordt gebruikt om de crontab te verwijderen - -e
De -e (edit) optie wordt gebruikt om de crontab te bewerken in de editor die opgegeven is in de VISUAL of EDITOR environment variabele
Na de tijdsaanduiding komt het commando waardoor een compleet commando er als volgt uitziet:
* * * * * /sbin/ping -c 1 192.168.1.254 > /dev/null |
Bovenstaande commando voert elke minuut 1 ping uit naar een gespecificeerd IP adres en dumpt de resultaten in het “null” bestand. Onderstaande commando doet hetzelfde maar dan 2x per dag, om 11:00 en om 16:00.
00 11,16 * * * /sbin/ping -c 1 192.168.1.254 > /dev/null |
Alle crontabs van de huidige gebruiker bekijken doe je als volgt:
crontab -l |
Bekijk de crontabs van een andere gebruiker:
#Login als root (su - root) en doe: crontab -u jarno -l |
Crontab toevoegen of crontabs aanpassen:
crontab -e #Nu opent zich een teksteditor, b.v. VIM en kun je in de teksteditor de taken aanpassen en aanmaken |
Contabs van andere gebruikers aanpassen:
#Login als root (su - root) en doe: crontab -u jarno -e |
Het is ook mogelijk om Cron taken toe te voegen via een tekstbestand. Dit tekstbestand is later weer te importeren in het crontabs bestand. Deze methode werkt als volgt:
crontab -l no crontab for jarno $ cat cron-file.txt @yearly /home/jarno/superscript crontab cron-file.txt crontab -l @yearly /home/jarno/superscript |
Standaard stuurt Cron het resultaat (cancelled, completed, failed) van de taak via e-mail naar de user van wie de taak is. Om de e-mail naar een andere gebruiker te sturen specificeer je de “EMAIL” variabele in de taak:
MAIL="max" @yearly /home/jarno/superscript |
Je kunt ook e-mails laten sturen naar specifieke e-mailadressen (die door een komma van elkaar gescheiden worden):
MAIL=ik@jarnobaselier.nl,jij@jarnobaselier.nl @yearly /home/jarno/superscript |
Wget
Wget is een commando waarmee bestanden op het internet gedownload kunnen worden. In tegenstelling tot een browser werkt Wget in de achtergrond. Wget ondersteund http, https en ftp. Er word ook vaak aan Wget gerefereerd als een “recursive download” tool. Wget kan namelijk complete websites downloaden en namaken maar houdt zich hierbij wel aan de regels van het robots.txt bestand. Een aantal Wget voorbeelden:
Downloaden van een specifiek bestand:
wget http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz |
Je kunt ook meerdere bestanden downloaden door deze te scheiden met een spatie:
wget http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz https://ftp.gnu.org/gnu/wget/wget-1.6.tar.gz |
Downloaden een specifiek bestand en hernoem dit bestand naar “wget.zip” middels de –O flag:
get -O wget.zip http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz |
Downloaden van alle URL’s / bestanden vanuit een txt bestand met de –I flag:
wget -i /wget-list.txt |
Downloaden met de –c (auto-resume) flag zodat Wget verder kan downloaden waar hij gebleven was indien de download onderbroken wordt:
wget -c http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz |
Het downloaden bestanden in de achtergrond met de -b optie:
wget -b http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz |
Downloaden met een gebruikersnaam en wachtwoord (b.v. bij FTP):
wget --http-user=gebruikersnaam --http-password=wachtwoord http://ftp.gnu.org/gnu/wget/wget-1.5.3.tar.gz |
Download een complete website incl. alle gelinkte pagina’s en bestanden
wget ‐‐execute robots=off ‐‐recursive ‐‐no-parent ‐‐continue ‐‐no-clobber https://jarnobaselier.nl |
Download alle JPG, GIF en PNG bestanden van een website:
wget ‐‐directory-prefix=files/pictures ‐‐no-directories ‐‐recursive ‐‐no-clobber ‐‐accept jpg,gif,png,jpeg https://jarnobaselier.nl |
Spelen met (tekst)bestanden
In deel 4 van de serie zijn we al even met tekstbestanden bezig geweest. Zo leerde we dat we b.v. met het “cat” commando bestanden konden bekijken en samen konden voegen. Nu gaan we een aantal functies bekijken die we ook (in combinatie met o.a. “cat”) kunnen gebruiken.
- pr
Door de “pr” toe te voegen wordt de tekst gepagineerd. Linux neem de tekst en verdeeld deze over pagina’s zoals jij dat wilt met de opgegeven opties. Zo kunnen we dubbele enters toepassen met de “-d” flag:cat manual.txt | pr -d
In het volgende voorbeeld zetten we de bestanden en mappen van de huidige directory in een printbaar formaat (onder elkaar) met genummerde lijnen (-n) en een custom header (-h):
ls -a | pr -n -h "Bestandens in $(pwd)"
- fmt
De “fmt” functie gebruiken we op tekstbestanden te formatteren en optimaliseren. Zonder toevoeging zal geformatteerde tekst door de “fmt” functie geformatteerd (achter elkaar geplaatst) worden:cat manual.txt | fmt
In het volgende voorbeeld doen we hetzelfde maar splitsen we lange regels (met de -s flag):
cat manual.txt | fmt -s
- head
Met de “head” functie wordt alleen de header van een bestand weergegeven (de eerste regels):cat manual.txt | head
- tail
Met de “tail” functie wordt alleen de footer van een bestand weergegeven (de laatste regels):cat manual.txt | tail
sort
Een andere uitgebreidere functie is de “sort” functie. De sort functie sorteert tekstbestanden volgen zijn eigen regels of de regels die meegegeven worden door toegevoegde parameters zoals -b (het negeren van voorlopende spaties). Standaard zal sort zijn content sorteren middels 3 regels:
- Regels met een nummer gaan voor regels die beginnen met een letter
- Alle regels met een letter worden van A-Z gesorteerd
- Regels die beginnen zonder hoofdletter worden boven de regels met een hoofdletter geplaatst.
Deze lijst:
1 peer banaan Dropje 4 bloemkolen Citroen Appel druif Druif |
Word als volgt gesorteerd:
sort list.txt 1 peer 4 bloemkolen Appel banaan Citroen Dropje druif Druif |
Om de gesorteerde lijst naar een ander bestand te schrijven (en de gesorteerde volgorde dus op te slaan gebruiken we het “>” koppel commando (later in deze post uitgelegd):
sort list.txt > listsorted.txt |
We kunnen deze lijst ook random sorteren (een willekeurige sortering die iedere keer anders is) met de toevoeging van de “-R” flag:
sort -R list.txt |
We kunnen deze lijst ook sorteren volgens de standaard regels en dan de sortering omgooien (reverse) met de “-r” flag:
sort -r list.txt |
Mocht je een bestand hebben met voorloop spaties dan kunnen we ervoor kiezen om deze voorloop spaties te negeren met de “-b” flag. Op deze manier wordt de lijst toch netjes gesorteerd ondanks de voorloop spaties.
sort -b list.txt |
Input / Output / Koppel commando’s
In Linux is het mogelijk om de output van bepaalde commando’s door te sturen naar een ander commando of om simpelweg meerdere commando’s achter elkaar uit te voeren. De laatste variant hebben we namelijk al eens eerder gezien:
- &&
Met deze seperator kun je verschillende commando’s in 1 string opgeven. Onderstaande string zorgt ervoor dat alle pakketjes van de apt-get package cache verwijderd worden, vervolgens alle de softwarelijst geüpdate worden, alle pakketten geüpgrade worden en voert een upgrade uit van de distributie. Alle commando’s worden na elkaar afgewerkt als het voorgaande commando succesvol was (de 2e start pas als de 1e succesvol afgerond is). - ;
De ; is ook een “command chaining” seperator. Het grote verschil is dat “&&” het volgende commando alleen uitvoert als het voorgaande commando een “zero exit” status heeft (met andere woorden succesvol is uitgevoerd). En met de ; seperator kun je verschillende commando’s in 1 string opgeven. Commando 2 wordt altijd na commando 1 uitgevoerd ongeacht de exit status van commando 1. - > en >>
Stuur het commando niet naar het display maar naar een bestand. B.v. “ls > ls.txt”. Iedere keer dat dit commando uitgevoerd wordt overschrijft hij het vorige bestand met de nieuwe output. Als je >> gebruikt dan wordt de nieuwe output aan hetzelfde bestand toegevoegd. We kunnen ook een achterwaards pijltje gebruiken. Met < voorzie je een commando van input vanuit een file i.p.v. uit het toetsenbord. B.v. "sort < input.txt" - | – Pipes / pipelines
Deze commando’s worden gebruikt om commando’s aan elkaar te koppelen. Zo kun je de output van commando A gebruiken als input voor commando B. B.v. “ls -l | less” De output van “ls” wordt nu getoond in “less” waardoor je een scrollende output hebt. Deze truc is op elk commando toe te passen. “du | sort -nr” laat alle directories en bestanden zien van hoge naar lage volumegrootte.
sudo apt-get clean && apt-get update && apt-get upgrade -y && apt-get dist-upgrade -y |
grep
Als er 1 commando is die het leven in Linux een stuk makkelijker maakt, en absoluut 1 van mijn favoriete commando’s dan is dat het zoekcommando “grep”. Grep staat voor “global regular expression print” en verwerkt tekst regel voor regel waarbij alle regels die overeenkomen met een specifiek patroon worden afgedrukt. Grep maakt gebruik van reguliere expressies, sterker nog. Alle opgegeven patronen ziet grep als een reguliere expressie. Grep zoekt naar een opgegeven patroon in de tekst en zal deze laten zien als output. Om bijvoorbeeld het stuk tekst “de schrijver” te vinden in het bestand “linux-handleiding.html” gebruik je het commando:
grep "de schijver" linux-handleiding.html |
Hier volgens nog een aantal voorbeelden van “grep”:
Grep retourneert de gehele regel waarin de match gevonden is. Om de opgegeven match te kleuren zodat deze gemakkelijk zichtbaar is gebruik je de “–color” toevoeging:
grep --color "de schijver" linux-handleiding.html |
Om van elke geretourneerde regel het originele regelnummer in het bestand te zien voegen we de “-n” flag toe. Het gehele commando wordt dan:
grep --color -n "de schijver" linux-handleiding.html |
Bij default (zoals alles in Linux) is grep hoofdlettergevoelig. De “-i” flag zorgt ervoor dat de resultaten van grep niet meer hoofdlettergevoelig zijn:
grep --color -n -i "de schijver" linux-handleiding.html |
Om alleen te weten hoeveel matches er zijn kunnen we het aantal matches tellen met de count “-c” flag:
grep -c "de schijver" linux-handleiding.html |
We kunnen grep ook gebruiken om alle niet matchende regels te retourneren. Hiermee inverten we de grep opdracht. Dit doen we met de “–invert” flag:
grep -n --invert "de schijver" linux-handleiding.html |
In bovenstaande voorbeelden gebruikte we grep om 1 specifiek bestand te doorzoeken. We kunnen grep ook gebruiken om meerdere bestanden te doorzoeken. In onderstaande voorbeeld zorgt het sterretje “*.html” er namelijk voor dat grep alle HTML bestanden in de directory doorzoekt. Grep zal bij de resultaten dan ook het bestand vermelden waarin het resultaat gevonden is:
grep --color -n -i "de schrijver" *.html |
Om nog dieper te zoeken kunnen we grep ook door alle subdirectories laten zoeken. Dit is het zogenaamde “recursive” zoeken en wordt geactiveerd met de “-r” flag. In onderstaande voorbeeld doorzoeken we alle HTML bestanden in de huidige directory en alle subdirectories:
grep --color -n -i -r "de schrijver" *.html |
Omdat grep werkt met reguliere expressies kunnen we hele slimme dingen doen met grep. Neem de volgende 2 reguliere expressies in gedachte:
. = elk karakter op deze positie
* = Het vorige karakter dat 0 of meer keer voorkomt
? = het vorige karakter is optioneel en komt maximaal 1 keer voor
+ = het vorige item moet minimaal 1 keer of vaker voorkomen
We kunnen hiermee de volgende zoekopdrachten maken:
“schrijver.*maken” zorgt er dus voor dat alle combinaties mogelijk zijn tussen de woorden “schrijver” en “maken”.
po?s zal wel “poos” en “pos” en “ps” matchen maar niet “poes” of “poses”
po+s zal pos, poos, pooos matchen maar niet ps, poster etc.
E-mailen vanuit de shell
Als laatste wil ik nog even stilstaan bij het e-mailen vanuit de “shell”. Er zijn diverse manieren om te e-mailen maar een standaardmethode welke default aanwezig is in de meeste distributies is het “sendEmail” commando. De opmaak van het sendEmail commando is als volgt:
sendEmail –t ontvanger@email.nl –f verzender@email.nl –u onderwerp –m bericht –s smtp.mailserver.com |
De volgende opties zijn geaccepteerd:
- -t = e-mailadres van de ontvanger
- -f = e-mailadres van de verzender
- -u = onderwerp
- -m = bericht/body
- -s = e-mailserver
Om geautoriseerd te versturen kun je de “-xu” en “-xp” switches toevoegen:
- -xu = gebruikersnaam
- -xp = wachtwoord
Als je de –m optie niet gebruikt kunt je na het geven van een enter de hele body opmaken (over meerdere regels). Via CTRL+D verlaat je de body opmaak en verstuur je de gehele e-mail. Het weghalen van de –m switch is dus vereist als je een grotere body wilt opmaken / versturen.
Als we alles van deze post combineren kunnen we dus de inhoud van een gesorteerd bestand e-mailen. Dit doen we dan als volgt:
sort list.txt | sendEmail –t ontvanger@email.nl –f verzender@email.nl –u Gesorteerde Lijst –s smtp.mailserver.com -xu gebruikersnaam -xp wachtwoord |
Ten slotte
Helaas zijn we alweer aan het einde van het 7e deel van “Linux – Shell Enzo”. In deel 8 gaan we al deze kennis gebruiken om een paar scripts te maken. Op deze manier zie je hoe het scripten in Linux werkt. Er blijven altijd onbesproken zaken en specifieke systeemtaken. Ik ben ervan overtuigd dat je met de kennis van deze 7 posts al heel erg goed uit de voeten kunt met Linux en vooral met de shell omgeving van Linux. Met deze kennis ben je in staat om supersnel en effectief te werken. Verdere kennis komt vanzelf! In deel 8 dus scripting en in deel 9 mijn 10 favoriete commando’s en een inhoudsopgave / opsomming van alle commando’s die we in deze 7 posts besproken hebben.
Hartelijk dank voor de interesse!! Als je iets aan deze en/of voorgaande posts gehad hebt wil ik ja vragen om deze te delen en liken of om deze via een andere manier verder te promoten! Het is leuk als meerdere mensen deze informatie kunnen lezen en gebruiken.