Μετά το εισαγωγικό μας άρθρο, όταν βρισκόμαστε μπροστά στη γραμμή εντολών δεν νιώθουμε χαμένοι. Δεν γνωρίζουμε πολλά αλλά, τέλος πάντων, έχουμε δει τα βασικά κι έχουμε μάθει ορισμένα κολπάκια. Σε αυτό το στάδιο ενδέχεται να μπούμε στον πειρασμό να τροποποιήσουμε διάφορα αρχεία του συστήματος, είτε αυτόβουλα είτε ακολουθώντας τις οδηγίες που διαβάσαμε κάπου. Τα πράγματα σοβαρεύουν λοιπόν και καλό θα ήταν να προχωρήσουμε άμεσα σε πιο προχωρημένες έννοιες.

Στα λειτουργικά συστήματα της οικογένειας του Unix τα ονόματα των αρχείων είναι δυνατό ν’ απαρτίζονται από σχεδόν οποιονδήποτε χαρακτήρα. Σε ό,τι αφορά στα γράμματα χρησιμοποιούνται κατά παράδοση τα πεζά, ενώ υπάρχουν κι ορισμένοι χαρακτήρες που αποφεύγονται δια ροπάλου. Βλέπετε, υπάρχει ένα σύνολο χαρακτήρων –οι λεγόμενοι ειδικοί χαρακτήρες– που τυγχάνουν ξεχωριστής ερμηνείας κι αντιμετώπισης από το κέλυφος. Αν κάποιοι από αυτούς χρησιμοποιούνταν σε ονόματα αρχείων, θα προέκυπταν μεγάλα μπερδέματα. Για να καταλάβετε καλύτερα τι εννοούμε, θα εξετάσουμε τη λειτουργία μερικών ειδικών και συχνά χρησιμοποιούμενων χαρακτήρων.

Αστερίσκος. Εκτελώντας κάτι σαν ls map_of_* εμφανίζονται όλα τα αρχεία που το όνομά τους είναι το map_of_ ή ξεκινά με το map_of_. Ο αστερίσκος λειτουργεί ως μπαλαντέρ κι αντικαθιστά κανέναν, έναν ή περισσότερους χαρακτήρες. Ο αστερίσκος όμως μπορεί να χρησιμοποιηθεί και μόνος του. Σε αυτή την περίπτωση αναφέρεται σε όλα τα αρχεία του τρέχοντος καταλόγου. Για παράδειγμα, αν δώσουμε rm * θα διαγραφούν όλα τα αρχεία του καταλόγου στον οποίο βρισκόμαστε.

Λατινικό ερωτηματικό. Αυτός ο χαρακτήρας λειτουργεί επίσης ως μπαλαντέρ, αλλά υποκαθιστά μόνο έναν χαρακτήρα. Έτσι, αν γράψουμε ls notes? θα εμφανιστούν όλα τα αρχεία που το όνομά τους ξεκινά με το notes κι ολοκληρώνεται με έναν ακόμα χαρακτήρα. Για παράδειγμα, θα εμφανιστούν αρχεία όπως τα notes1, notesd, notesX κ.ο.κ. Αντίθετα, τυχόντα αρχεία με ονόματα όπως notes_1, notes32 κ.λπ. δεν θα εμφανιστούν.

Αγκύλες. Οι αγκύλες χρησιμοποιούνται για τον ορισμό ενός συνόλου (set) ή μιας περιοχής (range) χαρακτήρων. Έτσι, αν εκτελέσουμε το ls doc[a5D1] θα εμφανιστούν τα αρχεία που το όνομά τους ξεκινά με το doc και τελειώνει με κάποιον χαρακτήρα από το σύνολο {a, 5, D, 1}. Αν όμως εκτελέσουμε το ls test[3-7] θα εμφανιστούν τα αρχεία που τo όνομά τους ξεκινά με τη λέξη test και τελειώνει με κάποιον αριθμό από την περιοχή μεταξύ του 3 και του 7 συμπεριλαμβανομένων. Η διαφορά μεταξύ περιοχών και συνόλων σηματοδοτείται από την παρουσία ή την απουσία του χαρακτήρα - (dash).

Θαυμαστικό. Ο συγκεκριμένος χαρακτήρας χρησιμοποιείται για να δηλώσει την άρνηση μιας πρότασης (το αντίθετό της) ή το συμπληρωματικό ενός συνόλου. Η πρώτη χρήση του θαυμαστικού θα φανεί όταν θα μιλήσουμε περί scripting και για τις δομές if. Τα σύνολα όμως τα συναντήσαμε ήδη, με τις αγκύλες. Ας δούμε ένα παράδειγμα: Εκτελώντας το ls ca[!rt] θα εμφανιστούν τα αρχεία που ξεκινούν με το ca, αλλά δεν τελειώνουν με το γράμμα r, ούτε με το t.

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

ls notes??[!d]

Μπορείτε να μαντέψετε την ερμηνεία της; Αν εκτελέσουμε το παραπάνω, θα εμφανιστούν τα αρχεία που το όνομά τους ξεκινά με το notes, συνεχίζει με δύο οποιουσδήποτε χαρακτήρες κι ολοκληρώνεται με έναν ακόμα, ο οποίος όμως είναι διαφορετικός από το d. Εδώ πρέπει να ομολογήσουμε ότι το συγκεκριμένο παράδειγμα δεν έχει καμία πρακτική αξία, αλλά νομίζουμε ότι επιδεικνύει την ευελιξία που προσφέρει η γραμμή εντολών. Τέλος, είναι αυτονόητο ότι η χρήση των ειδικών χαρακτήρων δεν περιορίζεται στο πρόγραμμα ls. Μπορούμε να τους αξιοποιήσουμε σε συνδυασμό με οποιοδήποτε πρόγραμμα αλλά, όπως πάντα, καλό είναι να δείχνουμε μεγάλη προσοχή.

Κρυφά αρχεία κι επεκτάσεις

Αναφερόμενοι στους χαρακτήρες που τυγχάνουν ιδιαίτερης αντιμετώπισης, πρέπει να αναφερθούμε και στην τελεία. Στο προηγούμενο άρθρο, είδαμε ότι η τελεία συμβολίζει τον κατάλογο στον οποίο βρισκόμαστε κάθε φορά. Ωστόσο, αυτή η ερμηνεία ισχύει όταν η τελεία χρησιμοποιείται μόνη της ή μέσα σε κάποια διαδρομή καταλόγων. Ο ίδιος χαρακτήρας αποκτά εντελώς διαφορετικό όνομα, όταν χρησιμοποιείται στα ονόματα των αρχείων. Συγκεκριμένα, όταν η τελεία βρίσκεται στην αρχή ενός ονόματος, το αντίστοιχο αρχείο θεωρείται κρυφό. Έτσι, αν εκτελέσουμε το πρόγραμμα ls και παραλείψουμε την παράμετρο -a (all), τα αρχεία που το όνομά τους ξεκινά με τελεία δεν θα εμφανιστούν, ακόμη κι αν υπάρχουν. Σε οποιοδήποτε άλλο σημείο ενός ονόματος, η τελεία δεν σημαίνει απολύτως τίποτα. Πρακτικά, αυτό συνεπάγεται ότι η έννοια της λεγόμενης επέκτασης (π.χ., .exe, .com κ.λπ.) δεν υφίσταται στο Linux. Γενικά, τα συστήματα Unix δεν στηρίζονται στην ονομασία των αρχείων για να εντοπίσουν τον τύπο τους. Εντούτοις, για τη δική μας ευκολία και μόνο, οι επεκτάσεις χρησιμοποιούνται συχνά. Για παράδειγμα, τα αρχεία με κώδικα C καταλήγουν σε .c, ενώ τα αρχεία επικεφαλίδας (header files) χρησιμοποιούν το .h. Αυτή πρακτική εξυπηρετεί την εύκολη διάκριση των αρχείων από το χρήστη, αλλά δεν επηρεάζει τη συμπεριφορά του συστήματος απέναντι στο εκάστοτε αρχείο.

Δικαιώματα χρήσης

Σε ένα λειτουργικό σύστημα που χρησιμοποιείται από πολλούς χρήστες, είναι λογικό να απαγορεύεται η μη εξουσιοδοτημένη πρόσβαση στα ξένα αρχεία (σ’ εκείνα άλλων χρηστών, δηλαδή), καθώς επίσης και σε εκείνα που θεωρούνται κρίσιμα για τη λειτουργία του συστήματος. Για το σκοπό αυτό, κάθε αρχείο συνοδεύεται από ένα ξεχωριστό σύνολο δικαιωμάτων πρόσβασης. Το εν λόγω σύνολο προσδιορίζει με σαφήνεια το ποιος μπορεί να αλληλεπιδράσει με το εκάστοτε αρχείο, καθώς και με ποιον τρόπο. Για να δούμε τις σχετικές άδειες ενός αρχείου (file permissions), αρκεί να εκτελέσουμε το προγραμματάκι ls με την παράμετρο -l (list). Κατά τα γνωστά, αυτό θα έχει σαν συνέπεια την εμφάνιση μιας λίστας με τα αρχεία του τρέχοντος καταλόγου. Οι γραμμές αυτής της λίστας θα μοιάζουν με την ακόλουθη:

-rwxrw-r--  1 pvar pvar  530 2012-12-01 19:23 some_random_file

Οι πληροφορίες που περιγράφουν τα δικαιώματα πρόσβασης συμπυκνώνονται στην πρώτη, στην τρίτη και στην τέταρτη στήλη. Σημειώνουμε εδώ ότι ο πρώτος χαρακτήρας από αριστερά δηλώνει τη “φύση” του αρχείου και δεν σχετίζεται με το θέμα μας. Θα αναφερθούμε αργότερα στα διάφορα είδη αρχείων και για την ώρα μπορείτε να ξεχάσετε το όλο ζήτημα. Πριν δούμε τα file permissions θα θέλαμε να μιλήσουμε λίγο για θέματα ιδιοκτησίας των αρχείων (file ownership). Προσέξτε τα ονόματα στην τρίτη και στην τέταρτη στήλη. Εκείνο της τρίτης αναφέρεται στον ιδιοκτήτη του αρχείου. Με άλλα λόγια, σε εκείνον που το δημιούργησε ή το αντέγραψε στην τρέχουσα θέση του. Το όνομα της τέταρτης στήλης δηλώνει την ομάδα χρηστών (user group), στην οποία ανήκει το αρχείο. Στα συστήματα Unix, βλέπετε, οι χρήστες ανήκουν σε μία ή σε περισσότερες ομάδες χρηστών. Όπως θα φανεί στη συνέχεια, το γεγονός αυτό εξυπηρετεί στη διαχείριση των δικαιωμάτων πρόσβασης και των πόρων του συστήματος γενικότερα. Έχετε υπόψη πως κατά τη δημιουργία ενός user account δημιουργείται σχεδόν πάντα κι ένα ομώνυμο user group. Από τα δύο ονόματα που εμφανίζονται στο παράδειγμά μας, συμπεραίνουμε ότι το αρχείο some_random_file ανήκει στο χρήστη pvar, καθώς και στην ομώνυμη ομάδα χρηστών. Τι σημαίνουν όλα αυτά, όμως; Μήπως ο ιδιοκτήτης έχει τα ίδια δικαιώματα με εκείνα που έχουν τα υπόλοιπα μέλη της ομάδας; Φυσικά και όχι. Τα δικαιώματα που έχει ο ιδιοκτήτης, τα μέλη της αντίστοιχης ομάδας αλλά και κάθε άλλος, άσχετος χρήστης, περιγράφονται ξεχωριστά. Συγκεκριμένα, όλα αυτά περιγράφονται από τους χαρακτήρες της πρώτης στήλης. Εκεί, εξαιρώντας τον πρώτο χαρακτήρα, παρατηρούμε ότι απομένουν άλλοι εννέα. Από αυτούς, οι πρώτοι τρεις περιγράφουν τα δικαιώματα του ιδιοκτήτη. Οι επόμενοι τρεις περιγράφουν τα δικαιώματα της ομάδας στην οποία ανήκει το αρχείο, ενώ οι τρεις τελευταίοι περιγράφουν τα δικαιώματα πρόσβασης των υπολοίπων χρηστών του συστήματος. Νομίζουμε ότι αυτή η περιγραφή ρίχνει αρκετό φως στην υπόθεση, αλλά δεν ξεκαθαρίζει το θέμα. Για να καταλάβουμε τελικά τι παίζει, πρέπει να δώσουμε και την ερμηνεία καθενός χαρακτήρα, ξεχωριστά.

r: Προέρχεται από τη λέξη read κι αναφέρεται στο δικαίωμα ανάγνωσης. Όταν τον συναντάμε σε μια τριάδα, ο ιδιοκτήτης ή οι αντίστοιχοι χρήστες έχουν δικαίωμα να διαβάζουν το αρχείο.

w: Προέρχεται από τη λέξη write και συμβολίζει τη δυνατότητα εγγραφής. Οι χρήστες που έχουν δικαίωμα εγγραφής μπορούν να τροποποιούν ελεύθερα το εκάστοτε αρχείο, ακόμη και να το διαγράψουν. Ωστόσο, μόνον ο ιδιοκτήτης μπορεί να μεταβάλλει τα δικαιώματα πρόσβασης.

x: Προκύπτει από την λέξη execute κι έχει διπλό νόημα: Στην περίπτωση των προγραμμάτων αναφέρεται στο δικαίωμα εκτέλεσης, ενώ στην περίπτωση των καταλόγων αναφέρεται στο δικαίωμα εισόδου στον συγκεκριμένο κατάλογο.

Ας ξαναδούμε το παράδειγμα με τα δικαιώματα πρόσβασης ενός τυχαίου αρχείου:

-rwxrw-r--  1 pvar pvar  530 2012-12-01 19:23 some_random_file

Αναρωτιέστε τι σημαίνουν οι παύλες; Τα γράμματα r, w και x εμφανίζονται πάντα με τη σειρά που τα αναφέραμε. Επομένως, σε οποιαδήποτε θέση συναντάμε μια παύλα, υπονοείται η στέρηση του αντίστοιχου δικαιώματος. Αν μπερδευτήκατε μην ανησυχείτε, συμβαίνει σ’ όλους στην αρχή. Στη συνέχεια θα εξετάσουμε τους χαρακτήρες που εμφανίζονται στο παράδειγμα και να είστε σίγουροι ότι θα ξεκαθαρίσουν όλα.

Η πρώτη τριάδα είναι πλήρης (rwx) κι αυτό σημαίνει ότι ο ιδιοκτήτης του αρχείου έχει πλήρη δικαιώματα πρόσβασης. Βέβαια, ακόμα κι αν ο ιδιοκτήτης δεν είχε πλήρη δικαιώματα, θα μπορούσε να τα τροποποιήσει – τι σόι ιδιοκτήτης θα ήταν, διαφορετικά; Στην επόμενη τριάδα παρατηρούμε ότι απουσιάζει το δικαίωμα εκτέλεσης (rw-). Αυτό σημαίνει ότι οι χρήστες που ανήκουν στην ομάδα pvar μπορούν να διαβάζουν και να τροποποιούν το αρχείο some_random_file, ελεύθερα. Ωστόσο, αν πρόκειται για πρόγραμμα ή script, απαγορεύεται να το εκτελέσουν. Η τρίτη τριάδα προσφέρει μόνο το δικαίωμα ανάγνωσης (r--). Έτσι, οι υπόλοιποι χρήστες του συστήματος μπορούν μόνο να διαβάζουν το some_random_file.

Μεταβολή των δικαιωμάτων πρόσβασης

Όπως αναφέραμε ήδη, ο ιδιοκτήτης ενός αρχείου μπορεί να μεταβάλλει τα σχετικά δικαιώματα πρόσβασης κατά βούληση. Εδώ όμως χρειάζεται λίγη προσοχή: Ένας απλός χρήστης είναι αδύνατο να αλλάξει τον ιδιοκτήτη ή την ομάδα χρηστών ενός αρχείου, ακόμα κι αν το αρχείο αποτελεί ιδιοκτησία του. Η αλλαγή του ιδιοκτήτη και της ομάδας χρηστών προϋποθέτει αυξημένα δικαιώματα πρόσβασης στο λειτουργικό σύστημα. Για το λόγο αυτό, όταν δεν χρησιμοποιούμε το λογαριασμό του root, που εξ ορισμού είναι ο διαχειριστής του συστήματος, πρέπει να αξιοποιούμε τον όποιο μηχανισμό αναβάθμισης δικαιωμάτων που προσφέρει το λειτουργικό μας. Σε πολλές σύγχρονες διανομές Linux, η αναβάθμιση επιτυγχάνεται με τη βοήθεια του προγράμματος sudo. Σε γενικές γραμμές, η χρήση του περιγράφεται από το εξής μοτίβο:

sudo πρόγραμμα_που_απαιτεί_αυξημένα_δικαιώματα παράμετροι_προγράμματος

Εκτελώντας κάτι σαν το παραπάνω, το σύστημα θα ζητήσει να πληκτρολογήσουμε τον κωδικό πρόσβασης του χρήστη μας ή εκείνον του διαχειριστή (αναλόγως των ρυθμίσεων που έχει κάνει ο τελευταίος). Το πρόγραμμα, μαζί με τις παραμέτρους που δώσαμε, θα εκτελεστεί με αναβαθμισμένα δικαιώματα αλλά αφού εισάγουμε σωστά τον κωδικό. Βεβαίως, το sudo δεν μπορεί να το χρησιμοποιεί ο καθένας. Το ποιοι μπορούν το ορίζει ο διαχειριστής, δηλαδή ο root. Μετά από αυτή την παρένθεση, μπορούμε να επιστρέψουμε στο θέμα μας.

Μεταβολή του ιδιοκτήτη. Για το σκοπό αυτό προσφέρεται το πρόγραμμα chown (από το change owner). Συγκεκριμένα, για να μεταφέρουμε το αρχείο notes στην ιδιοκτησία του cvar, πρέπει να εκτελέσουμε το εξής:

sudo chown cvar notes

Μεταβολή της ομάδας. Αυτή τη φορά πρέπει να χρησιμοποιήσουμε το chgrp (από το change group). Η σύνταξη που ακολουθούμε παραμένει ίδια. Για να αλλάξουμε την ομάδα του αρχείου notes από pvar σε cvar, αρκεί να εκτελέσουμε αυτό:

sudo chgrp cvar notes

Μεταβολή επιμέρους δικαιωμάτων. Γι’ αυτή την επέμβαση πρέπει να χρησιμοποιήσουμε το εργαλείο chmod (από το change mode). Εδώ όμως τα πράγματα περιπλέκονται λίγο. Πώς θα περιγράψουμε την ακριβή μεταβολή που θέλουμε να επιφέρουμε; Αρχικά, να πούμε ότι το chmod υποστηρίζει δύο συντακτικά κι ότι εμείς θα ασχοληθούμε με το πολύπλοκο. Αυτό δεν το κάνουμε γιατί μας αρέσει να παιδευόμαστε, αλλά γιατί θεωρούμε ότι το συγκεκριμένο συντακτικό είναι πληρέστερο. Μπορεί να είναι και λίγο πιο μακριά από την ανθρώπινη λογική, αλλά από την άλλη είναι και πιο ακριβές:

chmod xyz όνομα_αρχείου

Τα x, y και z είναι αριθμητικά ψηφία. Το x περιγράφει τα δικαιώματα πρόσβασης για τον ιδιοκτήτη, το y αναφέρει τα δικαιώματα πρόσβασης για την ομάδα χρηστών, ενώ το z προσδιορίζει τα δικαιώματα πρόσβασης των υπολοίπων. Όμως ποιες τιμές μπορούν να πάρουν αυτά τα ψηφία και πώς προκύπτουν;

Φανταστείτε κάθε τριάδα χαρακτήρων που αναφέρεται στα δικαιώματα (r, w, x) σαν έναν τριψήφιο αριθμό του δυαδικού συστήματος. Όταν παρέχεται κάποιο από αυτά τα δικαιώματα, το αντίστοιχο ψηφίο είναι 1, ενώ όταν στερείται το δικαίωμα το ψηφίο είναι 0. Για παράδειγμα, όταν παρέχονται και τα τρία δικαιώματα (rwx) ο υποτιθέμενος αριθμός στο δυαδικό έχει τη μορφή 111. Όταν παρέχονται μόνο τα δικαιώματα ανάγνωσης και εκτέλεσης (r-x) ο αριθμός γίνεται 101, ενώ όταν επιτρέπεται μόνο η ανάγνωση (r--) ο αριθμός γίνεται 100. Κάπου εδώ νομίζουμε ότι το παραπάνω σκεπτικό έγινε ξεκάθαρο. Τώρα, αν μετατρέψουμε αυτόν τον αριθμό στο δεκαδικό, θα βρούμε την τιμή που πρέπει να αποδώσουμε σε καθένα από τα x, y και z. Ας δούμε ένα παράδειγμα: Αν θελήσουμε α) να δώσουμε πλήρη δικαιώματα στον ιδιοκτήτη (111 στο δυαδικό = 7 στο δεκαδικό), β) μόνο ανάγνωση και εγγραφή για τα μέλη της ομάδας (110 στο δυαδικό = 6 στο δεκαδικό) και γ) μόνο ανάγνωση για τους υπόλοιπους (100 στο δυαδικό = 4 στο δεκαδικό), αρκεί να γράψουμε κάτι τέτοιο:

chmod 764 όνομα_αρχείου

Δανεικά δικαιώματα

Ορισμένα προγράμματα επεμβαίνουν σε κρίσιμα για την ασφάλεια του συστήματος αρχεία. Χαρακτηριστικό παράδειγμα αποτελεί το passwd, το οποίο μπορεί να τρέξει οποιοσδήποτε χρήστης για να μεταβάλλει τον κωδικό του. Το συγκεκριμένο πρόγραμμα επεμβαίνει στο αρχείο με τους κωδικούς όλων των χρηστών του συστήματος. Δεν είναι λίγο επικίνδυνο αυτό; Κανονικά, θα περίμενε κανείς ότι το πρόγραμμα passwd μπορεί να εκτελεστεί μόνον από το διαχειριστή του συστήματος, εφόσον μόνον αυτός μπορεί να τροποποιήσει το αρχείο με τους κωδικούς των χρηστών. Εντούτοις, αν δοκιμάσουμε να τρέξουμε το passwd θα διαπιστώσουμε ότι η λειτουργία του ξεκινά χωρίς να μας ζητηθεί ο κωδικός του διαχειριστή. Προφανώς, αυτό συμβαίνει ώστε όλοι οι χρήστες να μπορούν να αλλάζουν τον κωδικό τους εύκολα. Πώς όμως μπορεί ένας απλός χρήστης να εκτελεί ένα πρόγραμμα, το οποίο φέρει τα δικαιώματα του διαχειριστή; Η απάντηση βρίσκεται στα δικαιώματα χρήσης του εν λόγω προγράμματος – και συγκεκριμένα στο λεγόμενο SUID bit. Παρατηρώντας τις ιδιότητες του προγράμματος passwd, βλέπουμε:

-rwsr-xr-x  1 root root 66040 2012-12-01 21:40 passwd

Προσέξτε ότι στα δικαιώματα του ιδιοκτήτη ο χαρακτήρας x έχει αντικατασταθεί από τον χαρακτήρα s. Αυτό σημαίνει ότι το πρόγραμμα θα εκτελείται πάντα με τα δικαιώματα πρόσβασης του ιδιοκτήτη, ανεξάρτητα από το ποιος το κάλεσε. Στην περίπτωση του passwd ιδιοκτήτης είναι ο χρήστης root, δηλαδή ο διαχειριστή του συστήματος. Έτσι, οποιοσδήποτε κι αν τρέξει το passwd το πρόγραμμα θα λειτουργήσει με τα δικαιώματα του διαχειριστή του συστήματος.

Πολλαπλή προσωπικότητα

Στον κόσμο του Linux υπάρχει ένα ρητό: Καθετί που δεν είναι αρχείο, είναι διεργασία. Πράγματι, για τα λειτουργικά συστήματα τύπου Unix τα αρχεία δεν είναι τίποτα άλλο παρά μία αλληλουχία χαρακτήρων (character streams). Απόρροια αυτού του αφηρημένου ορισμού είναι η γενικευμένη χρήση της έννοιας του αρχείου, σε κάθε πτυχή του λειτουργικού συστήματος. Στη συνέχεια θα γνωρίσουμε τα βασικότερα είδη αρχείων. Η εξοικείωση μαζί τους αποτελεί σημαντικό βήμα για την εξοικείωση με τη γραμμή εντολών του Linux.

Regular files. Σ’ αυτή την κατηγορία ανήκουν τα γνωστά μας αρχεία: Τα προγράμματα και τα scripts, τα τραγούδια, τα βίντεο, οι φωτογραφίες και τα κείμενα. Με απλά λόγια, regular files ονομάζονται εκείνα που παραπέμπουν προς οποιουδήποτε είδους πληροφορίες που είναι αποθηκευμένες σε κάποιο μέσο (π.χ., σκληρό δίσκο, δίσκο DVD, USB flash κ.λπ.).

Directories. Οι κατάλογοι δεν είναι τίποτα άλλο παρά ένα ακόμα είδος αρχείων. Ωστόσο, οι κατάλογοι δεν παραπέμπουν προς μια περιοχή με δεδομένα, αλλά σε ένα σύνολο αρχείων. Εν ολίγοις, θα λέγαμε ότι οι κατάλογοι είναι αρχεία που περιέχουν τα ονόματα και τη θέση άλλων αρχείων.

Links. Αυτή η κατηγορία χωρίζεται σε δύο επιμέρους. Στη μία ανήκουν τα symbolic links και στην άλλη τα hard links. Για να κατανοήσουμε τη διαφορά τους πρέπει να έχουμε υπόψη μας τα εξής: Όλα τα file systems χρησιμοποιούν μια δομή δεδομένων (συνήθως πρόκειται για δένδρο) εντός της οποίας διατηρούν πληροφορίες για τα διάφορα αρχεία. Μεταξύ άλλων, για κάθε απλό αρχείο αποθηκεύεται το όνομά του κι ένας δείκτης. Αυτός ο δείκτης παραπέμπει στην περιοχή του αποθηκευτικού μέσου, όπου βρίσκονται τα δεδομένα του αρχείου. Ας επιστρέψουμε τώρα στα δύο είδη συνδέσμων. Ένα symbolic link αποτελεί την παραπομπή από ένα σημείο της δομής δεδομένων του συστήματος αρχείων, προς κάποιο άλλο σημείο της. Με απλά λόγια, τα symbolic links αποτελούν αρχεία που παραπέμπουν προς άλλα αρχεία. Τελικά, τα symbolic links μοιάζουν με αντίγραφα του αυθεντικού αρχείου. Ωστόσο, αν χαθεί το αυθεντικό, τα symbolic links χάνουν το στόχο τους και παραπέμπουν, πλέον, στο πουθενά. Αυτό σημαίνει ότι αχρηστεύονται. Τα hard links είναι κάτι πολύ διαφορετικό. Αποτελούν νέες εγγραφές στη δομή δεδομένων του συστήματος αρχείων. Από τη σκοπιά του συστήματος αρχείων, λοιπόν, τα hard links δεν διαφέρουν σε τίποτα από τα υπόλοιπα αρχεία. Ωστόσο, τα hard links δεν παραπέμπουν σε δικές τους περιοχές δεδομένων, αλλά σε εκείνες κάποιων άλλων αρχείων. Αν φτιάξουμε ένα hard link προς κάποιο αρχείο, τo hard link θα αποτελεί μια νέα κι ανεξάρτητη οντότητα, η οποία όμως θα παραπέμπει στα ίδια δεδομένα με το αυθεντικό αρχείο. Αυτό έχει σαν συνέπεια το hard link και το αντίστοιχο αρχείο να εμφανίζονται πάντα σαν δύο πανομοιότυπα αρχεία. Αν επέμβουμε στο αυθεντικό αρχείο το αντίστοιχο hard link θα ενημερωθεί ακαριαία, εφόσον δείχνει στην ίδια περιοχή δεδομένων. Επιπρόσθετα, αν σβήσουμε το αυθεντικό αρχείο, το hard link θα εξακολουθήσει να υπάρχει και θα διατηρεί τα δεδομένα του κανονικά.

Device files. Όπως είπαμε παραπάνω, για το Linux τα αρχεία δεν είναι τίποτα παραπάνω από αλληλουχίες χαρακτήρων. Επίσης, αν κι αυτό είναι προφανές, ένα αρχείο μπορεί να λειτουργεί ως αποδέκτης χαρακτήρων (όταν αποθηκεύουμε δεδομένα σ’ αυτό) ή ως πηγή χαρακτήρων (όταν το διαβάζουμε). Σας θυμίζουν τίποτε όλα αυτά; Με άλλα λόγια, η συμπεριφορά των αρχείων θυμίζει την αφηρημένη περιγραφή μιας συσκευής. Εξαιτίας αυτής της ομοιότητας, η επικοινωνία του συστήματος με τα διάφορα τμήματα του hardware επιτυγχάνεται με τη βοήθεια των ίδιων μηχανισμών, οι οποίοι χειρίζονται και τα αρχεία. Έτσι, για κάθε συσκευή που θα μπορούσε να συνδεθεί στον υπολογιστή μας, το Linux δημιουργεί ένα αντίστοιχο αρχείο. Ο λόγος γίνεται για τα λεγόμενα αρχεία συσκευών (device files), που βρίσκονται στον κατάλογο /dev.

Pipe files. Κάθε λειτουργικό σύστημα προσφέρει τουλάχιστον έναν μηχανισμό για την επικοινωνία μεταξύ των εφαρμογών. Έναν από αυτούς αποτελεί η λεγόμενη διασωλήνωση (pipelining). Τα pipe files, λοιπόν, αποτελούν βασικά εξαρτήματα του εν λόγω μηχανισμού και λειτουργούν σαν διαμεσολαβητές, για τη μεταφορά δεδομένων από τη μία διεργασία στην άλλη. Η ύπαρξή τους, αν και δεν γίνεται άμεσα αντιληπτή, αποτελεί έναν από τους παράγοντες που προσφέρουν απεριόριστη ισχύ στη γραμμή εντολών του Linux. Για την αξία της διασωλήνωσης και το πώς αξιοποιείται θα μιλήσουμε σε επόμενο άρθρο της σειράς.

Η φύση των αρχείων σε έναν χαρακτήρα

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

-: Ένα απόλυτα φυσιολογικό αρχείο, τύπου regular. Τέτοια είναι τα αρχεία κειμένου, τα βίντεο, τα τραγούδια, οι φωτογραφίες, τα προγράμματα και πάει λέγοντας.

d: Ένας κατάλογος.

l: Σύνδεσμος τύπου symbolic. Για τα hard links χρησιμοποιείται και πάλι η παύλα (-).

c: Αρχείο συσκευής (device file), στο οποίο τα δεδομένα μεταφέρονται χαρακτήρα προς χαρακτήρα. Χαρακτηριστικό παράδειγμα αποτελούν τα device files που χρησιμοποιούνται για τις συσκευές αναπαραγωγής ήχου.

b: Αρχείο συσκευής (device file), στο οποίο τα δεδομένα ταξιδεύουν ανά ομάδες (block) χαρακτήρων. Χαρακτηριστικό παράδειγμα αποτελούν τα device files που χρησιμοποιούνται για τις συσκευές αποθήκευσης (σκληροί δίσκοι, CD/DVD κ.λπ.).

p: Αρχεία διασωλήνωσης (pipe files).

Μέχρι στιγμής έχουμε ασχοληθεί μόνο με τα απλά αρχεία και με τους καταλόγους. Επομένως, είναι φυσιολογικό το να μην αναγνωρίζετε τα υπόλοιπα είδη και δεν θα πρέπει να αγχώνεστε. Στο κάτω-κάτω, τι νομίζετε ότι θα συζητήσουμε στη συνέχεια του άρθρου και στα επόμενα;

Δημιουργία συνδέσμων

Όσο ασχολείται κανείς με τη γραμμή εντολών, τόσο διαπιστώνει πόσο μεγάλη είναι η χρησιμότητα των links (hard και symbolic). Για να αναδειχθεί η χρησιμότητα των δύο ειδών links, μπορούμε να κάνουμε στο μυαλό μας τις εξής απλουστεύσεις: Αφενός, ας φανταστούμε τα symbolic links ως τα shortcuts που δημιουργούνται στα Windows. Αφετέρου, τα hard links μοιάζουν με ζωντανά αντίγραφα των αρχείων μας, τα οποία ενημερώνονται αυτόματα για όποιες αλλαγές κάνουμε στα πρωτότυπα. Επιπρόσθετα, αν διαγράψουμε κατά λάθος κάποιο από τα πρωτότυπα αρχεία, το αντίστοιχο hard link θα παραμείνει ενεργό και πλήρως λειτουργικό.

Για να δημιουργήσουμε ένα link καταφεύγουμε στο προγραμματάκι ln. Ας δούμε μερικά παραδείγματα. Υποθέστε ότι θέλουμε να δημιουργήσουμε μια συντόμευση εντός του home directory, προς τον κατάλογο /home/pvar/projects/deltacast/videos/final. Για να πετύχουμε κάτι τέτοιο αρκεί να εκτελέσουμε το εξής:

ln -s /home/pvar/projects/deltacast/videos/final ~/episodes

Με αυτόν τον τρόπο, στον προσωπικό μας κατάλογο θα δημιουργηθεί ένας κατάλογος με το όνομα episodes. Όπως υποψιάζεστε, αν μπούμε σ’ αυτόν τον κατάλογο θα βρούμε τα περιεχόμενα του /home/pvar/projects/deltacast/videos/final. Ας υποθέσουμε τώρα ότι θέλουμε να διατηρούμε μονίμως ένα εφεδρικό αντίγραφο του κειμένου ~/projects/deltacast/epguide.txt. Για να πετύχουμε κάτι τέτοιο, αρκεί να δημιουργήσουμε ένα hard link προς το συγκεκριμένο αρχείο. Θα πρέπει να δώσουμε κάτι τέτοιο:

ln ~/projects/deltacast/epguide.txt ~/documents/.epguide.backup.txt

Με αυτό τον τρόπο, στον κατάλογο documents (εντός του home directory) θα δημιουργηθεί ένα hard link του epguide.txt. Το hard link θα ονομάζεται .epguide.backup.txt κι εφόσον του δώσαμε όνομα που ξεκινάει με τελεία, θα είναι και κρυφό αρχείο. Πλέον, μπορούμε να είμαστε ήσυχοι ότι οι ιδέες μας για τα μελλοντικά deltaCasts δεν θα χαθούν. Πράγματι, ακόμη κι αν σβήσουμε το epguide.txt κατά λάθος, θα έχουμε ανέπαφο και πλήρως ενημερωμένο το hard link.

Προσάρτηση USB stick

Στο προηγούμενο άρθρο της σειράς κάναμε λόγο για το πώς βλέπουμε τα περιεχόμενα μιας κατάτμησης. Αναφερθήκαμε στην προσάρτηση (mount) και στους καταλόγους προσάρτησης (mount points). Βέβαια, η περιγραφή μας ήταν επιφανειακή και δεν άγγιξε καθόλου την ίδια τη διαδικασία της προσάρτησης (mounting). Εδώ που τα λέμε, η προσάρτηση των κατατμήσεων των μόνιμων αποθηκευτικών μέσων πραγματοποιείται λίγο-πολύ αυτόματα. Παρ’ όλα αυτά, η χειροκίνητη προσάρτηση παρουσιάζει ιδιαίτερο ενδιαφέρον. Υπάρχουν ορισμένες περιπτώσεις, βλέπετε, κατά τις οποίες η προσάρτηση δεν γίνεται αυτόματα. Αναφερόμαστε στη σύνδεση ενός USB stick, ενός εξωτερικού δίσκου ή και μιας κάρτας μνήμης. Σε κάθε μία από αυτές τις περιπτώσεις, η λογική που ακολουθούμε είναι πανομοιότυπη. Στη συνέχεια λοιπόν θα υποθέσουμε ότι συνδέσαμε ένα USB stick και θέλουμε να το προσαρτήσουμε χειροκίνητα.

Όπως έχουμε πει, η προσάρτηση μιας κατάτμησης πραγματοποιείται σε έναν κατάλογο – κατά προτίμηση κενό. Επομένως, για την προσάρτηση του USB stick μπορούμε να ξεκινήσουμε δημιουργώντας έναν νέο κατάλογο, ο οποίος θα χρησιμοποιηθεί ως mount point. Ακολουθώντας την παράδοση, θα δημιουργήσουμε τον εν λόγω κατάλογο εντός του /mnt:

sudo mkdir /mnt/my_usb

Η χρήση του sudo είναι απαραίτητη, διότι οι απλοί χρήστες δεν έχουν δικαίωμα εγγραφής εντός του καταλόγου /mnt. Τώρα που διαθέτουμε τον κατάλογο για την προσάρτηση, δηλαδή τον /mnt/my_usb, μένει να μάθουμε και το όνομα της κατάτμησης. Στην εργασία αυτή θα μας βοηθήσει το πρόγραμμα dmesg. Μόλις το εκτελέσουμε θα εμφανιστούν τα πιο πρόσφατα μηνύματα του πυρήνα του λειτουργικού συστήματος. Οι γραμμές που θα εμφανιστούν θα μοιάζουν με αυτές:

[4587425.409500] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[4587425.511167] usb 1-1.2: New USB device found, idVendor=0781, idProduct=5412
[4587425.511197] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[4587425.511214] usb 1-1.2: Product: Cruzer Fleur
...
[4587426.522417] sd 0:0:0:0: [sda] No Caching mode page present
[4587426.522446] sd 0:0:0:0: [sda] Assuming drive cache: write through
[4587426.525706]  sda: sda1
[4587426.528920] sd 0:0:0:0: [sda] No Caching mode page present
[4587426.528949] sd 0:0:0:0: [sda] Assuming drive cache: write through
[4587426.528969] sd 0:0:0:0: [sda] Attached SCSI removable disk

Ανάμεσα στα πιο πρόσφατα μηνύματα, είναι σίγουρο πως θα δούμε την αναγνώριση του USB από τον πυρήνα και την αντιστοίχησή του σε κάποιο device file. Εφόσον πρόκειται για αποθηκευτική συσκευή USB, το device file που θα έχει αντιστοιχηθεί θα έχει τη γενική μορφή sdx. Στη θέση του x θα δούμε κάποιο γράμμα, το οποίο εξαρτάται από το πλήθος των υπολοίπων αποθηκευτικών συσκευών του υπολογιστή μας αλλά κι από το είδος τους. Όλα αυτά όμως είναι αδιάφορα. Εμείς πρέπει απλά να εντοπίσουμε το device file που έχει αντιστοιχηθεί στο USB stick. Στο παράδειγμά μας, η ζητούμενη πληροφορία εμφανίζεται στην έβδομη γραμμή από πάνω. Βέβαια, το device file εμφανίζεται και στις υπόλοιπες γραμμές που σχετίζονται με το USB stick. Ωστόσο η έβδομη γραμμή παρουσιάζει ιδιαίτερο ενδιαφέρον. Σε αυτήν, εκτός από το device file της συσκευής, αναφέρονται και τα device files των κατατμήσεων του USB stick. Το δικό μας USB περιείχε μία μόνο κατάτμηση και γι’ αυτό το λόγο εμφανίζεται μόνο το sda1. Ε, λοιπόν, για να αποκτήσουμε πρόσβαση στα δεδομένα του USB stick μας, αρκεί να προσαρτήσουμε το συγκεκριμένο device file στον κατάλογο που δημιουργήσαμε προηγουμένως. Για το σκοπό αυτό γράφουμε:

sudo mount –t ntfs /dev/sda1 /mnt/my_usb

Εναλλακτικά, αν το USB μας είναι φορμαρισμένο σε FAT32, θα πρέπει να δώσουμε κάτι τέτοιο:

sudo mount –t vfat /dev/sda1 /mnt/my_usb

Αν το USB stick είχε περισσότερες κατατμήσεις (πράγμα σπάνιο, αλλά όχι αδύνατο) θα μπορούσαμε να προσαρτήσουμε κι αυτές. Ωστόσο οι προσαρτήσεις θα έπρεπε να γίνουν σε ξεχωριστούς καταλόγους. Τέλος, ας θυμόμαστε ότι εφόσον έχουμε προσαρτήσει ένα USB stick, πριν το αποσυνδέσουμε από το σύστημα θα ήταν φρόνιμο να το αποπροσαρτήσουμε. Για το σκοπό αυτό προσφέρεται το πρόγραμμα umount, στο οποίο δίνουμε ως παράμετρο το αντίστοιχο device file:

sudo umount /dev/sda1

Εναλλακτικά, του δίνουμε τον κατάλογο στον οποίο έχει γίνει η προσάρτηση:

sudo umount /mnt/my_usb

Αναζήτηση αρχείων

Πλέον γνωρίζουμε πάρα πολλά για τα αρχεία, ενώ έχουμε αποκτήσει και μερικές βασικές γνώσεις για το χειρισμό των κατατμήσεων. Μολαταύτα, ούτε και τώρα θα μπορούσαμε να πούμε ότι είμαστε σε θέση να χειριστούμε με άνεση τα αρχεία του συστήματος. Βλέπετε, για να μπορέσει κάποιος να εργαστεί με κάποιο αρχείο, θα πρέπει προηγουμένως να γνωρίζει τη θέση του. Ευτυχώς, το Linux διαθέτει αρκετά εργαλεία αναζήτησης και είναι βέβαιο ότι με κάποιο από αυτά σίγουρα θα καταφέρουμε να ξετρυπώσουμε το αρχείο που μας ενδιαφέρει.

whereis: Το συγκεκριμένο εργαλείο εντοπίζει εκτελέσιμα, μαζί με τα συνοδευτικά αρχεία βοήθειας (για το man).

which: Όπως και το προηγούμενο, το which μπορεί και βρίσκει για εμάς τη θέση οποιουδήποτε προγράμματος ζητήσουμε. Ωστόσο, σε αντίθεση με το whereis το which ασχολείται μόνο με το εκτελέσιμο αρχείο.

find: Με τη βοήθεια του find μπορούμε να εντοπίζουμε κυριολεκτικά οποιοδήποτε αρχείο. Επιπρόσθετα, είναι δυνατό να χρησιμοποιήσουμε τους ειδικούς χαρακτήρες (*, ?, [ και ]), ώστε να δημιουργήσουμε οσοδήποτε σύνθετα κριτήρια αναζήτησης. Το find δέχεται πολλές παραμέτρους, ενώ υποστηρίζει και τα λεγόμενα regular expressions. Πρόκειται για ένα πανίσχυρο εργαλείο, η εκμάθηση του οποίου ξεφεύγει από το θέμα μας. Πάντως, στις περισσότερες περιπτώσεις η ακόλουθη σύνταξη θα είναι επαρκής:

find σε_κάποιον_κατάλογο -name κάποιο_αρχείο

Γράφοντας κάτι τέτοιο, το find ξεκινά μια αναζήτηση για το αρχείο κάποιο_αρχείο. Η αναζήτηση δεν θα περιοριστεί εντός του σε_κάποιον_κατάλογο, αλλά θα ξεκινήσει από αυτόν και θα επεκταθεί σε όλους τους υποκαταλόγους του. Ας δούμε τώρα κι ένα παράδειγμα, με ειδικούς χαρακτήρες που έχουμε γνωρίσει:

find /home/pvar/ -name "test[1-5]"

Εκτελώντας το παραπάνω, το find θα αναζητήσει τα αρχεία με ονόματα test1, test2, …, test5. Η αναζήτηση θα ξεκινήσει από το home directory του χρήστη pvar και θα επεκταθεί σε όλους τους υποκαταλόγους.

Χρήσιμες συνωνυμίες

Μετά από όλα όσα είδαμε γύρω από τα αρχεία, κανένας φυσιολογικός άνθρωπος δεν θα θέλει να ξανακούσει γι’ αυτά. Πιστεύουμε λοιπόν ότι έφτασε η ώρα να δούμε κάτι πιο εύκολο, άμεσα αξιοποιήσιμο κι αρκετά ενδιαφέρον. Αναφερόμαστε σε μία δυνατότητα που προσφέρει το BASH και σχετίζεται με τα λεγόμενα συνώνυμα (aliases). Εν ολίγοις, αυτή η δυνατότητα επιτρέπει την αντιστοίχηση μίας λέξης σε ένα σύνολο προγραμμάτων. Με αυτό τον τρόπο, οποτεδήποτε θέλουμε να εκτελέσουμε το συγκεκριμένο σύνολο προγραμμάτων, αρκεί να πληκτρολογήσουμε το αντιστοιχισμένο όνομα και να πατήσουμε [ENTER]. Προφανώς, με αυτό τον τρόπο η εκτέλεση προγραμμάτων στο BASH μπορεί να απλοποιηθεί αλλά και σε μεγάλο βαθμό να επιταχυνθεί. Η σύνταξη που χρησιμοποιείται για τον ορισμό ενός alias φαίνεται παρακάτω:

alias επιθυμητό_όνομα = ' πρόγραμμα_1 ; πρόγραμμα_2 ; ... ; πρόγραμμα_Κ '

Το ελληνικό ερωτηματικό τοποθετείται για τον διαχωρισμό των προγραμμάτων και εξασφαλίζει ότι η εκτέλεση καθενός θα ξεκινά αφού ολοκληρωθεί η εκτέλεση του προηγούμενου. Ας δούμε όμως κι ένα συγκεκριμένο παράδειγμα, που παρεμπιπτόντως αποτελεί ένα από τα αγαπημένα aliases του γράφοντα:

alias k='clear; ls -lha'

Μικρό και θαυματουργό. Αφού ορίσουμε το συγκεκριμένο alias, κάθε φορά που θα πατάμε το γράμμα [k] και στη συνέχεια το [ENTER], θα εκτελείται το πρόγραμμα clear κι αμέσως μετά το ls -lha.

Εδώ πρέπει να τονίσουμε ότι τα aliases δεν έχουνε καθολική ισχύ, ούτε παντοτινή. Αυτό σημαίνει ότι τα aliases που ορίζουμε σε ένα τερματικό δεν ισχύουν αυτόματα και για τα άλλα. Επιπρόσθετα, αν αποσυνδεθούμε από το συγκεκριμένο τερματικό και συνδεθούμε εκ νέου, τα aliases που είχαμε ορίσει θα έχουν πάψει να υφίστανται. Για να ξεπεράσουμε αυτό το προβληματάκι, πρέπει να ενσωματώσουμε όσα aliases μας ενδιαφέρουν στο αρχείο ρυθμίσεων του BASH. Με αυτόν τον τρόπο θα ορίζονται και θα ενεργοποιούνται αυτόματα κάθε φορά που θα κάνουμε login. Το BASH διαθέτει αρκετά αρχεία ρυθμίσεων, αλλά για την εργασία που εξετάζουμε αρκεί να επέμβουμε στο κρυφό αρχείο με όνομα .bashrc. Το εν λόγω αρχείο βρίσκεται στον προσωπικό κατάλογο κάθε χρήστη κι επηρεάζει τη συμπεριφορά του BASH για τον εκάστοτε λογαριασμό και μόνο. Για την επέμβαση στα περιεχόμενά του αρκεί να το ανοίξουμε με κάποιον text editor. Ένας δημοφιλής κι εύχρηστος editor είναι το nano. Αν υπάρχει στο σύστημά μας, αρκεί να δώσουμε

nano ~/.bashrc

Μόλις εκτελεστεί το πρόγραμμα εμφανίζονται τα περιεχόμενα του .bashrc. Εμείς, χρησιμοποιώντας τα βελάκια ή το πλήκτρο page down, πρέπει να μεταβούμε στο τέλος του αρχείου. Εκεί δεν έχουμε παρά να προσθέσουμε όσα aliases θέλουμε και να αποθηκεύσουμε το αρχείο, πατώντας το συνδυασμό πλήκτρων [CTRL+O] και μετά το [Enter]. Στη συνέχεια, για να τερματίσουμε τη λειτουργία του nano και να επιστρέψουμε στην κονσόλα, αρκεί να πατήσουμε το συνδυασμό πλήκτρων [CTRL+X]. Αυτό ήταν. Στο εξής, κάθε φορά που συνδεόμαστε στο κέλυφος θα ενεργοποιούνται και τα αγαπημένα μας aliases.

Άρθρα της σειράς

Μέρος 14: Αρχική προσέγγιση

Μέρος 24: Πρώτη επίθεση

Μέρος 34: Πλήρης έλεγχος

Μέρος 44: Προγραμματισμός στο BASH

~Spir@l Evolut10n