Fehim u Tagħlim ta' Skript Bażiku ta' Shell u Soluzzjoni ta' Problemi tas-Sistema tal-Fajls tal-Linux - Parti 10


Il-Linux Foundation nediet iċ-ċertifikazzjoni LFCS (Linux Foundation Certified Sysadmin), inizjattiva ġdida fjamanta li l-għan tagħha huwa li tippermetti individwi kullimkien (u kullimkien) biex jiksbu ċċertifikati minn bażiku għal intermedju. appoġġ operattiv għas-sistemi Linux, li jinkludi l-appoġġ ta 'sistemi u servizzi ta' tħaddim, flimkien ma 'monitoraġġ u analiżi ġenerali, kif ukoll teħid ta' deċiżjonijiet intelliġenti meta jiġu biex jitqajmu kwistjonijiet lil timijiet ta 'appoġġ ta' fuq.

Iċċekkja l-video li ġej li jiggwidak introduzzjoni għall-Programm ta 'Ċertifikazzjoni tal-Linux Foundation.

Dan huwa l-aħħar artiklu (Parti 10) tas-serje twila preżenti ta' 10 tutorials. F'dan l-artikolu se niffukaw fuq scripting bażiku tal-qoxra u s-soluzzjoni tal-problemi tas-sistemi tal-fajls Linux. Iż-żewġ suġġetti huma meħtieġa għall-eżami taċ-ċertifikazzjoni LFCS.

Fehim Terminals u Qxur

Ejja niċċaraw ftit kunċetti l-ewwel.

  1. Qoxra hija programm li jieħu kmandi u jagħtihom lis-sistema operattiva biex jiġu esegwiti.
  2. Terminal huwa programm li jippermettilna bħala utenti finali li jinteraġixxu mal-qoxra. Eżempju wieħed ta' terminal huwa terminal GNOME, kif muri fl-immaġini ta' hawn taħt.

Meta l-ewwel nibdew qoxra, tippreżenta kmand prompt (magħruf ukoll bħala l-linja tal-kmand), li tgħidilna li l-qoxra hija lesta biex tibda taċċetta kmandi mill-apparat ta 'input standard tagħha, li normalment tkun it-tastiera.

Inti tista 'tixtieq tirreferi għal artikolu ieħor f'din is-serje (Uża Kmand biex Oħloq, Editja u Manipula fajls - Parti 1) biex tirrevedi xi kmandi utli.

Linux jipprovdi firxa ta 'għażliet għall-qxur, dawn li ġejjin huma l-aktar komuni:

Bash tirreferi għal Bourne Again SHell u hija l-qoxra awtomatika tal-Proġett GNU. Jinkorpora karatteristiċi utli mill-qoxra Korn (ksh) u l-qoxra C (csh), li toffri diversi titjib fl-istess ħin. Din hija l-qoxra awtomatika użata mid-distribuzzjonijiet koperti fiċ-ċertifikazzjoni LFCS, u hija l-qoxra li se nużaw f'dan it-tutorja.

Il-Bourne SHell hija l-eqdem qoxra u għalhekk kienet il-qoxra default ta' ħafna sistemi operattivi simili għal UNIX għal ħafna snin.

Il-Korn SHell hija qoxra Unix li ġiet żviluppata minn David Korn fil-Bell Labs fil-bidu tas-snin tmenin. Huwa kompatibbli b'lura mal-qoxra Bourne u jinkludi ħafna karatteristiċi tal-qoxra C.

Skript tal-qoxra huwa xejn aktar u xejn inqas minn fajl test imdawwar fi programm eżekutibbli li jgħaqqad kmandi li jiġu esegwiti mill-qoxra wieħed wara l-ieħor.

Bażiku Shell Scripting

Kif issemma qabel, script shell titwieled bħala fajl ta 'test sempliċi. Għalhekk, jista 'jinħoloq u editjat billi tuża l-editur tat-test preferut tagħna. Inti tista 'tkun trid tikkunsidra li tuża vi/m (irreferi għal Użu ta' vi Editur – Parti 2 ta 'din is-serje), li fih is-sintassi jenfasizzaw għall-konvenjenza tiegħek.

Ittajpja l-kmand li ġej biex toħloq fajl bl-isem myscript.sh u agħfas Enter.

# vim myscript.sh

L-ewwel linja ta' script shell trid tkun kif ġej (magħrufa wkoll bħala shebang).

#!/bin/bash

Hija \tgħid” lis-sistema operattiva l-isem tal-interpretu li għandu jintuża biex imexxi t-test li ġej.

Issa wasal iż-żmien li nżidu l-kmandi tagħna. Nistgħu niċċaraw l-iskop ta 'kull kmand, jew l-iskrittura kollha, billi nżidu kummenti wkoll. Innota li l-qoxra tinjora dawk il-linji li jibdew b'sinjal tal-lira # (kummenti ta' spjegazzjoni).

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

Ladarba l-iskrittura tkun inkiteb u ssejvjata, irridu nagħmluha eżekutibbli.

# chmod 755 myscript.sh

Qabel ma nħaddmu l-iskrittura tagħna, irridu ngħidu ftit kliem dwar il-varjabbli tal-ambjent PATH. Jekk niġru,

echo $PATH

mil-linja tal-kmand, se naraw il-kontenut ta 'PATH: lista separata minn kolon ta' direttorji li huma mfittxija meta ndaħħlu l-isem ta 'programm eżekutibbli. Tissejjaħ varjabbli tal-ambjent minħabba li hija parti mill-ambjent tal-qoxra - sett ta 'informazzjoni li ssir disponibbli għall-qoxra u l-proċessi tat-tfal tagħha meta l-qoxra tinbeda għall-ewwel darba.

Meta nittajpja kmand u agħfas Enter, il-qoxra tfittex fid-direttorji kollha elenkati fil-varjabbli PATH u tesegwixxi l-ewwel istanza li tinstab. Ejja naraw eżempju,

Jekk hemm żewġ fajls eżekutibbli bl-istess isem, wieħed f'/usr/local/bin u ieħor f'/usr/bin, dak fl-ewwel direttorju jiġi esegwit l-ewwel, filwaqt li l-ieħor se jiġi injorat.

Jekk ma nkunux salvati l-iskript tagħna ġewwa wieħed mid-direttorji elenkati fil-varjabbli PATH, irridu ndaħħlu ./ mal-isem tal-fajl sabiex inwettquh. Inkella, nistgħu nħaddmuha bħalma nagħmlu bi kmand regolari.

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

Kull meta jkollok bżonn tispeċifika korsijiet ta' azzjoni differenti li għandhom jittieħdu fi script shell, bħala riżultat tas-suċċess jew falliment ta' kmand, tuża l-if kostrutt biex tiddefinixxi tali kundizzjonijiet. Is-sintassi bażika tagħha hija:

if CONDITION; then 
	COMMANDS;
else
	OTHER-COMMANDS 
fi

Fejn KONDIZZJONI tista' tkun waħda minn dawn li ġejjin (l-aktar kundizzjonijiet frekwenti biss huma kkwotati hawn) u tevalwa bħala vera meta:

  1. [ -a fajl ] → fajl jeżisti.
  2. [ -d file ] → fajl jeżisti u huwa direttorju.
  3. [ -f file ] →file jeżisti u huwa fajl regolari.
  4. [ -u file ] →file jeżisti u l-bit SUID tiegħu (issettjat l-ID tal-utent) huwa ssettjat.
  5. [ -g file ] →file jeżisti u l-bit SGID tiegħu huwa ssettjat.
  6. [ -k file ] →file jeżisti u l-bit li jwaħħal tiegħu huwa ssettjat.
  7. [ -r file ] →fajl jeżisti u jista' jinqara.
  8. [ -s file ]→ fajl jeżisti u mhuwiex vojt.
  9. [ -w fajl ]→fajl jeżisti u jista’ jinkiteb.
  10. [ -x file ] huwa veru jekk il-fajl jeżisti u huwa eżekutibbli.
  11. [ string1 = string2 ] → il-kordi huma ugwali.
  12. [ string1 != string2 ] →il-kordi mhumiex ugwali.

[ int1 op int2 ] għandha tkun parti mil-lista preċedenti, filwaqt li l-oġġetti li jsegwu (pereżempju, -eq –> huwa veru jekk int1 > hija ugwali għal int2.) għandha tkun lista “tfal” ta’ [ int1 op int2 ] fejn op huwa wieħed mill-operaturi ta' tqabbil li ġejjin.

  1. -eq –> huwa veru jekk int1 huwa ugwali għal int2.
  2. -ne –> veru jekk int1 mhux ugwali għal int2.
  3. -lt –> veru jekk int1 huwa inqas minn int2.
  4. -le –> veru jekk int1 huwa inqas minn jew ugwali għal int2.
  5. -gt –> veru jekk int1 huwa akbar minn int2.
  6. -ge –> veru jekk int1 huwa akbar minn jew ugwali għal int2.

Din il-linja tippermetti li tesegwixxi kmandi wieħed jew aktar għal kull valur f'lista ta 'valuri. Is-sintassi bażika tagħha hija:

for item in SEQUENCE; do 
		COMMANDS; 
done

Fejn oġġett hija varjabbli ġenerika li tirrappreżenta kull valur f'SEQUENCE matul kull iterazzjoni.

Din il-linja tippermetti li tesegwixxi serje ta 'kmandi ripetittivi sakemm il-kmand tal-kontroll jesegwixxi bi status ta' ħruġ ugwali għal żero (b'suċċess). Is-sintassi bażika tagħha hija:

while EVALUATION_COMMAND; do 
		EXECUTE_COMMANDS; 
done

Fejn EVALUATION_COMMAND jista' jkun kwalunkwe kmand(i) li jistgħu joħorġu bi status ta' suċċess (0) jew falliment (minbarra 0), u EXECUTE_COMMANDS jista 'jkun kwalunkwe programm, script jew shell construct, inklużi loops oħra nested.

Aħna ser nuru l-użu tal-kostruzzjoni if u l-linja for bl-eżempju li ġej.

Ejja noħolqu fajl b'lista ta 'servizzi li rridu nissorveljaw f'daqqa t'għajn.

# cat myservices.txt

sshd
mariadb
httpd
crond
firewalld

L-iskrittura tal-qoxra tagħna għandha tidher.

#!/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

1). Il-linja for jaqra l-fajl myservices.txt element wieħed tal-LISTA kull darba. Dak l-element uniku huwa indikat mill-varjabbli ġeneriku msemmi servizz. Il-LISTA hija mimlija bl-output ta',

# cat myservices.txt

2). Il-kmand ta 'hawn fuq huwa magħluq fil-parentesi u preċedut minn sinjal ta' dollaru biex jindika li għandu jiġi evalwat biex timla l-LISTA li se nirrepetu fuqha.

3). Għal kull element tal-LISTA (li jfisser kull istanza tal-varjabbli tas-servizz), se jiġi eżegwit il-kmand li ġej.

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

Din id-darba jeħtieġ li nippreċedu l-varjabbli ġeneriku tagħna (li tirrappreżenta kull element f'LISTA) b'sinjal tad-dollaru biex jindika li hija varjabbli u għalhekk il-valur tagħha f'kull iterazzjoni għandu jintuża. L-output imbagħad jiġi mgħoddi għal grep.

Il-bandiera –kwiet tintuża biex tipprevjeni lil grep milli juri fuq l-iskrin il-linji fejn tidher il-kelma running. Meta jiġri hekk, il-kmand ta' hawn fuq jirritorna status ta' ħruġ ta' 0 (rappreżentat minn $? fil-kostruzzjoni if), u b'hekk jivverifika li s-servizz qed jaħdem.

Status ta' ħruġ differenti minn 0 (li jfisser li l-kelma li qed taħdem ma nstabitx fl-output ta' systemctl status $service) jindika li s-servizz mhuwiex ġiri.

Nistgħu mmorru pass ieħor u niċċekkjaw l-eżistenza ta' myservices.txt qabel saħansitra nippruvaw nidħlu fil-for loop.

#!/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

Tista' tkun trid iżżomm lista ta' hosts f'fajl test u tuża skript biex tiddetermina kull tant żmien jekk humiex pingable jew le (ħossok liberu li tissostitwixxi l-kontenut ta' myhosts u pprova għalik innifsek ).

Il-kmand read shell built-in jgħid lill-while loop biex jaqra myhosts linja b'linja u jassenja l-kontenut ta 'kull linja lil host varjabbli, li mbagħad jgħaddi lill-kmand 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

Aqra wkoll:

  1. Tgħallem Shell Scripting: Gwida minn Newbies għal Amministratur tas-Sistema
  2. 5 Shell Scripts biex Tgħallem l-Ipprogrammar Shell

Issolvi l-problemi tas-sistema tal-fajls

Għalkemm il-Linux hija sistema operattiva stabbli ħafna, jekk tiġġarraf għal xi raġuni (pereżempju, minħabba qtugħ tad-dawl), waħda (jew aktar) mis-sistemi tal-fajls tiegħek ma jiġux immuntati kif suppost u għalhekk jiġu ċċekkjati awtomatikament għal żbalji meta Linux. jerġa’ jinbeda.

Barra minn hekk, kull darba li s-sistema tibbotja waqt boot normali, dejjem tiċċekkja l-integrità tas-sistemi tal-fajls qabel ma twaħħalhom. Fiż-żewġ każijiet dan isir bl-użu ta' għodda msejħa fsck (\kontroll tas-sistema tal-fajl).

fsck mhux biss se jiċċekkja l-integrità tas-sistemi tal-fajls, iżda wkoll jipprova jsewwi s-sistemi tal-fajls korrotti jekk jingħata struzzjonijiet biex jagħmel dan. Skont is-severità tal-ħsara, fsck jista 'jirnexxi jew le; meta dan isir, porzjonijiet irkuprati ta 'fajls jitqiegħdu fid-direttorju mitluf+instabu, li jinsab fl-għerq ta' kull sistema ta 'fajls.

Fl-aħħar iżda mhux l-inqas, irridu ninnutaw li l-inkonsistenzi jistgħu jiġru wkoll jekk nippruvaw inneħħu USB drive meta s-sistema operattiva tkun għadha tikteb magħha, u jistgħu saħansitra jirriżultaw f'ħsara fil-hardware.

Is-sintassi bażika ta 'fsck hija kif ġej:

# fsck [options] filesystem

Sabiex niċċekkjaw sistema ta 'fajls b'fsck, l-ewwel irridu niżżluha.

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

Minbarra l-bandiera -y, nistgħu nużaw l-għażla -a biex isewwu awtomatikament is-sistemi tal-fajls mingħajr ma nistaqsu l-ebda mistoqsija, u nġiegħlu l-kontroll anki meta s-sistema tal-fajls tidher nadifa.

# fsck -af /dev/sdg1

Jekk aħna biss interessati li nsibu x'inhu ħażin (mingħajr ma nippruvaw nirranġaw xejn għalissa) nistgħu nħaddmu fsck bl-għażla -n, li toħroġ il-kwistjonijiet tas-sistema tal-fajls għal output standard.

# fsck -n /dev/sdg1

Skont il-messaġġi ta 'żball fl-output ta' fsck, se nkunu nafu jekk nistgħux nippruvaw insolvu l-kwistjoni aħna stess jew neskalawha lil timijiet ta 'inġinerija biex iwettqu aktar kontrolli fuq il-hardware.

Sommarju

Wasalna fl-aħħar ta' din is-sensiela ta' 10 artikli fejn ippruvajna nkopru l-kompetenzi bażiċi tad-dominju meħtieġa biex tgħaddi mill-eżami LFCS.

Għal raġunijiet ovvji, mhuwiex possibbli li tkopri kull aspett wieħed ta 'dawn is-suġġetti fi kwalunkwe tutorja waħda, u hu għalhekk li nittamaw li dawn l-artikoli poġġewk fit-triq it-tajba biex tipprova ħwejjeġ ġodda lilek innifsek u tkompli titgħallem.

Jekk għandek xi mistoqsijiet jew kummenti, huma dejjem milqugħa - għalhekk toqgħodx lura milli tibgħatilna linja permezz tal-formola hawn taħt!