1.5 Shell scripting
1.5 Shell scripting
1.5.1 Εισαγωγή
Το Shell scripting είναι ένας βασικός μηχανισμός αυτοματοποίησης στον τομέα της πληροφορικής, ιδιαίτερα σε περιβάλλοντα που βασίζονται στο λειτουργικό σύστημα UNIX/Linux. Αποτελεί ένα εργαλείο που επιτρέπει την εκτέλεση εντολών σε αλληλουχία για την υλοποίηση σύνθετων διαδικασιών με χρήση ενός κέλυφους (shell), όπως το Bash, το Zsh, ή το Ksh.
1.5.2 Τι είναι το Shell Scripting;
Το Shell scripting αναφέρεται στη συγγραφή σεναρίων (scripts) που εκτελούνται από έναν διερμηνέα κελύφους. Ένα script είναι ένα αρχείο κειμένου που περιλαμβάνει διαδοχικές εντολές γραμμής εντολών, οι οποίες μπορούν να συνδυαστούν με δομές προγραμματισμού για τη δημιουργία αυτοματοποιημένων διαδικασιών.
Το Shell scripting επιτρέπει την αλληλεπίδραση με το λειτουργικό σύστημα σε χαμηλό επίπεδο και χρησιμοποιείται ευρέως για αυτοματοποίηση, διαχείριση συστημάτων και ανάπτυξη λογισμικού.
1.5.3 Τεχνική Υλοποίηση
Με την έκφραση "Τεχνική Υλοποίηση", αναφερόμαστε στη σύνταξη ενός Shell script. Αυτή εξαρτάται από τον τύπο του κελύφους που χρησιμοποιείται (π.χ., Bash, Zsh, Sh). Ανεξάρτητα από το περιβάλλον, τα βασικά στοιχεία περιλαμβάνουν:
Εντολές Κελύφους: Τα shell scripts περιλαμβάνουν εντολές που εκτελούνται από το κέλυφος (shell) του λειτουργικού συστήματος. Αυτές οι εντολές μπορεί να περιλαμβάνουν εντολές για τη διαχείριση αρχείων, την εκτέλεση προγραμμάτων και την εκτέλεση συστημικών εργασιών.
# Δημιουργία ενός νέου φακέλου mkdir my_folderΣύνταξη: Η σύνταξη των shell scripts διαφέρει ανάλογα με το κέλυφος που χρησιμοποιείται (π.χ., Bash, Zsh, Sh). Κάθε κέλυφος έχει τις δικές του ιδιαιτερότητες και δυνατότητες.
# Ένα απλό script σε Bash #!/bin/bash echo "Hello, World!"Μεταβλητές: Μπορείτε να δηλώσετε και να χρησιμοποιήσετε μεταβλητές για να αποθηκεύσετε δεδομένα και να τα χρησιμοποιήσετε σε διάφορες εντολές. Οι μεταβλητές μπορούν να περιέχουν κείμενο, αριθμούς ή αποτελέσματα εντολών.
# Δημιουργία και χρήση μεταβλητής name="Alice" echo "Hello, $name!"Δομές Ελέγχου: Τα shell scripts υποστηρίζουν δομές ελέγχου όπως
if,for,while, καιcase, που επιτρέπουν την εκτέλεση εντολών υπό συγκεκριμένες συνθήκες ή την επανάληψη εντολών.# Χρήση δομής if number=10 if [ $number -gt 5 ]; then echo "$number είναι μεγαλύτερο από 5" fiΣχόλια: Μπορείτε να προσθέσετε σχόλια στα scripts σας χρησιμοποιώντας το σύμβολο
#. Τα σχόλια είναι χρήσιμα για την τεκμηρίωση του κώδικα και την εξήγηση των λειτουργιών του.# Αυτό είναι ένα σχόλιο echo "Αυτό το script εκτυπώνει ένα μήνυμα"Είσοδος και Έξοδος: Τα shell scripts μπορούν να διαχειρίζονται είσοδο και έξοδο μέσω της κονσόλας ή αρχείων. Μπορείτε να διαβάσετε δεδομένα από το χρήστη ή να γράψετε αποτελέσματα σε αρχεία.
# Ανάγνωση εισόδου από το χρήστη read -p "Ποιο είναι το όνομά σας; " username echo "Γειά σου, $username!"Σφάλματα και Διαχείριση Σφαλμάτων: Είναι σημαντικό να διαχειρίζεστε τα σφάλματα στα scripts σας, χρησιμοποιώντας εντολές όπως
exitκαιtrapγια να ελέγχετε την εκτέλεση και να χειρίζεστε απρόβλεπτες καταστάσεις.# Έλεγχος αν ένα αρχείο υπάρχει filename="myfile.txt" if [ -e $filename ]; then echo "$filename υπάρχει." else echo "$filename δεν υπάρχει." exit 1 fiΕπαναχρησιμοποίηση Κώδικα: Μπορείτε να δημιουργήσετε συναρτήσεις μέσα στα scripts σας για να επαναχρησιμοποιείτε κώδικα και να οργανώνετε καλύτερα τη λογική του script.
# Δημιουργία συνάρτησης function greet { echo "Γειά σου, $1!" } # Κλήση της συνάρτησης greet "Bob"
Tips
Τα scripts ξεκινούν με τη γραμμή shebang #!/bin/sh (ή #!/bin/bash για Bash), που δηλώνει τον διερμηνέα του script.
1.5.3.1 Υποστηριζόμενα Περιβάλλοντα
Τα Shell scripts εκτελούνται σε όλα τα περιβάλλοντα που διαθέτουν έναν διερμηνέα κελύφους:
- Linux: Όλες οι μεγάλες διανομές (Debian, Red Hat, Ubuntu).
- macOS: Περιλαμβάνει υποστήριξη για Bash και Zsh.
- Windows: Μέσω του Windows Subsystem for Linux (WSL) ή εργαλείων όπως το Git Bash και το Cygwin.
1.5.3.2 Απαιτήσεις Γνώσεων
Για την αποτελεσματική συγγραφή Shell scripts, απαιτούνται:
- Καλή γνώση της γραμμής εντολών: Εντολές όπως
ls,cd,cat,grep,echo,touchκ.α. - Κατανόηση εννοιών προγραμματισμού: Μεταβλητές, συνθήκες, επαναλήψεις.
- Γνώση των εργαλείων UNIX/Linux: Για την ενίσχυση της λειτουργικότητας των scripts.
1.5.4 Κύριες Εφαρμογές των Shell Scripts
1.5.4.1 Αυτοματοποίηση Εργασιών (Αντίγραφα Ασφαλείας και Διαχείριση Αρχείων)
Η αυτοματοποίηση επαναλαμβανόμενων εργασιών, όπως η δημιουργία αντιγράφων ασφαλείας και η διαχείριση αρχείων, αποτελεί έναν από τους πιο συνηθισμένους και σημαντικούς τομείς εφαρμογής του Shell scripting. Με τη χρήση εντολών όπως tar, gzip και rsync, τα scripts μπορούν να δημιουργούν αντίγραφα ασφαλείας δεδομένων αυτόματα, να τα συμπιέζουν και να τα μεταφέρουν σε απομακρυσμένους servers ή εξωτερικά μέσα αποθήκευσης. Επιπλέον, παρέχουν δυνατότητες για την προγραμματισμένη εκτέλεση, εξασφαλίζοντας την προστασία των δεδομένων χωρίς την ανάγκη ανθρώπινης παρέμβασης. Στη διαχείριση αρχείων, το Shell scripting αυτοματοποιεί διαδικασίες όπως η οργάνωση, η διαγραφή, και η μετονομασία μεγάλων αριθμών αρχείων, χρησιμοποιώντας εντολές όπως mv, find και rm. Αυτό επιτρέπει την αποδοτική διαχείριση πόρων σε συστήματα παραγωγής και ανάπτυξης. Συνολικά, το Shell scripting βελτιώνει την αποδοτικότητα, μειώνει τον κίνδυνο σφαλμάτων και αυξάνει την αξιοπιστία των κρίσιμων εργασιών συντήρησης σε σύγχρονα συστήματα.
1.5.4.2 Διαχείριση Συστημάτων (Παρακολούθηση Logs και Έλεγχος Συστημάτων)
Τα logs, που αποτελούν βασική πηγή πληροφορίας για τη λειτουργία και την απόδοση του συστήματος, μπορούν να αναλυθούν και να φιλτραριστούν με εργαλεία όπως το grep, το awk και το tail. Για παράδειγμα, ένα script μπορεί να παρακολουθεί σε πραγματικό χρόνο τα logs ενός server (tail -f /var/log/syslog) και να εντοπίζει σφάλματα ή σημαντικά γεγονότα με συγκεκριμένα πρότυπα αναζήτησης (grep "ERROR"). Επιπλέον, το Shell scripting επιτρέπει τον αυτοματοποιημένο έλεγχο συστήματος, όπως η παρακολούθηση της χρήσης πόρων (CPU, RAM, δίσκος) με εντολές όπως top, df, free ή iostat. Μπορούν επίσης να ρυθμιστούν ειδοποιήσεις (alerts) όταν κάποιος πόρος υπερβαίνει ένα προκαθορισμένο όριο. Τα σενάρια (scripts) αυτά είναι ιδανικά για τακτικούς ελέγχους, παραγωγή αναφορών ή ακόμα και για την αυτοματοποίηση επεμβάσεων (π.χ., επανεκκίνηση υπηρεσιών). Έτσι, το Shell scripting παρέχει μια ευέλικτη και προσαρμόσιμη πλατφόρμα για τη βελτιστοποίηση και την ασφάλεια συστημάτων.
1.5.4.3 Επεξεργασία Δεδομένων (Μετασχηματισμός Αρχείων Κειμένου με Χρήση Εργαλείων όπως το sed)
Η επεξεργασία δεδομένων μέσω Shell scripting είναι ιδιαίτερα αποδοτική για την αυτοματοποίηση μετασχηματισμών αρχείων κειμένου, χρησιμοποιώντας εργαλεία όπως το sed (stream editor). Το sed επιτρέπει την επεξεργασία αρχείων γραμμή-προς-γραμμή χωρίς να απαιτείται να τα ανοίξουμε σε περιβάλλον επεξεργασίας κειμένου. Μέσω εντολών όπως αντικατάσταση, διαγραφή ή εισαγωγή γραμμών, καθίσταται δυνατό να επεξεργαστούμε μεγάλους όγκους δεδομένων γρήγορα και με ακρίβεια. Για παράδειγμα, ένα script μπορεί να χρησιμοποιεί το sed για να αντικαταστήσει όλες τις εμφανίσεις μιας λέξης σε ένα αρχείο (sed 's/παλιά_λέξη/νέα_λέξη/g' αρχείο.txt), να αφαιρέσει περιττές γραμμές ή να μορφοποιήσει αρχεία καταγραφής (logs) για ανάλυση. Η δύναμη του sed έγκειται στην ικανότητά του να συνδυάζεται με άλλα εργαλεία όπως το awk, το grep και το cut, επιτρέποντας τον σύνθετο χειρισμό δεδομένων από διαφορετικές πηγές. Έτσι, το Shell scripting προσφέρει έναν ευέλικτο και επεκτάσιμο τρόπο διαχείρισης κειμένου για καθαρισμό, ανάλυση και προετοιμασία δεδομένων σε συστήματα και εφαρμογές.
1.5.4.4 Περιβάλλοντα Ανάπτυξης (Υλοποίηση DevOps Pipelines και Διαχείριση Containers)
Το Shell scripting διαδραματίζει καθοριστικό ρόλο στα σύγχρονα περιβάλλοντα ανάπτυξης λογισμικού, ειδικά στο πλαίσιο του DevOps και της διαχείρισης containerization τεχνολογιών όπως το Docker. Στο DevOps, τα scripts χρησιμοποιούνται για την αυτοματοποίηση των σταδίων ανάπτυξης, ενσωμάτωσης και παράδοσης λογισμικού (CI/CD pipelines). Αυτές οι διαδικασίες περιλαμβάνουν τη διαχείριση κώδικα, τη μεταγλώττιση, τη δοκιμή, τη δημιουργία artifacts και την τελική ανάπτυξη σε servers ή containers. Για παράδειγμα, ένα script μπορεί να τραβάει τον κώδικα από ένα αποθετήριο Git, να το μεταγλωττίζει, να τρέχει αυτοματοποιημένα τεστ και να ανεβάζει τις επιτυχείς εκδόσεις σε μια πλατφόρμα όπως το Kubernetes. Παράλληλα, στον τομέα των containers, τα Shell scripts διευκολύνουν την αυτοματοποίηση στη δημιουργία, τη διαμόρφωση και την εκτέλεση container μέσω εργαλείων όπως το docker-compose ή εντολών Docker CLI. Αυτό περιλαμβάνει ενέργειες όπως η δημιουργία Docker images, η ανάπτυξη πολλαπλών containers με συνδεδεμένα δίκτυα, και η παρακολούθηση της κατάστασης των containers. Με αυτό τον τρόπο, το Shell scripting προσφέρει έναν εύκολο, επαναχρησιμοποιήσιμο και ευέλικτο τρόπο διαχείρισης κρίσιμων διεργασιών ανάπτυξης και υποδομών.
1.5.5 Βασικές Αρχές Συγγραφής Shell Scripts
- Δομή και Σχολιασμός:
Τα scripts πρέπει να είναι ευανάγνωστα και πλήρως σχολιασμένα.
# Δημιουργία backup
tar -czf backup.tar.gz /path/to/data
- Ασφάλεια:
Χρήση βέλτιστων πρακτικών, όπως η αποφυγή εντολών με δικαιώματα root χωρίς επαρκή έλεγχο. - Δοκιμή και Έλεγχος Σφαλμάτων:
Η χρήση εντολών όπωςset -eκαιset -uσυμβάλλει στον εντοπισμό σφαλμάτων κατά την εκτέλεση. - Απλότητα και Λειτουργικότητα:
Ο κώδικας πρέπει να είναι κατανοητός και εύκολα συντηρήσιμος.
1.5.5.1 Παράδειγμα: Δημιουργίας Αντιγράφου Ασφαλείας
Σενάριο
• Σε ένα σύστημα Ubuntu, Θέλουμε να αυτοματοποιήσουμε τη δημιουργία αντιγράφων ασφαλείας για το γονικό φάκελο του χρήστη labrat, σε μια δικτυακή θέση αποθήκευσης (NAS).
• Η ενέργεια αυτή θέλουμε να εκτελείται εβδομαδιαία κάθε Κυριακή στις 23:59 το βράδυ, ακόμα και αν ο υπολογιστής είναι απενεργοποιημένος.
• Το αρχείο πρέπει να είναι εύκολα αναγνωρίσιμο, σε περίπτωση αναζήτησης.
Η σχεδίαση υλοποίησης θα περιλαμβάνει το εργαλείο cron job. Για να καλύψουμε όμως την περίπτωση όπου ο υπολογιστής είναι απενεργοποιημένος τη δεδομένη στιγμή που πρέπει να εκτελεστεί το script, επιβάλλεται να χρησιμοποιήσουμε το anacron αντί για το cron. Το anacron είναι ιδανικό για τέτοιες περιπτώσεις, καθώς εκτελεί εργασίες που έχουν προγραμματιστεί με βάση το χρονικό διάστημα (π.χ., εβδομαδιαία, μηνιαία), ακόμα και αν ο υπολογιστής δεν ήταν ανοιχτός όταν έπρεπε να εκτελεστεί το task. Αυτό σημαίνει ότι το αντίγραφο ασφαλείας θα εκτελείται αμέσως μόλις ο υπολογιστής είναι σε λειτουργία, ακόμα και αν το χρονοδιάγραμμα του cron χάθηκε λόγω της απενεργοποίησης του συστήματος.
1.5.5.2 Δημιουργία του script
Αρχικά, πρέπει να συντάξουμε το script μας έτσι ώστε να μπορεί να εκτελείται μέσω anacron. Επειδή το anacron δεν χρησιμοποιεί τις ίδιες ρυθμίσεις όπως ακριβώς το cron, δεν χρειάζεται να προσδιορίσουμε μια συγκεκριμένη ώρα, αλλά μόνο την περιοδικότητα της εκτέλεσης. Σε κάθε τμήμα του κώδικα πρέπει να εισάγουμε αναλυτικές και ξεκάθαρες σημειώσεις, έτσι ώστε αυτά να είναι ευανάγνωστο, σε περίπτωση επιδιώρθωσης σφαλμάτων.
- 1.1 Με την επόμενη εντολή δημιουργούμε το αρχείο /bin/labrat_backup_script.sh
sudo nano /bin/labrat_backup_script.sh
- 1.2 Στο τερματικό εισάγουμε το επόμενο τμήμα κώδικα και αποθηκεύουμε τις αλλαγές:
#!/bin/bash
# Ορίζουμε το path του γονικού καταλόγου προς αντιγραφή, του χρήστη labrat.
SOURCE_DIR="/home/labrat"
# Ορίζουμε το path του NAS storage (έστω π.χ είναι ο κατάλογοε nas_backups)
DEST_DIR="/mnt/nas_backups"
# Ορίζουμε το όνομα του αντιγράφου με ενσωμάτωση της ημερομηνίας και ώρας δημιουργίας, έτσι ώστε αυτό να είναι αναγνωρίσιμο
BACKUP_NAME="backup_$(date +%d%m%Y%H%M%S).tar.gz"
# Δημιουργούμε τον κώδικα για το αντίγραφο ασφαλείας με την εντολή tar
tar -czf "$DEST_DIR/$BACKUP_NAME" "$SOURCE_DIR"
# Κάνουμε έλεγχο αν η δημιουργία του αντιγράφου ολοκληρώθηκε με επιτυχία, με εμφάνιση μηνύματος στο τερματικό
if [ $? -eq 0 ]; then
echo "Backup completed successfully: $BACKUP_NAME"
else
echo "Backup failed"
fi
- 1.3 Δίνουμε δικαιώματα εκτέλεσης του αρχείου με την εντολή:
sudo chmod +x /bin/labrat_backup_script.sh
1.5.5.3 Ρύθμιση του Anacron
Αντί να χρησιμοποιήσουμε το cron για προγραμματισμένη εκτέλεση, θα χρησιμοποιήσουμε το anacron, το οποίο εξασφαλίζει ότι η εργασία θα εκτελεστεί ακόμα και αν ο υπολογιστής ήταν κλειστός κατά την προγραμματισμένη ώρα.
Για να το κάνουμε αυτό, πρέπει να προσθέσουμε την εργασία στο αρχείο /etc/anacrontab, το οποίο περιέχει τις ρυθμίσεις για το anacron.
2.1 Ανοίγουμε για επεξεργασία το αρχείο
/etc/anacrontabμε την επόμενη εντολή:sudo nano /etc/anacrontab2.2 Προσθέτουμε την παρακάτω γραμμή για να εκτελείται το script κάθε εβδομάδα, ακόμα κι αν ο υπολογιστής ήταν κλειστός:
7 0 backup_weekly /bin/labrat_backup_script.sh
Επεξήγηση γραμμής anacron
- 7: Αντιπροσωπεύει τη συχνότητα εκτέλεσης σε μέρες (7 ημέρες, δηλαδή εβδομαδιαία).
- 0: Είναι η καθυστέρηση εκκίνησης (σε μέρες). Ορίζει ότι το anacron θα εκκινήσει την εργασία αμέσως μόλις ο υπολογιστής ανοίξει, αν η εργασία χάθηκε.
- backup_weekly: Είναι το όνομα της εργασίας. Μπορεί να είναι οποιοδήποτε όνομα, για να αναγνωρίσουμε την εργασία στο μέλλον.
- /path/to/backup_script.sh: Είναι η πλήρης διαδρομή προς το script μας.
1.5.5.4 Τρόπος λειτουργίας
- Το anacron εκτελεί την εργασία όταν ο υπολογιστής είναι ενεργός, ακόμα και αν το χρονικό διάστημα (π.χ., κάθε εβδομάδα) έχει παρέλθει. Αν ο υπολογιστής ήταν κλειστός την καθορισμένη ώρα, η εργασία θα εκτελεστεί μόλις ο υπολογιστής ανοιχτεί την επόμενη φορά.
- Εφόσον το anacron είναι ήδη ενσωματωμένο στο Ubuntu, δεν χρειάζεται να το εγκαταστήσουμε. Απλά το διαμορφώνουμε μέσω του αρχείου
anacrontab.
Με τη χρήση του anacron, μπορούμε να εξασφαλίσουμε ότι τα αντίγραφα ασφαλείας θα δημιουργούνται ακόμη και αν ο υπολογιστής είναι κλειστός τη στιγμή που έχει προγραμματιστεί η εκτέλεση. Αυτό καθιστά το σύστημα πιο ευέλικτο και αξιόπιστο, καθώς το anacron θα αναλάβει την εκτέλεση μόλις το σύστημα είναι σε λειτουργία, χωρίς να χάνονται οι προγραμματισμένες εργασίες.
1.5.6 Εν κατακλείδι...
Το Shell scripting αποτελεί αναπόσπαστο εργαλείο για φοιτητές πληροφορικής, προσφέροντας δυνατότητες αυτοματοποίησης, βελτιστοποίησης διαδικασιών και εμβάθυνσης στη λειτουργία των συστημάτων. Η εκμάθησή του ανοίγει τον δρόμο για πιο αποδοτική διαχείριση συστημάτων και εξειδικευμένες εφαρμογές.