Amministratore Linux - Shell Scripting
Introduzione a Bash Shell
Come le versioni di GNU Linux, le shell sono disponibili in molte varietà e variano in compatibilità. La shell predefinita in CentOS è nota come Bash o Bourne Again Shell. La shell Bash è una versione moderna e modificata di Bourne Shell sviluppata da Stephen Bourne. Bash è stato il sostituto diretto della Thompson Shell originale sul sistema operativo Unix sviluppato presso Bell Labs da Ken Thompson e Dennis Ritchie (Stephen Bourne era anche impiegato da Bell Labs)
Ognuno ha un guscio preferito e ognuno ha i suoi punti di forza e difficoltà. Ma per la maggior parte, Bash sarà la shell predefinita in tutte le distribuzioni Linux e più comunemente disponibile. Con l'esperienza, tutti vorranno esplorare e utilizzare una shell che è la migliore per loro. Tuttavia, allo stesso tempo, tutti vorranno anche padroneggiare la shell Bash.
Altre shell Linux includono: Tcsh, Csh, Ksh, Zsh e Fish.
Sviluppare competenze per utilizzare qualsiasi shell Linux a livello esperto è estremamente importante per un amministratore di CentOS. Come accennato in precedenza, a differenza di Windows, Linux nel suo cuore è un sistema operativo a riga di comando. Una shell è semplicemente un'interfaccia utente che consente a un amministratore (o utente) di impartire comandi al sistema operativo. Se un amministratore di sistema Linux fosse un pilota di una compagnia aerea, usare la shell sarebbe simile a togliere l'aereo dal pilota automatico e afferrare i controlli manuali per un volo più manovrabile.
Una shell Linux, come Bash, è nota in termini di informatica come Command Line Interpreter. Microsoft Windows ha anche due interpreti della riga di comando chiamati DOS (da non confondere con il sistema operativo DOS originale) e PowerShell.
Forniscono le shell più moderne come Bash constructsconsentendo a script di shell più complessi di automatizzare attività comuni e complesse.
I costrutti includono:
- Controllo del flusso di script (se allora e altro)
- Operazioni di confronto logico (maggiore, minore, uguaglianza)
- Loops
- Variables
- Parametri che definiscono il funzionamento (simile agli interruttori con comandi)
Utilizzo di Shell Script rispetto al linguaggio di scripting
Spesso, quando pensano di eseguire un'attività, gli amministratori si chiedono: devo usare uno script di shell o un linguaggio di scripting come Perl, Ruby o Python?
Non esiste una regola fissa qui. Ci sono solo differenze tipiche tra shell e linguaggi di scripting.
Conchiglia
Shell consente l'uso di comandi Linux come sed , grep , tee , cat e tutte le altre utilità basate sulla riga di comando sul sistema operativo Linux. In effetti, praticamente qualsiasi utilità Linux da riga di comando può essere inserita nella shell.
Un ottimo esempio di utilizzo di una shell sarebbe un rapido script per controllare un elenco di host per la risoluzione DNS.
Il nostro semplice script Bash per controllare i nomi DNS -
#!/bin/bash
for name in $(cat $1);
do
host $name.$2 | grep "has address"
done
exit
piccolo elenco di parole su cui testare la risoluzione DNS -
dns
www
test
dev
mail
rdp
remote
Output rispetto al dominio google.com -
[[email protected] ~]$ ./dns-check.sh dns-names.txt google.com
-doing dns
dns.google.com has address 172.217.6.46
-doing www
www.google.com has address 172.217.6.36
-doing test
-doing dev
-doing mail
googlemail.l.google.com has address 172.217.6.37
-doing rdp
-doing remote
[[email protected] ~]$
Sfruttando semplici comandi Linux nella nostra shell, siamo stati in grado di creare un semplice script di 5 righe per controllare i nomi DNS da un elenco di parole. Ciò avrebbe richiesto molto tempo in Perl, Python o Ruby anche quando si utilizzava una libreria DNS ben implementata.
Linguaggio di scripting
Un linguaggio di scripting darà più controllo al di fuori della shell. Lo script Bash precedente utilizzava un wrapper attorno al comando host Linux . E se volessimo fare di più e rendere la nostra applicazione come host per interagire al di fuori della shell? Qui è dove useremmo un linguaggio di scripting.
Inoltre, con un linguaggio di scripting altamente mantenuto, sappiamo che le nostre azioni funzioneranno per la maggior parte su sistemi diversi. Python 3.5, ad esempio, funzionerà su qualsiasi altro sistema che esegue Python 3.5 con le stesse librerie installate. Non è così, se vogliamo eseguire il nostro script BASH sia su Linux che su HP-UX.
A volte i confini tra un linguaggio di scripting e una potente shell possono essere offuscati. È possibile automatizzare le attività di amministrazione di CentOS Linux con Python, Perl o Ruby. Farlo è davvero abbastanza comune. Inoltre, i ricchi sviluppatori di script di shell hanno creato un demone del server web semplice, ma per il resto funzionale, in Bash.
Con l'esperienza nei linguaggi di scripting e nell'automazione delle attività nelle shell, un amministratore di CentOS sarà in grado di determinare rapidamente da dove iniziare quando avrà bisogno di risolvere un problema. È abbastanza comune avviare un progetto con uno script di shell. Quindi passare a un linguaggio di scripting (o compilato) man mano che un progetto diventa più complesso.
Inoltre, è possibile utilizzare sia un linguaggio di scripting che uno script di shell per parti diverse di un progetto. Un esempio potrebbe essere uno script Perl per raschiare un sito web. Quindi, usa uno script di shell per analizzare e formattare con sed , awk ed egrep . Infine, utilizza uno script PHP per inserire dati formattati nel database MySQL utilizzando una GUI web.
Con un po 'di teoria alla base delle shell, iniziamo con i blocchi di base per automatizzare le attività da una shell Bash in CentOS.
Input, output e reindirizzamento
Elaborazione di stdout su un altro comando -
[[email protected] ~]$ cat ~/output.txt | wc -l
6039
[[email protected] ~]$
Sopra, abbiamo passato cat'stoud a wc per l'elaborazione con il carattere pipe . wc ha quindi elaborato l'output da cat , stampando il conteggio delle righe di output.txt sul terminale. Pensa al carattere pipe come una "pipe" che passa l'output di un comando, che deve essere elaborato dal comando successivo.
Di seguito sono riportati i concetti chiave da ricordare quando si ha a che fare con il reindirizzamento dei comandi:
Numero | Descrittore di file | Personaggio |
---|---|---|
0 | input standard | < |
1 | output standard | > |
2 | errore standard | |
aggiungi stdout | >> | |
assegnare il reindirizzamento | & | |
reindirizza stdout in stdin | | |
Lo abbiamo introdotto nel capitolo uno senza parlare molto di reindirizzamento o assegnazione di reindirizzamento. Quando si apre un terminale in Linux, la shell viene vista come destinazione predefinita per:
- input standard <0
- output standard> 1
- errore standard 2
Vediamo come funziona -
[[email protected] ~]$ lsof -ap $BASHPID -d 0,1,2
COMMAND PID USER **FD** TYPE DEVICE SIZE/OFF NODE NAME
bash 13684 rdc **0u** CHR 136,0 0t0 3 /dev/pts/0
bash 13684 rdc **1u** CHR 136,0 0t0 3 /dev/pts/0
bash 13684 rdc **2u** CHR 136,0 0t0 3 /dev/pts/0
[[email protected] ~]$
/ dev / pts / 0 è il nostro pseudo terminale. CentOS Linux guarda questo e pensa alla nostra applicazione terminale aperta come un vero terminale con la tastiera e il display collegati tramite un'interfaccia seriale. Tuttavia, come un hypervisor estrae l'hardware da un sistema operativo / dev / pts astrae il nostro terminale dalle applicazioni.
Dal comando lsof sopra , possiamo vedere sottoFDcolonna che tutti e tre i descrittori di file siano impostati sul nostro terminale virtuale (0,1,2). Ora possiamo inviare comandi, vedere l'output del comando, nonché eventuali errori associati al comando.
Di seguito sono riportati esempi per STDIN e STDOUT -
STDOUT
[[email protected] centos]# echo "I am coming from Standard output or STDOUT." >
output.txt && cat output.txt
I am coming from Standard output or STDOUT.
[[email protected] centos]#
È anche possibile inviare sia stdout che stderr a file separati -
bash-3.2# find / -name passwd 1> good.txt 2> err.txt
bash-3.2# cat good.txt
/etc/pam.d/passwd
/etc/passwd
bash-3.2# cat err.txt
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
bash-3.2#
Durante la ricerca nell'intero file system, si sono verificati due errori. Ciascuno è stato inviato a un file separato per una successiva lettura, mentre i risultati restituiti sono stati inseriti in un file di testo separato.
L'invio di stderr a un file di testo può essere utile quando si eseguono operazioni che inviano molti dati al terminale come la compilazione di applicazioni. Ciò consentirà la lettura degli errori che potrebbero perdersi dalla cronologia di scorrimento del terminale.
Una nota quando si passa STDOUT a un file di testo sono le differenze tra >> e >. Il doppio ">>" verrà aggiunto a un file, mentre la forma singolare cancellerà il file e scriverà nuovi contenuti (così tutti i dati precedenti andranno persi).
STDIN
[[email protected] centos]# cat < stdin.txt
Hello,
I am being read form Standard input, STDIN.
[[email protected] centos]#
Nel comando precedente, il file di testo stdin.txt è stato reindirizzato al comando cat che ha ripetuto il suo contenuto su STDOUT .
Il carattere pipe "|"
Il carattere pipe prenderà l'output dal primo comando, passandolo come input nel comando successivo, consentendo al comando secondario di eseguire operazioni sull'output.
Ora, "reindirizza" lo stdout di cat a un altro comando -
[[email protected] centos]# cat output.txt | wc -l
2
[[email protected] centos]#
Sopra, wc esegue i calcoli sull'output di cat passato dal pipe. Il comando pipe è particolarmente utile quando si filtra l'output da grep o egrep -
[[email protected] centos]# egrep "^[0-9]{4}$" /usr/dicts/nums | wc -l
9000
[[email protected] centos]#
Nel comando precedente, abbiamo passato ogni numero di 4 cifre a wc da un file di testo contenente tutti i numeri da 65535 passati attraverso un filtro egrep .
Reindirizzamento dell'output con &
L'output può essere reindirizzato utilizzando il &personaggio. Se vogliamo indirizzare l'output sia STDOUT che STDERR, nello stesso file, può essere realizzato come segue:
[[email protected] centos]# find / -name passwd > out.txt 2>&1
[[email protected] centos]# cat out.txt
find: /dev/fd/3: Not a directory
find: /dev/fd/4: Not a directory
/etc/passwd
[[email protected] centos]#
Reindirizzamento utilizzando il &Il carattere funziona in questo modo: in primo luogo, l'output viene reindirizzato in out.txt . Secondo, STDERR o il descrittore di file 2 viene riassegnato alla stessa posizione di STDOUT, in questo caso out.txt .
Il reindirizzamento è estremamente utile ed è utile durante la risoluzione dei problemi che sorgono durante la manipolazione di file di testo di grandi dimensioni, la compilazione del codice sorgente, il reindirizzamento dell'output negli script della shell e l'emissione di comandi Linux complessi.
Sebbene potente, il reindirizzamento può diventare complicato per i nuovi amministratori CentOS. Pratica, ricerca e domande occasionali a un forum Linux (come Stack Overflow Linux) aiuteranno a risolvere soluzioni avanzate.
Bash Shell Constructs
Ora che abbiamo una buona idea di come funziona la shell Bash , impariamo alcuni costrutti di base, comunemente usati, per scrivere script. In questa sezione esploreremo:
- Variables
- Loops
- Conditionals
- Controllo loop
- Lettura e scrittura su file
- Operazioni matematiche di base
Suggerimenti per la risoluzione dei problemi BASH
BASH può essere un po 'complicato rispetto a un linguaggio di scripting dedicato. Alcuni dei più grandi problemi negli script BASH derivano dall'escape errata o dal mancato passaggio delle operazioni di script passate alla shell. Se hai esaminato uno script alcune volte e non funziona come previsto, non preoccuparti. Questo è comune anche a coloro che usano BASH per creare quotidianamente script complessi.
Una rapida ricerca su Google o l'iscrizione a un forum Linux esperto per porre una domanda porterà a una rapida risoluzione. È molto probabile che qualcuno si sia imbattuto nel problema esatto e che sia già stato risolto.
Lo scripting BASH è un ottimo metodo per creare rapidamente potenti script per qualsiasi cosa, dall'automazione delle attività di amministrazione alla creazione di strumenti utili. Diventare uno sviluppatore di script BASH di livello esperto richiede tempo e pratica. Quindi, usa gli script BASH quando possibile, è un ottimo strumento da avere nella tua casella degli strumenti di amministrazione di CentOS.