Βέλτιστες πρακτικές για τη δημιουργία ενός Shell Script σε GNU / Linux

Συνήθως όταν αρχίζετε να εργάζεστε στο Περιοχή διαχείρισης διακομιστών με λειτουργικά συστήματα GNU / Linux ή / και Unix, κάποιος βρίσκει τον εαυτό του (πρόσωπα) να εργάζεται σε ένα περιβάλλον όπου συνήθως υπάρχει πολλές προγραμματισμένες εργασίες έγραψαν άλλοι διαχειριστές και ότι κάποια στιγμή πρέπει διαχείριση (διαχείριση) για να λύσει οποιοδήποτε πρόβλημα, να βελτιώσει και / ή να εξαλείψει, να συμμορφωθεί με μια νέα απαίτηση του Ιδρύματος όπου εργάζεται. Δεν είναι λοιπόν περίεργο, ότι είναι νέο SysAdmin Σε οποιοδήποτε χώρο εργασίας, είστε αντιμέτωποι με το δυσκίνητο καθήκον να κατανοήσετε μερικά από τα Σενάριο κελύφους δημιουργήθηκε από άλλους παλιό SysAdmin, τα οποία δεν είναι καλά γραμμένα, ή έχουν λογική δομή ή γραφή, δεν είναι εύκολο να κατανοηθούν, ή στη χειρότερη περίπτωση, με εντολές εντολών, άτυπες, παλιές, αναποτελεσματικές ή γραμμένες με αδέξια και σύγχυση.

Shell Scripting

Ενώ επίλυση κακώς γραμμένων σεναρίων είναι πάντα μια στιγμιαία ενόχληση, αυτό διδάσκει σε κανέναν καλό SysAdmin κάτι σημαντικό. Εάν κάποιος πρόκειται να δημιουργήσει ένα Σενάριο κελύφους να χρησιμοποιείται πέρα ​​από σήμερα, είναι πάντα καλύτερο γράψτε τα με πολύ επαγγελματικό και τυποποιημένο τρόπο, έτσι ώστε με την πάροδο του χρόνου, οποιοσδήποτε άλλος, ή ο ίδιος, να μπορεί με το ελάχιστη προσπάθεια και γνώση επιτυγχάνουν κατανόηση και διαχείριση σε ελάχιστο χρόνο.

Ως εκ τούτου, μετά την πρακτική σειρά δημοσιεύσεων στις "Μάθετε Shell Shelling" όπου εξετάζουμε μερικά πολύ πρακτικά σενάρια με απλές και βασικές εντολές, θα ξεκινήσουμε με αυτήν τη νέα σειρά που ονομάζεται "Βέλτιστες πρακτικές για τη δημιουργία ενός Shell Script σε GNU / Linux", όπου θα επικεντρωθούμε διεξοδικά σε κάθε μικρή πτυχή του και τον λόγο για πολλά πράγματα, δηλαδή, θα καλύψουμε μερικές συμβουλές που θα μας κάνουν να κάνουμε καλύτερα σενάρια, αλλά όχι τόσο για τον εαυτό μας, αλλά για το επόμενο άτομο (SysAdmin) που πρέπει να τα διαχειριστεί. Επομένως, δεν χρειάζεται να περάσετε από το κουραστικό και δύσκολο έργο να καταλάβετε τι κωδικοποιώ, πώς και γιατί και γιατί δεν λειτουργεί πλέον.

Σε αυτό πρώτη (1η) ανάρτηση αυτής της νέας σειράς "Βέλτιστες πρακτικές για ένα καλό σενάριο Shell για GNU / Linux" Θα μιλήσουμε για το τι πηγαίνει ή πρέπει να πάει στο Κεφαλίδα Shell Script.

========================================
ΚΕΦΑΛΙ - ΕΠΙΛΟΓΗ ΤΟΥ ΚΟΡΥΦΟΥ
========================================

#! / path / interpret [παράμετρος-όρισμα]

Η κορυφαία γραμμή είναι η βασική δομή με την οποία χρησιμοποιείται ένα Shell Script για GNU / Linux. Τα στοιχεία του μπορούν να περιγραφούν ως εξής:

#! => σα-μπανγκ

Το sha-bang (#!) Στην κορυφή του σεναρίου που δημιουργείται ή πρόκειται να δημιουργηθεί είναι ένα σενάριο που λέει στο λειτουργικό μας σύστημα ότι το αρχείο μας είναι ένα σύνολο εντολών που θα τροφοδοτηθούν (θα ερμηνευτούν) από τον διερμηνέα εντολών που υποδεικνύεται μετά από αυτό. Το ζεύγος χαρακτήρων #! στην πραγματικότητα, είναι ένα μαγικός αριθμός δύο byte, ένας ειδικός δείκτης που ορίστε έναν τύπο αρχείου, και στην περίπτωσή μας, ένα εκτελέσιμο σενάριο κελύφους. Αμέσως μετά το sha-bang έρχεται το όνομα του τη διαδρομή όπου βρίσκεται ο διερμηνέας που θα εκτελεστεί συν το όνομα του εν λόγω διερμηνέα. Με άλλα λόγια, αυτή είναι η διαδρομή προς το πρόγραμμα που ερμηνεύει τις εντολές στο σενάριο, είτε πρόκειται για διερμηνέα, γλώσσα προγραμματισμού ή βοηθητικό πρόγραμμα. Αυτό το κέλυφος στη συνέχεια εκτελεί τις εντολές στο σενάριο, ξεκινώντας από την κορυφή (η γραμμή μετά το sha-bang) και αγνοώντας τυχόν σχόλια. Μερικοί κλαμπ μπορούν να είναι:

#! / Bin / sh
#! / bin / bash
#! / usr / bin / perl
#! / usr / bin / tcl
#! / bin / sed -f
#! / usr / awk -f

Κάθε μία από τις γραμμές που περιγράφονται παραπάνω (ως παράδειγμα) επικαλείται ένα διαφορετικό κέλυφος. Η γραμμή / Bin / sh, επικαλέστε το κέλυφος από προεπιλογή (Bash σε λειτουργικό σύστημα GNU / Linux) ή άλλα παρόμοια. Χρησιμοποιώντας #! / Bin / sh, η προεπιλεγμένη τιμή του Κοχύλι Bourne Στις περισσότερες εμπορικές παραλλαγές των λειτουργικών συστημάτων που βασίζονται στο UNIX, δημιουργεί το σενάριο φορητά σε άλλα λειτουργικά συστήματα που δεν είναι σωστά το Linux, αλλά παρόμοιο ή βασισμένο σε αυτό ή UNIX, αν και αυτό θυσιάζει συγκεκριμένα χαρακτηριστικά του BASH. Ωστόσο, η ακολουθία "#! / Bin / sh" συμμορφώνεται με τον κανόνα Πρότυπο POSIX sh.

σημειώστε ότι η διαδρομή που δίνεται στο sha-bang πρέπει να είναι σωστή, διαφορετικά ένα μήνυμα σφάλματος, συνήθως "Η εντολή δεν βρέθηκε", θα είναι το μόνο αποτέλεσμα της εκτέλεσης σεναρίου. Θυμηθείτε το ζευγάρι χαρακτήρων »#! « Μπορεί να παραλειφθεί εάν το σενάριο αποτελείται μόνο από ένα σύνολο γενικών εντολών Λειτουργικού Συστήματος, δηλαδή χωρίς τη χρήση εσωτερικών οδηγιών Shell. Και να θυμάστε για άλλη μια φορά αυτό »#! / Bin / sh« επικαλείται τον προεπιλεγμένο διερμηνέα κελύφους, από προεπιλογή »#! / Bin / bash« σε μια ομάδα μαζί του Λειτουργικό σύστημα GNU / Linux.

Όσον αφορά τα επιχειρήματα, υπάρχουν πολλά που μπορούν να χρησιμοποιηθούν, αλλά το πιο συνηθισμένο είναι: "-ΜΙ". που κάνει το σενάριο επικυρώστε τα σφάλματα εκτέλεσης οποιασδήποτε εντολήςo (γραμμή εκτέλεσης) και εάν είναι θετικό, αναγκάζει τη στάση και την έξοδο, ένα τυπικό είναι "-ΦΑ" για υποδείξτε το σενάριο για φόρτωση και ένα από τα πιο σπάνια είναι »-Ρμ« που εκτελεί τη διαγραφή του μόλις ολοκληρωθεί η εκτέλεση. Είναι δυνατό μόνο να καθοριστεί στο κλαμπ μέχρι ένα μεμονωμένο όρισμα (παράμετρος) μετά το όνομα του προγράμματος που θα εκτελεστεί.

Και τέλος, πείτε το σενάριο τις καθολικές μεταβλητές που θα χρησιμοποιήσετε σε βασικά μέρη του κώδικα σας, για επικύρωση συμβάντων, όπως η διαδρομή εκτέλεσης, εξουσιοδοτημένος χρήστης, όνομα σεναρίου, μεταξύ άλλων. Και τελειώστε με το δεδομένα του προγράμματος, δημιουργός, οργανισμός, μεταξύ άλλων, καθώς και η αδειοδότηση που ισχύει για το πρόγραμμα.

Οι συμβουλές μου (Βέλτιστες πρακτικές) για να επιλέξετε το καλύτερο sha-bang και επικεφαλίδα α Σενάριο κελύφους ήχου:

#! / usr / bin / env bash

Γιατί να χρησιμοποιήσετε την εντολή »Env« Υποδεικνύουμε στο Λειτουργικό Σύστημα τον διερμηνέα που θα χρησιμοποιείται με την ακριβή διαδρομή που καθορίζεται από αυτό από προεπιλογή, το οποίο μας επιτρέπει να έχουμε κλαμπ που αυξάνει τη φορητότητά του, γιατί δεν είναι καθόλου OS GNU / Linux οι διερμηνείς ή τα προγράμματα έχουν τον ίδιο δρόμο. Και χωρίς επιχειρήματα, γιατί για αυτό είναι καλύτερο να χρησιμοποιήσετε την εντολή σειρά, γιατί μαζί του μπορούμε επικύρωση σφαλμάτων, γενικών (-e) ή ειδικών (+ x / -x), ή προς διαγραφή καθολικών προεπιλογών για περιβάλλον (-i) ή συγκεκριμένες (-u / –unset) μεταβλητές. Και τέλος, να εκτελεί συγκεκριμένες (- o) συμπληρωματικές ενέργειες μέσα στο σενάριο.

Έτσι, ο προτεινόμενος HEADER θα ήταν:

#! / usr / bin / env bash
# Υποδείξτε τον διερμηνέα bash με απόλυτη διαδρομή από το λειτουργικό σύστημα.

σετ -ο errexit
# Για να πείτε στο σενάριο να σταματήσει και να κλείσει όταν αποτύχει μια εντολή ή γραμμή εκτέλεσης.

σύνολο -ο ουσιαστικό
# Για να πείτε στο σενάριο να σταματήσει και να κλείσει όταν το σενάριο προσπαθεί να χρησιμοποιήσει μη δηλωμένες μεταβλητές.

set -o pipefail
# Για να λάβετε την κατάσταση εξόδου της τελευταίας παραγγελίας που επέστρεψε μη μηδενικό κωδικό εξόδου.

# σύνολο -o xtrace
# Για να παρακολουθείτε τι εκτελείται. Χρήσιμο για εντοπισμό σφαλμάτων. Ενεργοποιήστε το για να ελέγξετε μόνο σφάλματα.

Θυμηθείτε να ακολουθήσετε επιπλέον αυτές τις προτάσεις:

01.- Εισαγάγετε τον κωδικό σας: Το να κάνετε τον κώδικα αναγνώσιμο είναι πολύ σημαντικό και είναι κάτι που πολλοί άνθρωποι φαίνεται να ξεχνούν επίσης. Προσπαθήστε να κάνετε τις απαραίτητες εσοχές για να αντιληφθείτε μια καλή λογική δομή.

02.- Προσθήκη χώρων διαχωρισμού μεταξύ τμημάτων κώδικα: Αυτό μπορεί να βοηθήσει να γίνει ο κώδικας πολύ πιο κατανοητός, καθώς η απόσταση από τις ενότητες ή τις ενότητες συμβάλλει στον αναγνώσιμο και την κατανόηση του κώδικα.

03.- Σχολιάστε όσο το δυνατόν περισσότερο σχετικά με τον κωδικό: Στο επάνω μέρος (ή στο κάτω μέρος) κάθε Εντολής Εντολής (Γραμμή Εκτέλεσης) ή Ενότητας Κώδικα, είναι ιδανικό να προσθέσετε μια περιγραφή της λειτουργίας της ακολουθίας ή των εντολών για να εξηγήσετε τι συμβαίνει στον ίδιο τον κώδικα.

04.- Δημιουργήστε μεταβλητές με περιγραφικά ονόματα των λειτουργιών τους: Εκχωρήστε περιγραφικά ονόματα μεταβλητών που προφανώς προσδιορίζουν τη συνάρτηση για την οποία θα δημιουργηθεί. Παρόλο που δημιουργείτε προσωρινές μεταβλητές που δεν θα χρησιμοποιηθούν ποτέ έξω από ένα μοναδικό μπλοκ κώδικα, είναι καλό να προσθέσετε ένα όνομα που εξηγεί σιωπηρά (αντικειμενικά) ποιες τιμές ή λειτουργίες χειρίζεται.

05.- Χρησιμοποιήστε τη σύνταξη VARIABLE = $ (εντολή) για αντικατάσταση εντολών: Εάν θέλετε να δημιουργήσετε μια μεταβλητή της οποίας η τιμή προέρχεται από άλλη εντολή, υπάρχουν δύο τρόποι για να το κάνετε σε bash. Με οπισθοδρόμηση, δηλαδή, με τους χαρακτήρες " , Π.χ .: VARIABLE = «παραμέτρους εντολών-επιλογών», αλλά έχει ήδη καταργηθεί, έτσι η σύνταξη ΔΙΑΦΟΡΑ = $ (εντολή) είναι ο πιο σύγχρονος, αποδεκτός και προτεινόμενος τρόπος. ΟΧΙ -> DATE = `ημερομηνία +% F` / ΝΑΙ -> DATE = $ (ημερομηνία +% F)

06.- Χρησιμοποιήστε λειτουργικές μονάδες επικύρωσης και / ή μεταβλητές Superuser και Authorized User Valid με ή χωρίς κωδικό πρόσβασης: Για να αυξήσετε τα επίπεδα ασφάλειας, εάν είναι απαραίτητο.

07.- Χρησιμοποιήστε ενότητες και / ή μεταβλητές επικύρωσης του λειτουργικού συστήματος (Distro, Version, Architecture): για την αποφυγή χρήσης σε ακατάλληλες πλατφόρμες.

08.- Χρησιμοποιήστε ενότητες (διαδικασίες / ενότητες) για να επιβεβαιώσετε την εκτέλεση κρίσιμων ενεργειών ή παρτίδων (ενότητες / λειτουργίες): Για να ελαχιστοποιήσετε τα λάθη λόγω αυτοσχεδιασμού ή απροσεξίας.

09.- Παρέχετε φιλικές προς το χρήστη διεπαφές (φιλικές προς το χρήστη): Από τερματικό με μενού και χρώματα με διάλογος και Γραφικές διεπαφές για βασικούς χρήστες με Zenity, Gxmessage. Και αν είναι δυνατόν, χρησιμοποιήστε την υποστήριξη ηχητικών ειδοποιήσεων, αναγνωρίζοντας αναγνωρίσιμα συμβάντα σύμφωνα με τον ήχο. Δοκίμασα όσο το δυνατόν περισσότερο το σενάριό σας λειτουργήστε με τους δύο τρόπους απλώς ενεργοποιώντας και απενεργοποιώντας επιλογές / ενότητες / λειτουργίες.

10.- Συμπεριλάβετε μονάδες καλωσορίσματος και αποχαιρετισμού (μηνύματα): εάν είναι απαραίτητο για την αύξηση της αλληλεπίδρασης με τον χρήστη.

11.- Συμπεριλάβετε μια μονάδα επαλήθευσης διπλής εκτέλεσης: Δημιουργήστε ένα αρχείο κλειδώματος για να το αποτρέψετε να εκτελεστεί περισσότερες από 1 φορές την ίδια στιγμή.

12.- Ορθολογισμός του μεγέθους του σεναρίου με εξωτερικές συναρτήσεις ή / και ενότητες: Εάν το σενάριο είναι πολύ μεγάλο, διαιρέστε τον κώδικα χρησιμοποιώντας συναρτήσεις ή διαιρέστε τα σε μικρά σενάρια που καλούνται μέσω ενός κύριου.

13.- Επίκληση με σαφή και προφανή τρόπο οι κλήσεις προς άλλους διερμηνείς (γλώσσες προγραμματισμού) εντός του σεναρίου: Προσκαλέστε τους ξεκάθαρα με γραμμές ή ενότητες

Παράδειγμα:

# ================================================== #
#!/bin/bash
#Llamando a un interprete externo a BASH
echo 'El siguiente texto será mostrado por el interprete de PERL'
perl -e 'print "Este texto es mostrado por un script PERL embebido.\n";'
exit 0
# ==================================================#
# ==================================================# 
#!/bin/bash #Llamando al interprete de Python. 
echo 'El siguiente es un script de python:'
echo print "Hola, mundo!" | tee $HOME/.testpythonbash.py
python $HOME/.testpythonbash.py exit 0
# ==================================================#

# ======================================================= #
#!/bin/bash
# bash-y-perl.sh

echo "Saludos desde la parte BASH del script."
# Es posible añadir mas comandos BASH aqui.

exit 0
# Fin de la parte BASH del script.

###########################################################

#!/usr/bin/perl
# Esta parte del script se invoca con la opcion -x.

print "Saludos desde la parte PERL del script.\n";
# Podemos añadir mas comandos PERL aqui.

# Fin de la parte PERL del script.
# ======================================================= #
 

Σε μελλοντικές δημοσιεύσεις θα επεκτείνουμε με περισσότερες λεπτομέρειες κάθε μία από τις πρακτικές που περιγράφονται παραπάνω.

Και αν γνωρίζετε κάποιες άλλες καλές πρακτικές, τις δικές σας ή άλλες, μην διστάσετε να τις σχολιάσετε για να κάνετε μια πιο ολοκληρωμένη συλλογή!

Μέχρι την επόμενη έκδοση αυτής της νέας σειράς.


Αφήστε το σχόλιό σας

Η διεύθυνση email σας δεν θα δημοσιευθεί. Τα υποχρεωτικά πεδία σημειώνονται με *

*

*

  1. Υπεύθυνος για τα δεδομένα: Miguel Ángel Gatón
  2. Σκοπός των δεδομένων: Έλεγχος SPAM, διαχείριση σχολίων.
  3. Νομιμοποίηση: Η συγκατάθεσή σας
  4. Κοινοποίηση των δεδομένων: Τα δεδομένα δεν θα κοινοποιούνται σε τρίτους, εκτός από νομική υποχρέωση.
  5. Αποθήκευση δεδομένων: Βάση δεδομένων που φιλοξενείται από τα δίκτυα Occentus (ΕΕ)
  6. Δικαιώματα: Ανά πάσα στιγμή μπορείτε να περιορίσετε, να ανακτήσετε και να διαγράψετε τις πληροφορίες σας.

  1.   Max j ​​rodriguez dijo

    Μόνο μια λεπτομέρεια, είναι "shebang" 😛
    πολύ καλή θέση, οι καλές πρακτικές μακροπρόθεσμα βοηθούν πάντα στην τυποποίηση.

  2.   Ένα που πέρασε εδώ dijo

    Το Bash δεν είναι το προεπιλεγμένο κέλυφος σε όλες τις διανομές και, επομένως, ο συμβολικός σύνδεσμος / bin / sh δεν δείχνει πάντα το bash. Στο Debian για παράδειγμα (και υποθέτω συνεπώς το Ubuntu):
    $ ls -l / bin / sh
    lrwxrwxrwx 1 root root 4 aza 8 2014 / bin / sh -> παύλα
    Το προεπιλεγμένο κέλυφος επομένως στο Debian είναι παύλα. Δες εδώ: https://wiki.debian.org/Shell

  3.   ανώνυμος dijo

    Ως συμβουλή για να γνωρίζετε το Shell σε χρήση:

    ηχώ 0 $
    ηχώ $ SHELL
    αποστολή | grep SHELL

  4.   Ινγκ. Jose Albert dijo

    Έχεις δίκιο! Δοκίμασα σε DEBIAN 9 και Kali Linux 2.0 και είναι αλήθεια! σε παίρνει να παύσεις. Ακόμα περισσότερο η πρόταση για: #! / Usr / bin / env bash αν είναι το Shell που θέλετε να χρησιμοποιήσετε.

    Και έχετε απόλυτο δίκιο είναι το shebang, αλλά σε ορισμένους ιστότοπους (τεχνικές λογοτεχνίες) το αποκαλούν shabang ή άλλες λέξεις, εξ ου και η σύγχυση μου. Παράδειγμα:

    Στον υπολογισμό, ένα shebang είναι η ακολουθία χαρακτήρων που αποτελείται από το σύμβολο αριθμών χαρακτήρων και το θαυμαστικό (#!) Στην αρχή ενός σεναρίου. Ονομάζεται επίσης sha-bang, [1] [2] hashbang, [3] [4] pound-bang, [5] ή hash-pling

    Από: https://en.wikipedia.org/wiki/Shebang_%28Unix%29

    Y Κεφάλαιο 2. Ξεκινώντας με ένα Sha-Bang
    Από: http://www.tldp.org/LDP/abs/html/sha-bang.html

  5.   Ινγκ. Jose Albert dijo

    Επίσης: βασικό όνομα $ 0