Zoeken op website

Basisshellscripting en probleemoplossing voor Linux-bestandsystemen begrijpen en leren - Deel 10


De Linux Foundation lanceerde de LFCS-certificering (Linux Foundation Certified Sysadmin), een gloednieuw initiatief dat tot doel heeft individuen overal (en waar dan ook) in staat te stellen zich te laten certificeren in basis- tot gemiddeld operationele ondersteuning voor Linux-systemen, inclusief ondersteuning van draaiende systemen en services, samen met algemene monitoring en analyse, plus slimme besluitvorming als het gaat om het voorleggen van problemen aan hogere ondersteuningsteams.

Bekijk de volgende video die u een introductie geeft tot het Linux Foundation Certification Program.

Dit is het laatste artikel (deel 10) van de huidige lange serie van 10 tutorials. In dit artikel zullen we ons concentreren op elementaire shell-scripting en het oplossen van problemen met Linux-bestandssystemen. Beide onderwerpen zijn vereist voor het LFCS-certificeringsexamen.

Terminals en shells begrijpen

Laten we eerst een paar concepten verduidelijken.

  1. Een shell is een programma dat opdrachten opneemt en deze aan het besturingssysteem geeft om uit te voeren.
  2. Een terminal is een programma waarmee wij als eindgebruikers met de shell kunnen communiceren. Een voorbeeld van een terminal is de GNOME-terminal, zoals weergegeven in de onderstaande afbeelding.

Wanneer we een shell voor het eerst starten, wordt er een opdrachtprompt weergegeven (ook bekend als de opdrachtregel), die ons vertelt dat de shell klaar is om opdrachten te accepteren van het standaardinvoerapparaat, meestal het toetsenbord.

Misschien wilt u een ander artikel in deze serie raadplegen (Gebruik opdrachten om bestanden te maken, bewerken en manipuleren – Deel 1) om enkele nuttige opdrachten te bekijken.

Linux biedt een reeks opties voor shells, waarvan de volgende de meest voorkomende zijn:

bash Shell

Bash staat voor Bourne Again SHell en is de standaardshell van het GNU-project. Het bevat handige functies van de Korn-shell (ksh) en C-shell (csh) en biedt tegelijkertijd verschillende verbeteringen. Dit is de standaardshell die wordt gebruikt door de distributies die vallen onder de LFCS-certificering, en het is de shell die we in deze zelfstudie zullen gebruiken.

sch Shell

De Bourne SHell is de oudste shell en is daarom al jaren de standaardshell van veel UNIX-achtige besturingssystemen.

ksh Shell

De Korn SHell is een Unix-shell die begin jaren tachtig werd ontwikkeld door David Korn bij Bell Labs. Het is achterwaarts compatibel met de Bourne-shell en bevat veel functies van de C-shell.

Een shellscript is niets meer en niets minder dan een tekstbestand dat is omgezet in een uitvoerbaar programma dat opdrachten combineert die de ene na de andere door de shell worden uitgevoerd.

Basis Shell-scripting

Zoals eerder vermeld, wordt een shellscript geboren als een gewoon tekstbestand. Kan dus worden gemaakt en bewerkt met onze favoriete teksteditor. Misschien wilt u overwegen om vi/m te gebruiken (zie Gebruik van vi Editor – Deel 2 van deze serie), die syntaxisaccentuering biedt voor uw gemak.

Typ de volgende opdracht om een bestand met de naam myscript.sh te maken en druk op Enter.

vim myscript.sh

De allereerste regel van een shellscript moet er als volgt uitzien (ook wel een shebang genoemd).

#!/bin/bash

Het “vertelt” het besturingssysteem de naam van de tolk die moet worden gebruikt om de volgende tekst uit te voeren.

Nu is het tijd om onze opdrachten toe te voegen. We kunnen het doel van elke opdracht, of het hele script, verduidelijken door ook commentaar toe te voegen. Merk op dat de shell de regels negeert die beginnen met een hekje # (verklarende opmerkingen).

#!/bin/bash
echo This is Part 10 of the 10-article series about the LFCS certification
echo Today is $(date +%Y-%m-%d)

Zodra het script is geschreven en opgeslagen, moeten we het uitvoerbaar maken.

chmod 755 myscript.sh

Voordat we ons script uitvoeren, moeten we een paar woorden zeggen over de omgevingsvariabele ` PATH. Als we rennen,

echo $PATH

vanaf de opdrachtregel zien we de inhoud van ` PATH:, een door dubbele punten gescheiden lijst met mappen waarin wordt gezocht wanneer we de naam van een uitvoerbaar programma invoeren. Het wordt een omgevingsvariabele genoemd omdat deze deel uitmaakt van de shell-omgeving: een reeks informatie die beschikbaar komt voor de shell en de onderliggende processen wanneer de shell voor het eerst wordt gestart.

Wanneer we een opdracht typen en op Enter drukken, zoekt de shell in alle mappen die zijn vermeld in de variabele ` PATH en voert de eerste instantie uit die wordt gevonden. Laten we een voorbeeld bekijken,

Als er twee uitvoerbare bestanden met dezelfde naam zijn, één in /usr/local/bin en een andere in /usr/bin, zal degene in de eerste map worden uitgevoerd eerste, terwijl de andere buiten beschouwing wordt gelaten.

Als we ons script niet hebben opgeslagen in een van de mappen die zijn vermeld in de ` PATH variabele, moeten we ./ aan de bestandsnaam toevoegen om het uit te kunnen voeren Het. Anders kunnen we het uitvoeren net zoals we zouden doen met een normaal commando.

pwd
./myscript.sh
cp myscript.sh ../bin
cd ../bin
pwd
myscript.sh

Voorwaardelijke voorwaarden

Telkens wanneer u verschillende acties moet specificeren die in een shellscript moeten worden genomen, als gevolg van het slagen of mislukken van een opdracht, gebruikt u de if-constructie om dergelijke voorwaarden te definiëren. De basissyntaxis is:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Waarbij CONDITION een van de volgende kan zijn (alleen de meest voorkomende voorwaarden worden hier vermeld) en wordt geëvalueerd als waar wanneer:

  1. [ -een bestand ] → bestand bestaat.
  2. [ -d bestand ] → bestand bestaat en is een map.
  3. [ -f bestand ] →bestand bestaat en is een normaal bestand.
  4. [ -u file ] →bestand bestaat en zijn SUID-bit (set user ID) is ingesteld.
  5. [ -g bestand ] →bestand bestaat en de SGID-bit ervan is ingesteld.
  6. [ -k bestand ] →bestand bestaat en het plakkerige bit ervan is ingesteld.
  7. [ -r bestand ] →bestand bestaat en is leesbaar.
  8. [ -s bestand ]→ bestand bestaat en is niet leeg.
  9. [ -w bestand ]→bestand bestaat en is beschrijfbaar.
  10. [ -x file ] is waar als het bestand bestaat en uitvoerbaar is.
  11. [ string1=string2 ] → de strings zijn gelijk.
  12. [ string1 != string2 ] →de strings zijn niet gelijk.

[ int1 op int2 ] moet deel uitmaken van de voorgaande lijst, terwijl de items die volgen (bijvoorbeeld -eq –> is waar als int1 is gelijk aan int2.) moet een “kinderen”-lijst zijn van [ int1 op int2 ] waarbij op is een van de volgende vergelijkingsoperatoren.

  1. -eq –> is waar als int1 gelijk is aan int2.
  2. -ne –> waar als int1 niet gelijk is aan int2.
  3. -lt –> waar als int1 kleiner is dan int2.
  4. -le –> waar als int1 kleiner is dan of gelijk is aan int2.
  5. -gt –> waar als int1 groter is dan int2.
  6. -ge –> waar als int1 groter is dan of gelijk is aan int2.

Voor lussen

Met deze lus kunnen voor elke waarde in een lijst met waarden een of meer opdrachten worden uitgevoerd. De basissyntaxis is:

for item in SEQUENCE; do 
		COMMANDS; 
done

Waarbij item een algemene variabele is die elke waarde in SEQUENCE vertegenwoordigt tijdens elke iteratie.

Terwijl lussen

Deze lus maakt het mogelijk een reeks repetitieve commando's uit te voeren, zolang het besturingscommando wordt uitgevoerd met een uitgangsstatus gelijk aan nul (met succes). De basissyntaxis is:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Waarbij EVALUATION_COMMAND elke opdracht(en) kan zijn die kan worden afgesloten met een succesvolle (0) of mislukte (anders dan 0) status, en EXECUTE_COMMANDS kan elk programma, script of shell-constructie zijn, inclusief andere geneste lussen.

Alles samenvoegen

We zullen het gebruik van de if-constructie en de for-lus demonstreren met het volgende voorbeeld.

Bepalen of een service wordt uitgevoerd in een op systemd gebaseerde distributie

Laten we een bestand maken met een lijst met services die we in één oogopslag willen controleren.

cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

Ons shellscript zou er zo uit moeten zien.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

for service in $(cat myservices.txt); do
    	systemctl status $service | grep --quiet "running"
    	if [ $? -eq 0 ]; then
            	echo $service "is [ACTIVE]"
    	else
            	echo $service "is [INACTIVE or NOT INSTALLED]"
    	fi
done

Laten we uitleggen hoe het script werkt.

1). De for-lus leest het bestand myservices.txt met element voor element van LIST. Dat ene element wordt aangegeven met de generieke variabele genaamd service. De LIST wordt gevuld met de uitvoer van,

cat myservices.txt

2). Het bovenstaande commando staat tussen haakjes en wordt voorafgegaan door een dollarteken om aan te geven dat het moet worden geëvalueerd om de LIST te vullen die we zullen herhalen.

3). Voor elk element van LIST (dat wil zeggen elke instantie van de servicevariabele) wordt het volgende commando uitgevoerd.

systemctl status $service | grep --quiet "running"

Deze keer moeten we onze algemene variabele (die elk element in LIST vertegenwoordigt) vooraf laten gaan door een dollarteken om aan te geven dat het een variabele is en dat de waarde ervan in elke iteratie moet worden gebruikt. De uitvoer wordt vervolgens doorgesluisd naar grep.

De vlag –quiet wordt gebruikt om te voorkomen dat grep de regels op het scherm weergeeft waar het woord running verschijnt. Wanneer dat gebeurt, retourneert het bovenstaande commando een afsluitstatus van 0 (weergegeven door $? in de if-constructie), waarmee wordt geverifieerd dat de service actief is.

Een afsluitstatus die anders is dan 0 (wat betekent dat het woord niet is gevonden in de uitvoer van systemctl status $service) geeft aan dat de service niet actief is rennen.

We kunnen nog een stap verder gaan en controleren op het bestaan van myservices.txt voordat we zelfs maar proberen de for-lus binnen te gaan.

#!/bin/bash

This script iterates over a list of services and
is used to determine whether they are running or not.

if [ -f myservices.txt ]; then
    	for service in $(cat myservices.txt); do
            	systemctl status $service | grep --quiet "running"
            	if [ $? -eq 0 ]; then
                    	echo $service "is [ACTIVE]"
            	else
                    	echo $service "is [INACTIVE or NOT INSTALLED]"
            	fi
    	done
else
    	echo "myservices.txt is missing"
fi
Een reeks netwerk- of internethosts pingen voor antwoordstatistieken

Misschien wilt u een lijst met hosts in een tekstbestand bijhouden en een script gebruiken om zo nu en dan te bepalen of ze pingbaar zijn of niet (vervang gerust de inhoud van myhosts en probeer het zelf ).

De ingebouwde opdracht read shell vertelt de while-lus om myhosts regel voor regel te lezen en wijst de inhoud van elke regel toe aan een variabele host, die vervolgens wordt doorgegeven aan de opdracht ping.

#!/bin/bash

This script is used to demonstrate the use of a while loop

while read host; do
    	ping -c 2 $host
done < myhosts

Lees ook:

  1. Leer Shell Scripting: een gids van nieuwkomers tot systeembeheerder
  2. 5 Shell-scripts om Shell-programmering te leren

Problemen met bestandssystemen oplossen

Hoewel Linux een zeer stabiel besturingssysteem is, zal een (of meer) van uw bestandssystemen, als het om de een of andere reden crasht (bijvoorbeeld door een stroomstoring), niet correct worden ontkoppeld en dus automatisch worden gecontroleerd op fouten wanneer Linux wordt opnieuw gestart.

Bovendien controleert het elke keer dat het systeem opstart tijdens normaal opstarten altijd de integriteit van de bestandssystemen voordat het wordt gemount. In beide gevallen wordt dit uitgevoerd met behulp van een tool genaamd fsck (“bestandssysteemcontrole ”).

fsck zal niet alleen de integriteit van bestandssystemen controleren, maar ook proberen corrupte bestandssystemen te repareren als dit wordt opgedragen. Afhankelijk van de ernst van de schade kan fsck slagen of niet; Wanneer dit het geval is, worden herstelde delen van bestanden in de map verloren+gevonden geplaatst, gelegen in de hoofdmap van elk bestandssysteem.

Last but not least moeten we opmerken dat inconsistenties ook kunnen optreden als we proberen een USB-station te verwijderen terwijl het besturingssysteem er nog naar schrijft, en zelfs tot hardwareschade kunnen leiden.

De basissyntaxis van fsck is als volgt:

fsck [options] filesystem
Een bestandssysteem controleren op fouten en proberen het automatisch te repareren

Om een bestandssysteem met fsck te controleren, moeten we het eerst ontkoppelen.

mount | grep sdg1
umount /mnt
fsck -y /dev/sdg1

Naast de vlag -y kunnen we de optie -a gebruiken om de bestandssystemen automatisch te repareren zonder vragen te stellen, en de controle te forceren, zelfs als het bestandssysteem er schoon uitziet.

fsck -af /dev/sdg1

Als we alleen maar willen weten wat er mis is (zonder voorlopig iets te proberen te repareren), kunnen we fsck uitvoeren met de optie -n, die de problemen met het bestandssysteem naar de standaarduitvoer zal uitvoeren.

fsck -n /dev/sdg1

Afhankelijk van de foutmeldingen in de uitvoer van fsck, zullen we weten of we kunnen proberen het probleem zelf op te lossen of het kunnen escaleren naar technische teams om verdere controles op de hardware uit te voeren.

Samenvatting

We zijn aan het einde gekomen van deze serie van 10 artikelen waarin we hebben geprobeerd de basisdomeincompetenties te behandelen die vereist zijn om te slagen voor het LFCS-examen.

Om voor de hand liggende redenen is het niet mogelijk om elk aspect van deze onderwerpen in één enkele tutorial te behandelen, en daarom hopen we dat deze artikelen je op het goede spoor hebben gezet om zelf nieuwe dingen uit te proberen en door te gaan met leren.

Als u vragen of opmerkingen heeft, zijn deze altijd welkom. Aarzel dus niet om ons een bericht te sturen via het onderstaande formulier!