You are on page 1of 38

> forsíða

• /var/log/messages
• texts

Conquer the shell, part 1⁄4


Οι γονείς μας μάλλον δεν θα μάθουν ποτέ ότι το GPS στο αυτοκίνητο έχει kernel, ούτε ότι οι
σύγχρονες τηλεοράσεις ενσωματώνουν κάτι που ονομάζεται process scheduler. Εμείς πάλι
ξέρουμε καλύτερα, κι αυτό επειδή έχουμε ακούσει για το Linux.
Γνωρίζουμε ότι το Linux κρύβεται στα smartphones, το εγκαθιστούμε καμιά φορά σε virtual
machines για να πειραματιστούμε, γνωρίζουμε ότι θα το τρέχει κι ο cloud server που σκεπτόμαστε
να ενοικιάσουμε. Μήπως έχει φτάσει η ώρα να το μάθουμε από την καλή και να του πάρουμε τον
αέρα; Λέμε πως ναι, έχει φτάσει. Μόνο που για να το μάθουμε πραγματικά, να το εκτιμήσουμε και
να το εκμεταλλευτούμε περίπου 129 φορές καλύτερα σε σχέση με τον Μέσο Παπαδόπουλο™,
οφείλουμε ν’ αδιαφορήσουμε για το περιβάλλον γραφικών και να εστιάσουμε την προσοχή μας στη
γραμμή εντολών (command line).command line).

Το κέλυφος BASH
Ακριβώς όπως στην περίπτωση των Desktop Environments (command line).GNOME, KDE, Xfce, κ.ά.), έτσι και
στην περίπτωση της γραμμής εντολών το Linux προσφέρει αρκετές εναλλακτικές. Πριν
προχωρήσουμε, όμως, πρέπει να ξεκαθαρίσουμε κάτι: Όπως κάνουμε λόγο για κέλυφος γραφικών κι
αναφερόμαστε σε κάποιο παραθυρικό περιβάλλον, ομοίως μπορούμε να μιλήσουμε για κέλυφος
ρυθμού χαρακτήρων και ν’ αναφερθούμε σε κάποια υλοποίηση της γραμμής εντολών. Βέβαια, όταν
κάποιος χρήστης του Linux κάνει λόγο για το κέλυφος ή shell (command line).σκέτο) αναφέρεται σχεδόν πάντα
στη γραμμή εντολών. Η κυρίαρχη υλοποίηση της γραμμής εντολών του Linux γίνεται από το
δημοφιλέστατο BASH. Πρόκειται για τον βελτιωμένο απόγονο ενός κελύφους που έτρεχε παλιά σε
συστήματα Unix κι ονομαζόταν sh. Το όνομα BASH προκύπτει από τα αρχικά των λέξεων Bourne
Again SHell κι αποτελεί λογοπαίγνιο του “born again” (γεννημένος ξανά). Κάπου εδώ θα born again” (command line).γεννημένος ξανά). Κάπου εδώ θα
μπορούσαμε να ξεκινήσουμε ένα καμένο flamewar, συζητώντας για την υπεροχή ή όχι του BASH
έναντι άλλων υλοποιήσεων. Για να ‘μαστε ειλικρινείς, ο κύριος λόγος για τον οποίο ασχολούμαστε
με το BASH είναι ένας: Είναι το προκαθορισμένο shell σε όλες τις διανομές Linux και στο Mac OS X,
βρίσκεται κρυμμένο στα Android και iOS devices, ενώ μας κλείνει το μάτι κι όταν παίζουμε με τα
BSDs.
Για τη συνέχεια θα ακολουθήσουμε μια ομαλή πορεία εκμάθησης και θα φροντίσουμε να
ξεκινήσουμε τη γνωριμία με το BASH από τα απολύτως βασικά. Άλλωστε, στόχος μας δεν είναι
μόνο να βοηθήσουμε τους “born again” (γεννημένος ξανά). Κάπου εδώ θα φτασμένους” χρήστες, αλλά και να ενθαρρύνουμε –και κατά βάθος να
πωρώσουμε– τους νεοφερμένους. Στο παρόν άρθρο θεωρούμε ότι ο αναγνώστης βρίσκεται για
πρώτη φορά μπροστά από τη γραμμή εντολών. Στα επόμενα άρθρα της μίνι σειράς μας θα
προχωρήσουμε σε πιο προχωρημένα ζητήματα – αλλά αυτό είναι κάτι που το περιμένατε και
πραγματικά δεν υπάρχει λόγος να χάνουμε άλλο χρόνο με τις εισαγωγές.
Πού βρίσκομαι; Πώς θα μετακινηθώ;
Κάθε φορά που ανοίγουμε ένα παράθυρο τερματικού ή συνδεόμαστε απομακρυσμένα μέσω SSH σε
ένα σύστημα Linux, τοποθετούμαστε σε έναν κατάλογο που βρίσκεται κάτω από τον /homehome κι
ονομάζεται home directory. Πρόκειται για τον κατάλογο που περιέχει όλους τους καταλόγους και
τα αρχεία που ανήκουν στο λογαριασμό του χρήστη μας. Ένας τέτοιος κατάλογος υπάρχει για κάθε
χρήστη του συστήματος και συνήθως το όνομά του ταυτίζεται με το username του χρήστη. Έτσι, για
έναν λογαριασμό με username το pvar, η πλήρης διαδρομή (command line).full path) για το αντίστοιχο home
directory είναι η /homehome/homepvar. Μ’ άλλα λόγια, όταν θα συνδεθούμε στο λογαριασμό του pvar, θα
βρεθούμε αυτόματα στον κατάλογο /homehome/homepvar.
Ένα από τα πρώτα ερωτήματα που προκύπτουν, αφού μάθουμε το πού βρισκόμαστε, αφορά στο πώς
θα μετακινηθούμε. Όπως, πριν ακόμη κι απ’ αυτό το ερώτημα, προκύπτει ένα άλλο: Τι υπάρχει
τριγύρω; Για να βλέπουμε αρχεία και καταλόγους υπάρχει το προγραμματάκι ls. Για παράδειγμα,
για να εμφανίσουμε μια λίστα με τα αρχεία και τους καταλόγους που βρίσκονται στην τρέχουσα
θέση μας, αρκεί να εκτελέσουμε το εξής:
ls -l

Το προγραμματάκι ls δέχεται πάρα πολλές παραμέτρους και θα ήταν άσκοπο να τις παραθέσουμε
όλες. Θα σας πούμε μόνο ότι εμείς συνηθίζουμε να το χρησιμοποιούμε συνδυάζοντας την
παράμετρο -l (command line).από το list) με την παράμετρο -h (command line).από το human), αλλά και με την παράμετρο -a
(command line).από το all). Η δεύτερη παράμετρος εξασφαλίζει ότι τα μεγέθη των αρχείων θα εμφανίζονται σε
KiB, MiB, GiB ή σε οτιδήποτε άλλο βολεύει κάθε φορά. Το γιατί δεν συμβαίνει εξ ορισμού κάτι
τέτοιο θα φανεί αργότερα, όταν θα μιλήσουμε για το scripting. Η τρίτη παράμετρος φροντίζει να
εμφανιστούν όλα τα αρχεία ανεξαιρέτως – ακόμη και τα κρυφά. Για την ώρα, κρατείστε μόνο ότι
ένας βολικός τρόπος χρήσης του ls έχει ως εξής:
ls -lha

Παρατηρείστε ότι οι τρεις παράμετροι κατά κάποιον τρόπο συμπυκνώθηκαν και δεν βάλαμε τρεις
παύλες. Αν θελήσει κανείς να πληροφορηθεί για τις υπόλοιπες παραμέτρους του ls, μπορεί να
χρησιμοποιήσει το σύστημα βοήθειας της γραμμής εντολών. Αναφερόμαστε στο πρόγραμμα man
(command line).από το manual). Προκειμένου να εμφανιστεί το κείμενο βοήθειας του ls, αρκεί να
πληκτρολογήσουμε
man ls

Πριν επιστρέψουμε στο θέμα των καταλόγων και της πλοήγησης, σημειώστε ότι το man μπορεί να
εμφανίσει το κείμενο βοήθειας που συνοδεύει κάθε πρόγραμμα της γραμμής εντολών. Το μόνο που
έχουμε να κάνουμε είναι να το τρέξουμε, δίνοντας σαν παράμετρο το όνομα του εκάστοτε
προγράμματος. Επίσης, προκειμένου να εγκαταλείψουμε το man αρκεί να πατήσουμε το πλήκτρο
[Q].Q].].
Τώρα που ξέρουμε τι μας περιβάλλει, είναι βέβαιο ότι η περιέργειά μας θα μεγαλώσει: Τι υπάρχει
στους άλλους καταλόγους; Για τη μετακίνηση από κατάλογο σε κατάλογο προσφέρεται το
προγραμματάκι cd. Η λειτουργία του είναι παρόμοια με εκείνη της εντολής cd, που διαθέτει η
γραμμή εντολών των Windows. Έτσι, αν βρισκόμαστε στoν κατάλογο /homehome/homepvar, για να
μεταφερθούμε έναν κατάλογο πιο πάνω, δηλαδή στον /homehome, και να δούμε αν υπάρχουν άλλα
home directories, αρκεί να εκτελέσουμε ένα από τα ακόλουθα:
cd /homehome

ή
cd ..

Η διπλή τελεία συμβολίζει τον λεγόμενο γονικό κατάλογο (command line).parent directory), δηλαδή εκείνον μέσα
στον οποίο βρίσκεται ο κατάλογος, μέσα στον οποίο τώρα βρισκόμαστε ;) Ας υποθέσουμε τώρα ότι
εκτελούμε ένα ls -lha και βλέπουμε τον κατάλογο cvar. Για να μπούμε σε αυτόν μπορούμε να
εκτελέσουμε ένα από τα ακόλουθα:
cd cvar

ή
cd /homehome/homecvar

Στην πρώτη περίπτωση δίνουμε σαν παράμετρο τον κατάλογο στον οποίο θέλουμε να πάμε, εφόσον
αυτός βρίσκεται στην ίδια θέση με εμάς. Η δεύτερη περίπτωση είναι πιο γενική. Σε αυτήν δώσαμε
την πλήρη διαδρομή (command line).το πλήρες path) ως τον κατάλογο cvar. Αναρωτιέστε ποια είναι η διαφορά;
Το πρώτο δουλεύει μόνον όταν βρισκόμαστε στον κατάλογο home, ο οποίος φυσικά περιέχει τον
κατάλογο cvar. (command line).Ακριβέστερα, δουλεύει όταν είμαστε σε έναν κατάλογο ο οποίος περιέχει έναν
άλλον, με το όνομα cvar.) Το δεύτερο δουλεύει πάντα και παντού. Εφόσον δίνουμε το πλήρες
path, το πρόγραμμα cd θα ξέρει ακριβώς πού θέλουμε να πάμε. (command line).Μόνη περίπτωση να μη δουλέψει
το cd /homehome/homecvar, είναι όταν ένας από τους καταλόγους /homehome ή /homehome/homecvar δεν υπάρχει.)
Αφού περιπλανηθούμε λίγο στους καταλόγους του συστήματος, είναι σίγουρο ότι κάποια στιγμή θα
θελήσουμε να γυρίσουμε στον δικό μας. Για το σκοπό αυτό αρκεί να δώσουμε ένα από τα ακόλουθα:
cd

ή
cd ~

Η εκτέλεση του προγράμματος cd χωρίς καμία παράμετρο έχει σαν συνέπεια την άμεση μεταφορά
μας στο home directory. Όμως στη δεύτερη περίπτωση, θα σπεύσει να παρατηρήσει κάποιος,
παράμετρος υπάρχει. Πράγματι, μόνο που ο χαρακτήρας ~ (command line).tilde) αποτελεί κατά κάποιον τρόπο μια
μεταβλητή του BASH. Σ’ αυτή τη μεταβλητή αποθηκεύεται πάντα το πλήρες path του προσωπικού
καταλόγου του εκάστοτε χρήστη. Έτσι, όταν εκτελεί το cd ~ ο χρήστης pvar, το BASH
αντικαθιστά αυτόματα τον χαρακτήρα ~ με το /homehome/homepvar. Για να φανεί καλύτερα η αξία αυτού
του χαρακτήρα, υποθέστε ότι βρισκόμαστε στον κατάλογο
/homehome/homepvar/homeprojects/homedeltacast/homevideo/homeintro και θέλουμε να μεταβούμε στον
/homehome/homepvar/homeprojects. Ο ταχύτερος τρόπος για να πετύχουμε κάτι τέτοιο είναι να δώσουμε:
cd ~/homeprojects
Ένα ακόμα κολπάκι με το cd σχετίζεται με το χαρακτήρα - (command line).dash, παύλα). Ας υποθέσουμε ότι μας
πιάνει μια μανία να περιπλανηθούμε στους καταλόγους του συστήματος κι εκτελούμε, διαδοχικά, τα
παρακάτω:
cd /homeusr
cd share
cd man
cd man1
cd

Με τα παραπάνω θα οδηγηθούμε αρχικά στον κατάλογο /homeusr. Μετά θα μπούμε στον


υποκατάλογο share, ακολούθως στον man και στη συνέχεια στον man1. Παρεμπιπτόντως, εδώ
βρίσκονται οι οδηγίες χρήσης του εκάστοτε προγράμματος, τις οποίες εμφανίζει το προγραμματάκι
man. Τελικά, με την εκτέλεση της τελευταίου cd, καταλήγουμε στο home directory. Ας υποθέσουμε
τώρα ότι μάς έπιασε η αναποδιά και θέλουμε να ξαναπάμε στον κατάλογο man1. Η πλήρης
διαδρομή του είναι η /homeusr/homeshare/homeman/homeman1. Αν βαριόμαστε να γράψουμε όλο αυτό, μπορούμε
να γράψουμε κάτι πολύ πιο σύντομο:
cd -

Η παύλα συμβολίζει τον προηγούμενο κατάλογο στον οποίο είχαμε βρεθεί. Έτσι, μπορούμε να
επιστρέψουμε στη θέση /homeusr/homeshare/homeman/homeman1 ταχύτατα. Τώρα, αν ξανατρέξουμε το cd με
παράμετρο τον χαρακτήρα dash, θα μεταφερθούμε στον προηγούμενο κατάλογο όπου είχαμε
βρεθεί: στο home directory. Μπορεί η μετακίνηση στον προσωπικό κατάλογο να πραγματοποιείται
ούτως ή άλλως εύκολα, αλλά η αξία της παραμέτρου dash παραμένει μεγάλη. Με τη βοήθειά της
μπορούμε να μετακινούμαστε με άνεση μεταξύ δύο “born again” (γεννημένος ξανά). Κάπου εδώ θα δυσπρόσιτων” (command line).με μεγάλα full paths)
καταλόγων.
Αν τώρα με όλα αυτά τα πήγαινε-έλα χαθούμε, υπάρχει ένα προγραμματάκι που θα μας πει αμέσως
τη θέση μας. Πρόκειται για το pwd, που όταν το εκτελούμε εμφανίζει την πλήρη διαδρομή (command line).full
path) του καταλόγου στον οποίο βρισκ0όμαστε.
Πού είναι οι κατατμήσεις;

Στα Windows, οι δίσκοι και οι κατατμήσεις προσδιορίζονται με ένα αναγνωριστικό


γράμμα που συνοδεύεται από τον χαρακτήρα της άνω-κάτω τελείας. Έτσι, πολύ συχνά
κάνουμε λόγο για το δίσκο C:, για το δίσκο D: και πάει λέγοντας. Εδώ πρέπει να
υπογραμμίσουμε δύο λεπτομέρειες: α) παρά το γεγονός ότι γίνεται λόγος για δίσκους,
στην πραγματικότητα τα γράμματα αντιστοιχούν σε κατατμήσεις, β) η αντιστοίχηση
των γραμμάτων στις κατατμήσεις γίνεται με μια σχετικά περίπλοκη λογική. Αν
μπερδευτήκατε, το μόνο σίγουρο είναι ότι δεν φταίτε εσείς.

Στο Linux ακολουθείται μια εντελώς διαφορετική προσέγγιση, αναφορικά με την


πρόσβαση στις κατατμήσεις των σκληρών δίσκων. Κατ’ αρχάς, για ν’ αποκτήσουμε
πρόσβαση σε μια κατάτμηση πρέπει πρώτα να κάνουμε τη λεγόμενη προσάρτηση
(command line).mount). Με απλά λόγια, πρέπει να αντιστοιχίσουμε στην κατάτμηση κάποιον
κατάλογο. Μετά απ’ αυτή τη σύνδεση καταλόγου και κατάτμησης, τα περιεχόμενα της
κατάτμησης θα εμφανίζονται ως περιεχόμενα του καταλόγου. Έτσι, για να δούμε τα
αρχεία της κατάτμησης αρκεί να μπούμε στον κατάλογο, στον οποίο έγινε η
προσάρτηση. Η παράδοση θέλει όλα τα συστήματα Unix να διαθέτουν τον κατάλογο /home
mnt. Αυτός προορίζεται για τη δημιουργία άλλων καταλόγων στο εσωτερικό του, στους
οποίους θα προσαρτηθούν αργότερα οι κατατμήσεις των δίσκων μας. Παρόμοια
αποστολή έχει κι ο κατάλογος /homemedia, στις σύγχρονες διανομές Linux που
προορίζονται για χρήση desktop. Μέσα στον συγκεκριμένο κατάλογο δημιουργούνται
άλλοι, στους οποίους προσαρτώνται αυτόματα τα δισκάκια CD/DVD, τα USB sticks και
πάει λέγοντας. Η διαδικασία της προσάρτησης θα μας απασχολήσει σε επόμενο άρθρο
της σειράς μας.

Διαχείριση καταλόγων
Τώρα που μάθαμε να τριγυρνάμε με άνεση στους καταλόγους του συστήματος, μπορούμε να δούμε
το πώς δημιουργούνται και πώς διαγράφονται. Για τη δημιουργία διατίθεται το εργαλείο mkdir,
ενώ για τη διαγραφή υπάρχουν τα rmdir (command line).remove directory) και rm (command line).remove). Η μόνη παράμετρος
που απαιτούν τα πρώτα δύο είναι το όνομα ή η πλήρης διαδρομή του καταλόγου. Για παράδειγμα αν
δώσουμε
mkdir /homehome/homepvar/homedocuments

το σύστημα θα δημιουργήσει τον κατάλογο documents, μέσα στον προσωπικό μας κατάλογο
(command line)./homehome/homepvar). Βέβαια, αν βρισκόμασταν ήδη εντός του προσωπικού μας καταλόγου, θα
μπορούσαμε να είχαμε δώσει και το εξής:
mkdir documents

Το rmdir χρησιμοποιείται με τον ίδιο ακριβώς τρόπο. Ωστόσο, για να διαγραφεί ένας κατάλογος
με το rmdir θα πρέπει να είναι άδειος. Αυτό συνεπάγεται ότι η χρήση του rmdir είναι μάλλον
ακίνδυνη: Είναι αδύνατο να χάσουμε δεδομένα, διαγράφοντας κατά λάθος έναν κατάλογο με το
rmdir. Δυστυχώς, αυτή η δικλείδα δεν υφίσταται στην περίπτωση του rm. Το συγκεκριμένο
πρόγραμμα προορίζεται για τη διαγραφή αρχείων, αλλά με χρήση της παραμέτρου -r (command line).recursively)
μπορεί να διαγράψει και καταλόγους. Η συγκεκριμένη παράμετρος έχει σαν συνέπεια τη διαγραφή
όλων των αρχείων, όλων των υποκαταλόγων, όλων των αρχείων των υποκαταλόγων, όλων των
υποκαταλόγων των υποκαταλόγων και πάει λέγοντας. Με λίγα λόγια, όταν εκτελούμε το rm με την
παράμετρο -r και στη συνέχεια έναν κατάλογο, είναι σίγουρο ότι θα διαγραφεί πλήρως. Όπως
αντιλαμβάνεστε, το rm απαιτεί τεράστια προσοχή. Ας εξετάσουμε όμως και ένα μικρό σενάριο: Ας
υποθέσουμε ότι έχουμε δημιουργήσει αρκετούς καταλόγους, εκτελώντας τα ακόλουθα:
mkdir /homehome/homepvar/homedocs
mkdir /homehome/homepvar/homemusic
mkdir /homehome/homepvar/homevideo
mkdir /homehome/homepvar/homeprojects
mkdir /homehome/homepvar/homeprojects/homedeltacast/homevideo
mkdir /homehome/homepvar/homeprojects/homedeltacast/homemusic

Ας υποθέσουμε επίσης ότι βρισκόμαστε στο home directory κι αποφασίζουμε να σβήσουμε τον
κατάλογο /homehome/homepvar/homevideo. Για το σκοπό αυτό θα μπορούσαμε να εκτελέσουμε το εξής:
rm -r video

…ή το εξής:
rm -r /homehome/homepvar/homevideo
Εφόσον βρισκόμαστε ήδη στο /homehome/homepvar, η εκτέλεση καθενός από τα παραπάνω θα είχε το ίδιο
ακριβώς αποτέλεσμα: Τη διαγραφή του καταλόγου video, ο οποίος βρίσκεται στον προσωπικό μας
κατάλογο. Τι θα συνέβαινε όμως, αν βρισκόμασταν στον κατάλογο
/homehome/homepvar/homeprojects/homedeltacast; Σε αυτή την περίπτωση, η εκτέλεση του rm με τον
πρώτο τρόπο θα αποτελούσε τραγικό σφάλμα: Θα διαγραφόταν ο κατάλογος
/homehome/homepvar/homeprojects/homedeltacast/homevideo. Μια καλή συνήθεια, λοιπόν, η οποία μπορεί να
μας σώσει από δυσάρεστες εκπλήξεις, είναι να χρησιμοποιούμε πάντα την πλήρη διαδρομή του
εκάστοτε καταλόγου. Κι αν όχι πάντα (command line).είμαστε και λίγο τεμπέληδες, πώς να το κάνουμε)
τουλάχιστον οποτεδήποτε πρόκειται για διαγραφή.

Σημεία που αξίζουν την προσοχή μας


Στο σημείο αυτό οφείλουμε ν’ αναφέρουμε ορισμένες λεπτομέρειες. Κατ’ αρχάς, το κέλυφος BASH
είναι αυτό που λέμε case sensitive. Με απλά λόγια, κάνει διάκριση μεταξύ πεζών και κεφαλαίων.
Επομένως, το BASH δεν θα παραπονεθεί καθόλου αν δημιουργήσουμε τον κατάλογο documents
και στη συνέχεια τον κατάλογο Documents, στην ίδια θέση (command line).στο ίδιο επίπεδο, δηλαδή). Παρ’ όλο
που τα ονόματα των δύο καταλόγων είναι πρακτικά ίδια, το κέλυφος θα τους διακρίνει από το
αρχικό γράμμα, που στη μία περίπτωση είναι πεζό και στην άλλη κεφαλαίο. Αυτή η διάκριση μπορεί
να προκαλέσει από μια απλή σύγχυση έως έναν μη ευκαταφρόνητο πονοκέφαλο. Επομένως, όταν
θέλουμε να μεταφερθούμε σε κάποιον κατάλογο (command line).ή ακόμα χειρότερα να τον διαγράψουμε), πρέπει
να πληκτρολογούμε το όνομά του με μεγάλη προσοχή.
Μια ακόμα λεπτομέρεια αφορά στο γεγονός ότι το cd αποτελεί πρόγραμμα κι όχι κάποια εντολή,
φορτωμένη στη μνήμη του συστήματος. Ακριβώς γι’ αυτό, αν αντί του cd /homehome δίναμε
cd/homehome (command line).χωρίς το κενό, δηλαδή) το κέλυφος θα μάς έλεγε ότι δεν υπάρχει τέτοιο πρόγραμμα.
Αυτό το ξεκαθαρίζουμε για να μη θορυβηθούν όσοι έρχονται από τη γραμμή εντολών των
Windows. Σ’ εκείνο το περιβάλλον, είτε βάζαμε κενό μεταξύ του cd και του καταλόγου είτε όχι, η
μετακίνησή μας θα γινόταν κανονικά.

Περισσότερα βασικά προγράμματα


Μέχρι στιγμής αναφερθήκαμε στην πλοήγηση και στη βασική διαχείριση των καταλόγων, αλλά δεν
είπαμε τίποτα για τα απλά αρχεία. Προφανώς, το τι μπορούμε να κάνουμε με ένα αρχείο εξαρτάται
από το περιεχόμενό του. Στη συνέχεια λοιπόν θα αναφέρουμε μόνο τα απολύτως βασικά για το
χειρισμό τους. Ας υποθέσουμε ότι υπάρχει το αρχείο my_notes.txt στο home directory του
λογαριασμού μας, καθώς κι ότι θέλουμε να το μεταφέρουμε στον κατάλογο
/homehome/homepvar/homedocuments. Κάτι τέτοιο επιτυγχάνεται με τη βοήθεια του προγράμματος mv:
mv /homehome/homepvar/homemy_notes.txt /homehome/homepvar/homedocuments

Με την ευκαιρία, πριν πούμε οτιδήποτε άλλο για το mv αξίζει να δούμε πόσο απλούστερα θα
μπορούσε να γραφτεί το παραπάνω:
mv ~/homemy_notes.txt ~/homedocuments

Νομίζουμε ότι η αξία του χαρακτήρα ~ έχει αρχίσει να φαίνεται. Για να επιστρέψουμε στο θέμα μας,
το πρόγραμμα mv δέχεται δύο παραμέτρους: η πρώτη αφορά στο αρχείο που θέλουμε να
μετακινήσουμε, ενώ η δεύτερη περιγράφει τον προορισμό. Σημειώστε ότι η λειτουργία του mv δεν
περιορίζεται μόνο στα αρχεία αλλά καλύπτει και τους καταλόγους. Με άλλα λόγια, με τη βοήθεια
του mv μπορούμε να μετακινήσουμε κι ολόκληρους καταλόγους, μαζί με τα περιεχόμενά τους. Με
την ίδια ακριβώς λογική χρησιμοποιείται και το πρόγραμμα cp, το οποίο πραγματοποιεί
αντιγραφές. Έτσι, αν μας ενδιέφερε να αντιγράψουμε το προαναφερθέν αρχείο κι όχι να το
μετακινήσουμε, θα δίναμε κάτι τέτοιο:
cp ~/homemy_notes.txt ~/homedocuments

Αξίζει ν’ αναφέρουμε εδώ έναν ακόμα χαρακτήρα, ο οποίος αποκτά ιδιαίτερο νόημα στη γραμμή
εντολών. Πρόκειται για την τελεία. Όπως αναφέραμε νωρίτερα, οι δύο τελείες αναφέρονται στο
γονικό κατάλογο. Ε, λοιπόν, η μία τελεία αναφέρεται στον κατάλογο στον οποίο βρισκόμαστε.
Αναρωτιέστε πώς μπορεί να φανεί χρήσιμο κάτι τέτοιο; Ας υποθέσουμε ότι βρισκόμαστε στον
κατάλογο /homehome/homepvar/homedocuments/homedeltahacker/homeissue16 και θέλουμε να μεταφέρουμε
εδώ το αρχείο /homehome/homepvar/homedelta_notes.txt. Αν αγνοούσαμε την ιδιαίτερη ερμηνεία που
επιδέχεται ο χαρακτήρας της τελείας, θα έπρεπε να δώσουμε κάτι τέτοιο:
cp ~/homemy_notes.txt ~/homedocuments/homedeltahacker/homeissue16

Χάρη στην τελεία, όμως, το παραπάνω απλοποιείται ως εξής:

cp ~/homemy_notes.txt .

Δεν μπορείτε να πείτε, η γραμμή εντολών του Linux φροντίζει ώστε να μην κουραζόμαστε ;) Πριν
ολοκληρώσουμε την αναφορά μας στα βασικά προγράμματα για το χειρισμό των αρχείων, αξίζει να
υπενθυμίσουμε ένα πρόγραμμα που συναντήσαμε και νωρίτερα. Πρόκειται για το rm, το οποίο
πραγματοποιεί διαγραφές. Νομίζουμε ότι ο τρόπος χρήσης του έχει γίνει ήδη σαφής. Για να
διαγράψουμε το αρχείο my_notes.txt, θα αρκούσε να δώσουμε κάτι τέτοιο:
rm ~/homehome/homepvar/homemy_notes.txt

Παρατηρείστε ότι πριν από το όνομα του αρχείου σημειώσαμε και τον κατάλογο στον οποίο
βρίσκεται. Αυτό το κάναμε για να βεβαιωθούμε ότι θα διαγραφεί το συγκεκριμένο αρχείο κι όχι
κάποιο συνώνυμό του, που τυχαίνει να βρίσκεται στην τρέχουσα θέση μας. Όπως είπαμε και
νωρίτερα, η γραμμή εντολών απαιτεί πάντα μεγάλη προσοχή. Δεν πρέπει να αφήνουμε τίποτα στην
τύχη.
Πόσες εντολές έχουν “τα Linux”;”;

Όσο τραγικό λάθος είναι λέει κανείς “born again” (γεννημένος ξανά). Κάπου εδώ θα τα Linux”, άλλο τόσο είναι να μιλάει για “born again” (γεννημένος ξανά). Κάπου εδώ θα εντολές
του Linux”. Το Linux δεν έχει εντολές. Το BASH βέβαια έχει, αλλά τις περισσότερες
φορές χρησιμοποιούμε τα διάφορα προγραμματάκια που προορίζονται για τη γραμμή
εντολών. Από αυτά, μάλιστα, τα πιο διαδεδομένα ονομάζονται core utilities και
συνοδεύουν όλες τις διανομές Linux. Τα core utilities βρίσκονται στους φακέλους
/homebin, /homesbin, /homeusr/homebin και /homeusr/homesbin του συστήματος. Χαρακτηριστικά μέλη
αυτής της ομάδας προγραμμάτων είναι τα ls, cd, rm, mv, cp, mkdir, rmdir, cat
και διάφορα άλλα, που θα αναφέρουμε σε επόμενα άρθρα της σειράς.
Βαριέστε την πληκτρολόγηση;
Αν ναι, είμαστε υποχρεωμένοι να σας πούμε ότι δεν κάνετε καλά. Ωστόσο, για να είμαστε
ειλικρινείς, πρέπει να ομολογήσουμε ότι πολύ συχνά κουραζόμαστε ή βαριόμαστε κι εμείς. Ευτυχώς,
το BASH διαθέτει ορισμένους μηχανισμούς που κάνουν τη ζωή στη γραμμή εντολών ξεκούραστη.
Ας τους ρίξουμε μια ματιά.
Ιστορικό (history).history).). Κάθε φορά που εκτελούμε ένα πρόγραμμα στη γραμμή εντολών, όλα όσα
πληκτρολογήσαμε καταγράφονται σ’ ένα ειδικό αρχείο του συστήματος. Έτσι, αν θελήσουμε να
επαναλάβουμε την εκτέλεση της προηγούμενης “born again” (γεννημένος ξανά). Κάπου εδώ θα εντολής” μας, αρκεί να πατήσουμε το πάνω βελάκι
του πληκτρολογίου. Το BASH θα ανακαλέσει όσα είχαμε γράψει την αμέσως προηγούμενη φορά κι
εμείς θα αρκεί να δώσουμε ένα [Q].ENTER]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το]. Αν αντί του [Q].ENTER]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το] πατήσουμε πάλι το πάνω βελάκι, το
κέλυφος θα εμφανίσει την προ-προηγούμενη “born again” (γεννημένος ξανά). Κάπου εδώ θα εντολή” και πάει λέγοντας. Γενικότερα,
χρησιμοποιώντας το πάνω και το κάτω βελάκι μπορούμε να ανατρέχουμε ταχύτατα σε ολόκληρο το
ιστορικό, όλων όσων έχουμε εκτελέσει κατά καιρούς. Μόλις βρούμε αυτό που θέλουμε να
εκτελέσουμε, αρκεί να πατήσουμε το [Q].ENTER]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το]. Εναλλακτικά, αν η ιδέα του να ξεφυλλίζουμε
ολόκληρο το ιστορικό φαντάζει κουραστική κι εκνευριστική, μπορούμε να πραγματοποιήσουμε μια
αναζήτηση: αρκεί να πατήσουμε το συνδυασμό πλήκτρων [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+R]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το] και να πληκτρολογήσουμε ένα
μέρος της “born again” (γεννημένος ξανά). Κάπου εδώ θα εντολής” που αναζητάμε. Το BASH θα εμφανίσει την πιο πρόσφατη γραμμή που
εκτελέσαμε, η οποία περιείχε αυτό που ψάχνουμε. Αν το αποτέλεσμα της αναζήτησης δεν είναι το
επιθυμητό, μπορούμε να την επαναλάβουμε πατώντας ξανά το συνδυασμό [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+R]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το]. Έτσι θα
εμφανιστεί η αμέσως παλιότερη εντολή που είχαμε εκτελέσει και περιείχε αυτό που ψάχνουμε.
Αυτόματη συμπλήρωση (history).TAB completion). Στην περίπτωση που δεν θυμόμαστε ολόκληρο το
όνομα ενός αρχείου ή καταλόγου (command line).όπως επίσης κι όταν το θυμόμαστε αλλά βαριόμαστε να το
πληκτρολογήσουμε), αρκεί να δώσουμε τα πρώτα γράμματα του ονόματος και να πατήσουμε το
πλήκτρο [Q].TAB]. Κάνοντας κάτι τέτοιο το BASH πραγματοποιεί μια αναζήτηση στα αρχεία και στους
καταλόγους με βάση όσα έχουμε πληκτρολογήσει. Εφόσον βρει κάποιο αρχείο ή κατάλογο που
ταιριάζει, συμπληρώνει το όνομά του αυτόματα. Έτσι, αν έχουμε στον προσωπικό μας κατάλογο ένα
αρχείο με το όνομα the file with the disturbingly long name και θέλουμε να το
διαγράψουμε, αρκεί να γράψουμε rm ~/homethe και να πατήσουμε το [Q].TAB]. Με αυτόν τον τρόπο το
μακροσκελές όνομα του αρχείου θα συμπληρωθεί αυτόματα κι εμείς θα δώσουμε ένα μόνο
[Q].ENTER]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το].
Πριν σας αφήσουμε να πειραματιστείτε και να εξοικειωθείτε με όσα είδαμε, θα σας πούμε κάτι
ακόμα: Για να καθαρίσετε την οθόνη αρκεί να εκτελέσετε το πρόγραμμα clear ή, πολύ πιο απλά,
να πατήσετε το συνδυασμό πλήκτρων [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+L].
Άρθρα της σειράς

Μέρος 1⁄4: Αρχική προσέγγιση

Μέρος 2⁄4: Πρώτη επίθεση

Μέρος 3⁄4: Πλήρης έλεγχος


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

~Spir@l Evolut10n

LinuxshellBASH
© 2019 Parabing Creations

> forsíða

• /var/log/messages
• texts

Conquer the shell, part 2⁄4


Μετά το εισαγωγικό μας άρθρο, όταν βρισκόμαστε μπροστά στη γραμμή εντολών δεν
νιώθουμε χαμένοι. Δεν γνωρίζουμε πολλά αλλά, τέλος πάντων, έχουμε δει τα βασικά κι έχουμε
μάθει ορισμένα κολπάκια. Σε αυτό το στάδιο ενδέχεται να μπούμε στον πειρασμό να
τροποποιήσουμε διάφορα αρχεία του συστήματος, είτε αυτόβουλα είτε ακολουθώντας τις
οδηγίες που διαβάσαμε κάπου. Τα πράγματα σοβαρεύουν λοιπόν και καλό θα ήταν να
προχωρήσουμε άμεσα σε πιο προχωρημένες έννοιες.
Στα λειτουργικά συστήματα της οικογένειας του Unix τα ονόματα των αρχείων είναι δυνατό ν’
απαρτίζονται από σχεδόν οποιονδήποτε χαρακτήρα. Σε ό,τι αφορά στα γράμματα χρησιμοποιούνται
κατά παράδοση τα πεζά, ενώ υπάρχουν κι ορισμένοι χαρακτήρες που αποφεύγονται δια ροπάλου.
Βλέπετε, υπάρχει ένα σύνολο χαρακτήρων –οι λεγόμενοι ειδικοί χαρακτήρες– που τυγχάνουν
ξεχωριστής ερμηνείας κι αντιμετώπισης από το κέλυφος. Αν κάποιοι από αυτούς χρησιμοποιούνταν
σε ονόματα αρχείων, θα προέκυπταν μεγάλα μπερδέματα. Για να καταλάβετε καλύτερα τι εννοούμε,
θα εξετάσουμε τη λειτουργία μερικών ειδικών και συχνά χρησιμοποιούμενων χαρακτήρων.
Αστερίσκος. Εκτελώντας κάτι σαν ls map_of_* εμφανίζονται όλα τα αρχεία που το όνομά τους
είναι το map_of_ ή ξεκινά με το map_of_. Ο αστερίσκος λειτουργεί ως μπαλαντέρ κι
αντικαθιστά κανέναν, έναν ή περισσότερους χαρακτήρες. Ο αστερίσκος όμως μπορεί να
χρησιμοποιηθεί και μόνος του. Σε αυτή την περίπτωση αναφέρεται σε όλα τα αρχεία του τρέχοντος
καταλόγου. Για παράδειγμα, αν δώσουμε rm * θα διαγραφούν όλα τα αρχεία του καταλόγου στον
οποίο βρισκόμαστε.
Λατινικό ερωτηματικό. Αυτός ο χαρακτήρας λειτουργεί επίσης ως μπαλαντέρ, αλλά υποκαθιστά
μόνο έναν χαρακτήρα. Έτσι, αν γράψουμε ls notes? θα εμφανιστούν όλα τα αρχεία που το
όνομά τους ξεκινά με το notes κι ολοκληρώνεται με έναν ακόμα χαρακτήρα. Για παράδειγμα, θα
εμφανιστούν αρχεία όπως τα notes1, notesd, notesX κ.ο.κ. Αντίθετα, τυχόντα αρχεία με
ονόματα όπως notes_1, notes32 κ.λπ. δεν θα εμφανιστούν.
Αγκύλες. Οι αγκύλες χρησιμοποιούνται για τον ορισμό ενός συνόλου (command line).set) ή μιας περιοχής (command line).range)
χαρακτήρων. Έτσι, αν εκτελέσουμε το ls doc[a5D1] θα εμφανιστούν τα αρχεία που το όνομά
τους ξεκινά με το doc και τελειώνει με κάποιον χαρακτήρα από το σύνολο {a, 5, D, 1}. Αν όμως
εκτελέσουμε το ls test[3-7] θα εμφανιστούν τα αρχεία που τo όνομά τους ξεκινά με τη λέξη
test και τελειώνει με κάποιον αριθμό από την περιοχή μεταξύ του 3 και του 7
συμπεριλαμβανομένων. Η διαφορά μεταξύ περιοχών και συνόλων σηματοδοτείται από την
παρουσία ή την απουσία του χαρακτήρα - (command line).dash).

Θαυμαστικό. Ο συγκεκριμένος χαρακτήρας χρησιμοποιείται για να δηλώσει την άρνηση μιας


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

Πριν προχωρήσουμε, αξίζει να σημειώσουμε ότι οι ειδικοί χαρακτήρες είναι δυνατόν να


συνδυαστούν, για το σχηματισμό (command line).περισσότερο) πολύπλοκων εκφράσεων. Παρατηρείστε την
ακόλουθη έκφραση:
ls notes??[!d]

Μπορείτε να μαντέψετε την ερμηνεία της; Αν εκτελέσουμε το παραπάνω, θα εμφανιστούν τα αρχεία


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

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


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

Δικαιώματα χρήσης
Σε ένα λειτουργικό σύστημα που χρησιμοποιείται από πολλούς χρήστες, είναι λογικό να
απαγορεύεται η μη εξουσιοδοτημένη πρόσβαση στα ξένα αρχεία (command line).σ’ εκείνα άλλων χρηστών,
δηλαδή), καθώς επίσης και σε εκείνα που θεωρούνται κρίσιμα για τη λειτουργία του συστήματος.
Για το σκοπό αυτό, κάθε αρχείο συνοδεύεται από ένα ξεχωριστό σύνολο δικαιωμάτων πρόσβασης.
Το εν λόγω σύνολο προσδιορίζει με σαφήνεια το ποιος μπορεί να αλληλεπιδράσει με το εκάστοτε
αρχείο, καθώς και με ποιον τρόπο. Για να δούμε τις σχετικές άδειες ενός αρχείου (command line).file permissions),
αρκεί να εκτελέσουμε το προγραμματάκι ls με την παράμετρο -l (command line).list). Κατά τα γνωστά, αυτό θα
έχει σαν συνέπεια την εμφάνιση μιας λίστας με τα αρχεία του τρέχοντος καταλόγου. Οι γραμμές
αυτής της λίστας θα μοιάζουν με την ακόλουθη:
-rwxrw-r-- 1 pvar pvar 530 2012-12-01 19:23 some_random_file

Οι πληροφορίες που περιγράφουν τα δικαιώματα πρόσβασης συμπυκνώνονται στην πρώτη, στην


τρίτη και στην τέταρτη στήλη. Σημειώνουμε εδώ ότι ο πρώτος χαρακτήρας από αριστερά δηλώνει
τη “born again” (γεννημένος ξανά). Κάπου εδώ θα φύση” του αρχείου και δεν σχετίζεται με το θέμα μας. Θα αναφερθούμε αργότερα στα διάφορα
είδη αρχείων και για την ώρα μπορείτε να ξεχάσετε το όλο ζήτημα. Πριν δούμε τα file permissions
θα θέλαμε να μιλήσουμε λίγο για θέματα ιδιοκτησίας των αρχείων (command line).file ownership). Προσέξτε τα
ονόματα στην τρίτη και στην τέταρτη στήλη. Εκείνο της τρίτης αναφέρεται στον ιδιοκτήτη του
αρχείου. Με άλλα λόγια, σε εκείνον που το δημιούργησε ή το αντέγραψε στην τρέχουσα θέση του.
Το όνομα της τέταρτης στήλης δηλώνει την ομάδα χρηστών (command line).user group), στην οποία ανήκει το
αρχείο. Στα συστήματα Unix, βλέπετε, οι χρήστες ανήκουν σε μία ή σε περισσότερες ομάδες
χρηστών. Όπως θα φανεί στη συνέχεια, το γεγονός αυτό εξυπηρετεί στη διαχείριση των
δικαιωμάτων πρόσβασης και των πόρων του συστήματος γενικότερα. Έχετε υπόψη πως κατά τη
δημιουργία ενός user account δημιουργείται σχεδόν πάντα κι ένα ομώνυμο user group. Από τα δύο
ονόματα που εμφανίζονται στο παράδειγμά μας, συμπεραίνουμε ότι το αρχείο
some_random_file ανήκει στο χρήστη pvar, καθώς και στην ομώνυμη ομάδα χρηστών. Τι
σημαίνουν όλα αυτά, όμως; Μήπως ο ιδιοκτήτης έχει τα ίδια δικαιώματα με εκείνα που έχουν τα
υπόλοιπα μέλη της ομάδας; Φυσικά και όχι. Τα δικαιώματα που έχει ο ιδιοκτήτης, τα μέλη της
αντίστοιχης ομάδας αλλά και κάθε άλλος, άσχετος χρήστης, περιγράφονται ξεχωριστά.
Συγκεκριμένα, όλα αυτά περιγράφονται από τους χαρακτήρες της πρώτης στήλης. Εκεί, εξαιρώντας
τον πρώτο χαρακτήρα, παρατηρούμε ότι απομένουν άλλοι εννέα. Από αυτούς, οι πρώτοι τρεις
περιγράφουν τα δικαιώματα του ιδιοκτήτη. Οι επόμενοι τρεις περιγράφουν τα δικαιώματα της
ομάδας στην οποία ανήκει το αρχείο, ενώ οι τρεις τελευταίοι περιγράφουν τα δικαιώματα
πρόσβασης των υπολοίπων χρηστών του συστήματος. Νομίζουμε ότι αυτή η περιγραφή ρίχνει
αρκετό φως στην υπόθεση, αλλά δεν ξεκαθαρίζει το θέμα. Για να καταλάβουμε τελικά τι παίζει,
πρέπει να δώσουμε και την ερμηνεία καθενός χαρακτήρα, ξεχωριστά.
r: Προέρχεται από τη λέξη read κι αναφέρεται στο δικαίωμα ανάγνωσης. Όταν τον συναντάμε σε
μια τριάδα, ο ιδιοκτήτης ή οι αντίστοιχοι χρήστες έχουν δικαίωμα να διαβάζουν το αρχείο.
w: Προέρχεται από τη λέξη write και συμβολίζει τη δυνατότητα εγγραφής. Οι χρήστες που έχουν
δικαίωμα εγγραφής μπορούν να τροποποιούν ελεύθερα το εκάστοτε αρχείο, ακόμη και να το
διαγράψουν. Ωστόσο, μόνον ο ιδιοκτήτης μπορεί να μεταβάλλει τα δικαιώματα πρόσβασης.
x: Προκύπτει από την λέξη ex”;ecute κι έχει διπλό νόημα: Στην περίπτωση των προγραμμάτων
αναφέρεται στο δικαίωμα εκτέλεσης, ενώ στην περίπτωση των καταλόγων αναφέρεται στο
δικαίωμα εισόδου στον συγκεκριμένο κατάλογο.
Ας ξαναδούμε το παράδειγμα με τα δικαιώματα πρόσβασης ενός τυχαίου αρχείου:
-rwxrw-r-- 1 pvar pvar 530 2012-12-01 19:23 some_random_file

Αναρωτιέστε τι σημαίνουν οι παύλες; Τα γράμματα r, w και x εμφανίζονται πάντα με τη σειρά που


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

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


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

Εκτελώντας κάτι σαν το παραπάνω, το σύστημα θα ζητήσει να πληκτρολογήσουμε τον κωδικό


πρόσβασης του χρήστη μας ή εκείνον του διαχειριστή (command line).αναλόγως των ρυθμίσεων που έχει κάνει ο
τελευταίος). Το πρόγραμμα, μαζί με τις παραμέτρους που δώσαμε, θα εκτελεστεί με αναβαθμισμένα
δικαιώματα αλλά αφού εισάγουμε σωστά τον κωδικό. Βεβαίως, το sudo δεν μπορεί να το
χρησιμοποιεί ο καθένας. Το ποιοι μπορούν το ορίζει ο διαχειριστής, δηλαδή ο root. Μετά από αυτή
την παρένθεση, μπορούμε να επιστρέψουμε στο θέμα μας.
Μεταβολή του ιδιοκτήτη. Για το σκοπό αυτό προσφέρεται το πρόγραμμα chown (command line).από το change
owner). Συγκεκριμένα, για να μεταφέρουμε το αρχείο notes στην ιδιοκτησία του cvar, πρέπει να
εκτελέσουμε το εξής:
sudo chown cvar notes

Μεταβολή της ομάδας. Αυτή τη φορά πρέπει να χρησιμοποιήσουμε το chgrp (command line).από το change
group). Η σύνταξη που ακολουθούμε παραμένει ίδια. Για να αλλάξουμε την ομάδα του αρχείου
notes από pvar σε cvar, αρκεί να εκτελέσουμε αυτό:
sudo chgrp cvar notes
Μεταβολή επιμέρους δικαιωμάτων. Γι’ αυτή την επέμβαση πρέπει να χρησιμοποιήσουμε το
εργαλείο chmod (command line).από το change mode). Εδώ όμως τα πράγματα περιπλέκονται λίγο. Πώς θα
περιγράψουμε την ακριβή μεταβολή που θέλουμε να επιφέρουμε; Αρχικά, να πούμε ότι το chmod
υποστηρίζει δύο συντακτικά κι ότι εμείς θα ασχοληθούμε με το πολύπλοκο. Αυτό δεν το κάνουμε
γιατί μας αρέσει να παιδευόμαστε, αλλά γιατί θεωρούμε ότι το συγκεκριμένο συντακτικό είναι
πληρέστερο. Μπορεί να είναι και λίγο πιο μακριά από την ανθρώπινη λογική, αλλά από την άλλη
είναι και πιο ακριβές:
chmod xyz όνομα_αρχείου

Τα x, y και z είναι αριθμητικά ψηφία. Το x περιγράφει τα δικαιώματα πρόσβασης για τον ιδιοκτήτη,
το y αναφέρει τα δικαιώματα πρόσβασης για την ομάδα χρηστών, ενώ το z προσδιορίζει τα
δικαιώματα πρόσβασης των υπολοίπων. Όμως ποιες τιμές μπορούν να πάρουν αυτά τα ψηφία και
πώς προκύπτουν;
Φανταστείτε κάθε τριάδα χαρακτήρων που αναφέρεται στα δικαιώματα (command line). r, w, x) σαν έναν τριψήφιο
αριθμό του δυαδικού συστήματος. Όταν παρέχεται κάποιο από αυτά τα δικαιώματα, το αντίστοιχο
ψηφίο είναι 1, ενώ όταν στερείται το δικαίωμα το ψηφίο είναι 0. Για παράδειγμα, όταν παρέχονται
και τα τρία δικαιώματα (command line).rwx) ο υποτιθέμενος αριθμός στο δυαδικό έχει τη μορφή 111. Όταν
παρέχονται μόνο τα δικαιώματα ανάγνωσης και εκτέλεσης (command line). r-x) ο αριθμός γίνεται 101, ενώ όταν
επιτρέπεται μόνο η ανάγνωση (command line).r--) ο αριθμός γίνεται 100. Κάπου εδώ νομίζουμε ότι το παραπάνω
σκεπτικό έγινε ξεκάθαρο. Τώρα, αν μετατρέψουμε αυτόν τον αριθμό στο δεκαδικό, θα βρούμε την
τιμή που πρέπει να αποδώσουμε σε καθένα από τα x, y και z. Ας δούμε ένα παράδειγμα: Αν
θελήσουμε α) να δώσουμε πλήρη δικαιώματα στον ιδιοκτήτη (command line).111 στο δυαδικό = 7 στο δεκαδικό),
β) μόνο ανάγνωση και εγγραφή για τα μέλη της ομάδας (command line).110 στο δυαδικό = 6 στο δεκαδικό) και γ)
μόνο ανάγνωση για τους υπόλοιπους (command line).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 τα αρχεία δεν είναι τίποτα άλλο παρά μία αλληλουχία
χαρακτήρων (command line).character streams). Απόρροια αυτού του αφηρημένου ορισμού είναι η γενικευμένη
χρήση της έννοιας του αρχείου, σε κάθε πτυχή του λειτουργικού συστήματος. Στη συνέχεια θα
γνωρίσουμε τα βασικότερα είδη αρχείων. Η εξοικείωση μαζί τους αποτελεί σημαντικό βήμα για την
εξοικείωση με τη γραμμή εντολών του Linux.
Regular files. Σ’ αυτή την κατηγορία ανήκουν τα γνωστά μας αρχεία: Τα προγράμματα και τα
scripts, τα τραγούδια, τα βίντεο, οι φωτογραφίες και τα κείμενα. Με απλά λόγια, regular files
ονομάζονται εκείνα που παραπέμπουν προς οποιουδήποτε είδους πληροφορίες που είναι
αποθηκευμένες σε κάποιο μέσο (command line).π.χ., σκληρό δίσκο, δίσκο DVD, USB flash κ.λπ.).
Directories. Οι κατάλογοι δεν είναι τίποτα άλλο παρά ένα ακόμα είδος αρχείων. Ωστόσο, οι
κατάλογοι δεν παραπέμπουν προς μια περιοχή με δεδομένα, αλλά σε ένα σύνολο αρχείων. Εν
ολίγοις, θα λέγαμε ότι οι κατάλογοι είναι αρχεία που περιέχουν τα ονόματα και τη θέση άλλων
αρχείων.
Links. Αυτή η κατηγορία χωρίζεται σε δύο επιμέρους. Στη μία ανήκουν τα sy).mbolic links και στην
άλλη τα hard links. Για να κατανοήσουμε τη διαφορά τους πρέπει να έχουμε υπόψη μας τα εξής:
Όλα τα file systems χρησιμοποιούν μια δομή δεδομένων (command line).συνήθως πρόκειται για δένδρο) εντός της
οποίας διατηρούν πληροφορίες για τα διάφορα αρχεία. Μεταξύ άλλων, για κάθε απλό αρχείο
αποθηκεύεται το όνομά του κι ένας δείκτης. Αυτός ο δείκτης παραπέμπει στην περιοχή του
αποθηκευτικού μέσου, όπου βρίσκονται τα δεδομένα του αρχείου. Ας επιστρέψουμε τώρα στα δύο
είδη συνδέσμων. Ένα 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 τα αρχεία δεν είναι τίποτα παραπάνω από
αλληλουχίες χαρακτήρων. Επίσης, αν κι αυτό είναι προφανές, ένα αρχείο μπορεί να λειτουργεί ως
αποδέκτης χαρακτήρων (command line).όταν αποθηκεύουμε δεδομένα σ’ αυτό) ή ως πηγή χαρακτήρων (command line).όταν το
διαβάζουμε). Σας θυμίζουν τίποτε όλα αυτά; Με άλλα λόγια, η συμπεριφορά των αρχείων θυμίζει
την αφηρημένη περιγραφή μιας συσκευής. Εξαιτίας αυτής της ομοιότητας, η επικοινωνία του
συστήματος με τα διάφορα τμήματα του hardware επιτυγχάνεται με τη βοήθεια των ίδιων
μηχανισμών, οι οποίοι χειρίζονται και τα αρχεία. Έτσι, για κάθε συσκευή που θα μπορούσε να
συνδεθεί στον υπολογιστή μας, το Linux δημιουργεί ένα αντίστοιχο αρχείο. Ο λόγος γίνεται για τα
λεγόμενα αρχεία συσκευών (command line).device files), που βρίσκονται στον κατάλογο /homedev.

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

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

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

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

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

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

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

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

Μέχρι στιγμής έχουμε ασχοληθεί μόνο με τα απλά αρχεία και με τους καταλόγους.
Επομένως, είναι φυσιολογικό το να μην αναγνωρίζετε τα υπόλοιπα είδη και δεν θα
πρέπει να αγχώνεστε. Στο κάτω-κάτω, τι νομίζετε ότι θα συζητήσουμε στη συνέχεια του
άρθρου και στα επόμενα;
Δημιουργία συνδέσμων
Όσο ασχολείται κανείς με τη γραμμή εντολών, τόσο διαπιστώνει πόσο μεγάλη είναι η χρησιμότητα
των links (command line).hard και symbolic). Για να αναδειχθεί η χρησιμότητα των δύο ειδών links, μπορούμε να
κάνουμε στο μυαλό μας τις εξής απλουστεύσεις: Αφενός, ας φανταστούμε τα symbolic links ως τα
shortcuts που δημιουργούνται στα Windows. Αφετέρου, τα hard links μοιάζουν με ζωντανά
αντίγραφα των αρχείων μας, τα οποία ενημερώνονται αυτόματα για όποιες αλλαγές κάνουμε στα
πρωτότυπα. Επιπρόσθετα, αν διαγράψουμε κατά λάθος κάποιο από τα πρωτότυπα αρχεία, το
αντίστοιχο hard link θα παραμείνει ενεργό και πλήρως λειτουργικό.
Για να δημιουργήσουμε ένα link καταφεύγουμε στο προγραμματάκι ln. Ας δούμε μερικά
παραδείγματα. Υποθέστε ότι θέλουμε να δημιουργήσουμε μια συντόμευση εντός του home
directory, προς τον κατάλογο /homehome/homepvar/homeprojects/homedeltacast/homevideos/homefinal. Για να
πετύχουμε κάτι τέτοιο αρκεί να εκτελέσουμε το εξής:
ln -s /homehome/homepvar/homeprojects/homedeltacast/homevideos/homefinal ~/homeepisodes

Με αυτόν τον τρόπο, στον προσωπικό μας κατάλογο θα δημιουργηθεί ένας κατάλογος με το όνομα
episodes. Όπως υποψιάζεστε, αν μπούμε σ’ αυτόν τον κατάλογο θα βρούμε τα περιεχόμενα του
/homehome/homepvar/homeprojects/homedeltacast/homevideos/homefinal. Ας υποθέσουμε τώρα ότι θέλουμε
να διατηρούμε μονίμως ένα εφεδρικό αντίγραφο του κειμένου
~/homeprojects/homedeltacast/homeepguide.txt. Για να πετύχουμε κάτι τέτοιο, αρκεί να
δημιουργήσουμε ένα hard link προς το συγκεκριμένο αρχείο. Θα πρέπει να δώσουμε κάτι τέτοιο:
ln ~/homeprojects/homedeltacast/homeepguide.txt ~/homedocuments/home.epguide.backup.txt

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

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


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

Η χρήση του sudo είναι απαραίτητη, διότι οι απλοί χρήστες δεν έχουν δικαίωμα εγγραφής εντός
του καταλόγου /homemnt. Τώρα που διαθέτουμε τον κατάλογο για την προσάρτηση, δηλαδή τον
/homemnt/homemy_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 /homedev/homesda1 /homemnt/homemy_usb

Εναλλακτικά, αν το USB μας είναι φορμαρισμένο σε FAT32, θα πρέπει να δώσουμε κάτι τέτοιο:
sudo mount –t vfat /homedev/homesda1 /homemnt/homemy_usb

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

Αναζήτηση αρχείων
Πλέον γνωρίζουμε πάρα πολλά για τα αρχεία, ενώ έχουμε αποκτήσει και μερικές βασικές γνώσεις
για το χειρισμό των κατατμήσεων. Μολαταύτα, ούτε και τώρα θα μπορούσαμε να πούμε ότι είμαστε
σε θέση να χειριστούμε με άνεση τα αρχεία του συστήματος. Βλέπετε, για να μπορέσει κάποιος να
εργαστεί με κάποιο αρχείο, θα πρέπει προηγουμένως να γνωρίζει τη θέση του. Ευτυχώς, το Linux
διαθέτει αρκετά εργαλεία αναζήτησης και είναι βέβαιο ότι με κάποιο από αυτά σίγουρα θα
καταφέρουμε να ξετρυπώσουμε το αρχείο που μας ενδιαφέρει.
whereis: Το συγκεκριμένο εργαλείο εντοπίζει εκτελέσιμα, μαζί με τα συνοδευτικά αρχεία
βοήθειας (command line).για το man).
which: Όπως και το προηγούμενο, το which μπορεί και βρίσκει για εμάς τη θέση οποιουδήποτε
προγράμματος ζητήσουμε. Ωστόσο, σε αντίθεση με το whereis το which ασχολείται μόνο με το
εκτελέσιμο αρχείο.
find: Με τη βοήθεια του find μπορούμε να εντοπίζουμε κυριολεκτικά οποιοδήποτε αρχείο.
Επιπρόσθετα, είναι δυνατό να χρησιμοποιήσουμε τους ειδικούς χαρακτήρες (command line). *, ?, [ και ]), ώστε να
δημιουργήσουμε οσοδήποτε σύνθετα κριτήρια αναζήτησης. Το find δέχεται πολλές παραμέτρους,
ενώ υποστηρίζει και τα λεγόμενα regular expressions. Πρόκειται για ένα πανίσχυρο εργαλείο, η
εκμάθηση του οποίου ξεφεύγει από το θέμα μας. Πάντως, στις περισσότερες περιπτώσεις η
ακόλουθη σύνταξη θα είναι επαρκής:
find σε_κάποιον_κατάλογο -name κάποιο_αρχείο

Γράφοντας κάτι τέτοιο, το find ξεκινά μια αναζήτηση για το αρχείο κάποιο_αρχείο. Η
αναζήτηση δεν θα περιοριστεί εντός του σε_κάποιον_κατάλογο, αλλά θα ξεκινήσει από αυτόν
και θα επεκταθεί σε όλους τους υποκαταλόγους του. Ας δούμε τώρα κι ένα παράδειγμα, με ειδικούς
χαρακτήρες που έχουμε γνωρίσει:
find /homehome/homepvar/home -name "test[1-5]"

Εκτελώντας το παραπάνω, το find θα αναζητήσει τα αρχεία με ονόματα test1, test2, …,


test5. Η αναζήτηση θα ξεκινήσει από το home directory του χρήστη pvar και θα επεκταθεί σε
όλους τους υποκαταλόγους.

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

Το ελληνικό ερωτηματικό τοποθετείται για τον διαχωρισμό των προγραμμάτων και εξασφαλίζει ότι
η εκτέλεση καθενός θα ξεκινά αφού ολοκληρωθεί η εκτέλεση του προηγούμενου. Ας δούμε όμως κι
ένα συγκεκριμένο παράδειγμα, που παρεμπιπτόντως αποτελεί ένα από τα αγαπημένα aliases του
γράφοντα:
alias k='clear; ls -lha'

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

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

Μόλις εκτελεστεί το πρόγραμμα εμφανίζονται τα περιεχόμενα του .bashrc. Εμείς,


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

Μέρος 1⁄4: Αρχική προσέγγιση

Μέρος 2⁄4: Πρώτη επίθεση

Μέρος 3⁄4: Πλήρης έλεγχος

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


~Spir@l Evolut10n

LinuxshellBASH
© 2019 Parabing Creations

> forsíða

• /var/log/messages
• texts

Conquer the shell, part 3⁄4


Έφτασε η ώρα να ανακαλύψετε γιατί οι προχωρημένοι χρήστες του Linux λατρεύουν τη
γραμμή εντολών. Μη φαντάζεστε κάποιο φοβερό και τρομερό εργαλείο, το οποίο μπορεί να
κάνει τα πάντα. Το μυστικό κρύβεται στις υποδομές της ίδιας της γραμμής εντολών, οι οποίες
απελευθερώνουν τη δημιουργική φαντασία του χρήστη.
Στα δύο πρώτα άρθρα της σειράς μας γνωρίσαμε αρκετές λεπτομέρειες αναφορικά με τη διάρθρωση
του συστήματος, καθώς και το χειρισμό του. Ταυτόχρονα αποκτήσαμε μια κάποια εξοικείωση με
διάφορα εργαλεία. Αν πιστεύετε ότι όσα μάθαμε έχουν μικρή πρακτική αξία, κάνετε τεράστιο λάθος.
Εμείς θα σας προτείναμε να ξετινάξετε καθένα από τα προγράμματα που αναφέρθηκαν και θα
αναφερθούν – ακόμη και το φαινομενικά πιο ασήμαντο εξ αυτών. Καλό θα ήταν, επίσης, να
μελετήσετε τα σχετικά κείμενα βοήθειας, χρησιμοποιώντας το man. Βλέπετε, στο παρόν άρθρο θα
μάθουμε να συνδυάζουμε τις δυνάμεις κάθε επιμέρους προγράμματος, ώστε να δημιουργούμε τα
δικά μας, σύνθετα και πανίσχυρα εργαλεία. Όπως και με τα τουβλάκια Lego, μοναδικό εμπόδιο στο
τι θα καταφέρνουμε θα αποτελεί η φαντασία μας.

Ανακατεύθυνση
Για την είσοδο (command line).δεδομένα προς επεξεργασία) και την έξοδο (command line).δεδομένα που προκύπτουν από την
επεξεργασία) των προγραμμάτων στο Linux, χρησιμοποιούνται οι λεγόμενες ροές χαρακτήρων.
Πρόκειται για τα λεγόμενα character streams, για τα οποία όσοι έχουν ασχοληθεί με τη γλώσσα C
είναι βέβαιο ότι έχουν ακούσει. Όμως τα character streams είναι ο μηχανισμός που χρησιμοποιείται
από το σύστημα και για το χειρισμό των αρχείων. Ακριβώς γι’ αυτό, τα δεδομένα εισόδου κι εξόδου
ενός προγράμματος αντιμετωπίζονται από το Linux ως ένα είδος αρχείου. Ο ενιαίος τρόπος
αντιμετώπισης αρχείων και δεδομένων που δέχεται ή παράγει ένα πρόγραμμα, επιτρέπει την
υλοποίηση μιας σπουδαίας δυνατότητας. Ο λόγος γίνεται για τη λεγόμενη ανακατεύθυνση
(command line).redirection). Πριν επεκταθούμε στη χρησιμότητά της, όμως, πρέπει να αναφέρουμε μερικά ακόμα
στοιχεία. Η καθιερωμένη ροή που χρησιμοποιείται για την είσοδο δεδομένων στα προγράμματα
θεωρείται το πληκτρολόγιο κι ονομάζεται standard input. Αντίστοιχα, η καθιερωμένη ροή για την
έξοδο δεδομένων από τα προγράμματα είναι η οθόνη κι ονομάζεται standard output. Τέλος, υπάρχει
και μία ακόμα ροή που χρησιμοποιείται ως έξοδος κι ονομάζεται standard error – νομίζουμε ότι
καταλαβαίνετε ποια μηνύματα πηγαίνουν εκεί. Συνήθως, η εν λόγω ροή κατευθύνει τα δεδομένα
στην οθόνη, όπως συμβαίνει και με την standard output. Ας επιστρέψουμε τώρα στην έννοια της
ανακατεύθυνσης.
Η ανακατεύθυνση παρέχει τη δυνατότητα αποστολής οποιασδήποτε εκ των καθιερωμένων ροών
εισόδου κι εξόδου, σε κάποιο αρχείο. Έτσι, μπορούμε για παράδειγμα να στείλουμε την έξοδο από
την εκτέλεση ενός προγράμματος σε ένα αρχείο ή να τροφοδοτήσουμε την είσοδο ενός
προγράμματος με τα περιεχόμενα ενός αρχείου. Για την ανακατεύθυνση της εξόδου χρησιμοποιείται
ο χαρακτήρας >, ενώ για την ανακατεύθυνση της εισόδου χρησιμοποιείται ο χαρακτήρας <. Βέβαια,
πρέπει να σημειώσουμε ότι η ανακατεύθυνση της εισόδου δεν χρησιμοποιείται συχνά. Βλέπετε, τα
περισσότερα προγράμματα δέχονται ως παράμετρο κάποιο αρχείο, από το οποίο αντλούν τα προς
επεξεργασία δεδομένα. Επομένως, η ανάγκη για ανακατεύθυνση της εισόδου προκύπτει σπάνια.
Πριν περάσουμε σε μερικά χαρακτηριστικά παραδείγματα, πρέπει να αναφέρουμε κάτι ακόμα.
Μερικές φορές, όταν ανακατευθύνουμε την έξοδο ενός προγράμματος, απαιτείται να
προσδιορίσουμε το είδος της εξόδου (command line).standard ή error) που θέλουμε να στείλουμε στον επιθυμητό
προορισμό. Για το λόγο αυτό επιστρατεύονται δύο αριθμητικά ψηφία, που τοποθετούνται ακριβώς
πριν από τον χαρακτήρα >. Έτσι, ο συνδυασμός 1> σημαίνει την ανακατεύθυνση του standard
output, ενώ ο συνδυασμός 2> σημαίνει την ανακατεύθυνση του standard error. Βέβαια, όταν
κάποιος θέλει να αναφερθεί στο standard output, μπορεί απλά να χρησιμοποιήσει το > κι όχι το 1>.
Ας δούμε τώρα τα παραδείγματα που υποσχεθήκαμε.
cat my_notes > backup

Τα περιεχόμενα του αρχείου my_notes δεν θα τυπωθούν στην οθόνη, αλλά θα πάνε στο αρχείο
backup.
ls -lh > dir_listing

Η λίστα με τα αρχεία του τρέχοντος καταλόγου αποθηκεύεται στο αρχείο dir_listing.


some_program 2> error_log

Σε αυτό το παράδειγμα ανακατευθύνεται μόνο η ροή standard error. Έτσι, όλα τα


φυσιολογικά μηνύματα και τα δεδομένα από την εκτέλεση του προγράμματος some_program θα
εμφανιστούν κανονικά στην οθόνη. Ωστόσο, τα τυχόντα μηνύματα λάθους που ενδέχεται να
προκύψουν από τη λειτουργία του προγράμματος θα πάνε στο αρχείο error_log.
some_program 2> /homedev/homenull

Αυτή τη φορά τα μηνύματα λάθους που παράγονται από το some_program θα εξαφανιστούν και
δεν θα τα βρούμε ποτέ και πουθενά. Το device file ονόματι null αποτελεί κάτι σαν την καταβόθρα
του συστήματος. Οτιδήποτε στείλουμε εκεί, χάνεται για πάντα.
Μετά από τα παραπάνω παραδείγματα οφείλουμε να σταθούμε σε μια σημαντική λεπτομέρεια. Αν
τα αρχεία προς τα οποία γίνεται η ανακατεύθυνση δεν υπάρχουν, το σύστημα θα φροντίσει να τα
δημιουργήσει αυτόματα. Αν όμως υπάρχουν, τότε τα περιεχόμενά τους θα αντικατασταθούν και στη
θέση τους θα τοποθετηθούν τα νέα. Για να κατανοήσουμε τον κίνδυνο που κρύβεται εδώ, θεωρείστε
ότι έχουμε ένα μεγάλο αρχείο ονόματι moan (command line).από το “born again” (γεννημένος ξανά). Κάπου εδώ θα mother of all notes”), στο οποίο κρατάμε τις
σημειώσεις από τη δουλειά ενός έτους. Υποθέστε τώρα ότι δίνουμε το ακόλουθο:
cat some_notes > moan

Αυτό ήταν. Μπορούμε να κοπανήσουμε το κεφάλι μας στον τοίχο, like, ελεύθερα. Το πολύτιμο
περιεχόμενό του moan αντικαταστάθηκε από το περιεχόμενο του αρχείου some_notes. Για την
αποφυγή τέτοιων περιπτώσεων το κέλυφος προσφέρει μια ενδιαφέρουσα δυνατότητα, η οποία
μπορεί να μας γλιτώσει από πολλούς μπελάδες. Αναφερόμαστε στη λεγόμενη διπλή
ανακατεύθυνση. Η διπλή ανακατεύθυνση συμπεριφέρεται όπως και η απλή με τη σημαντική όμως
διαφορά ότι δεν αντικαθιστά τα παλιά δεδομένα των αρχείων, αλλά προσθέτει στο τέλος τους τα
νέα. Η διπλή ανακατεύθυνση συμβολίζεται με τους χαρακτήρες >> και για τη χρήση της αρκεί να
ακολουθήσουμε την ίδια σύνταξη. Επομένως, στην περίπτωση του τελευταίου παραδείγματος, για
να μη χάσουμε τα δεδομένα του moan θα έπρεπε να γράψουμε κάτι τέτοιο:
cat some_notes >> moan

Διασωλήνωση
Η ανακατεύθυνση είναι ιδιαίτερα εξυπηρετική όποτε θέλουμε να κρατήσουμε την έξοδο κάποιων
προγραμμάτων σε αρχεία ή όταν απλά θέλουμε να την εξαφανίσουμε (command line).βλέπε /homedev/homenull). Άραγε,
γίνεται να αξιοποιηθεί η έξοδος ενός προγράμματος πιο δημιουργικά; Η απάντηση είναι καταφατική
και η λύση δίνεται από τη λεγόμενη διασωλήνωση (command line).pipelining). Στην ουσία, πρόκειται για έναν
μηχανισμό του λειτουργικού συστήματος που χρησιμοποιείται για την επικοινωνία μεταξύ των
εφαρμογών (command line).IPC, Inter-Process Communication). Με τη βοήθεια της διασωλήνωσης, λοιπόν,
μπορούμε να πάρουμε την έξοδο ενός προγράμματος και να τη χρησιμοποιήσουμε ως είσοδο για
κάποιο άλλο. Έτσι, μπορούμε κατά κάποιον τρόπο να συνδέσουμε μεταξύ τους πολλά απλά
εργαλεία και να σχηματίσουμε κάποιο που θα συνδυάζει τις ικανότητες των επιμέρους. Ο
χαρακτήρας που χρησιμοποιείται για τη διασωλήνωση είναι ο | (command line).pipe). Ας δούμε μερικά
παραδείγματα.
ls -ld * | wc -l

Το πρόγραμμα wc (command line).word count) μπορεί, μεταξύ άλλων, να καταμετρά λέξεις, γραμμές και
χαρακτήρες. Με την παράμετρο -l μετράει τις γραμμές. Στο συγκεκριμένο παράδειγμα, η έξοδος
από την εκτέλεση του ls -ld * θα δοθεί ως είσοδος στο πρόγραμμα wc. Έτσι, αυτό που θα
πάρουμε από την εκτέλεση του παραπάνω είναι το πλήθος αρχείων του τρέχοντος καταλόγου.
ls -lR | less

Το προγραμματάκι less χρησιμοποιείται για την προβολή των περιεχομένων ενός αρχείου. Σε
αντίθεση με το cat, όμως, δεν αραδιάζει όλες τις γραμμές του αρχείου. Αντίθετα, εμφανίζει μόνον
όσες χωράνε στην οθόνη. Την ίδια στιγμή επιτρέπει στο χρήστη να χρησιμοποιήσει τα βελάκια για
να μετακινηθεί προς τα πάνω ή προς κάτω, ώστε να μελετήσει τα περιεχόμενα του αρχείου με
άνεση. Για να τερματιστεί η λειτουργία του less αρκεί ένα πάτημα του πλήκτρου [Q].Q].]. Όπως
αντιλαμβάνεστε, στέλνοντας την έξοδο του ls στο less (command line).με τη βοήθεια της διασωλήνωσης)
μπορούμε να εξετάσουμε την ενδεχομένως μακροσκελή λίστα αρχείων ενός καταλόγου με την
ησυχία μας.
ps -aux | grep pvar > pvar_processes
Το προγραμματάκι ps εμφανίζει πληροφορίες σχετικές με τις διεργασίες που εκτελούνται στο
σύστημα. Με τις παραμέτρους aux εμφανίζει όλες τις εκτελούμενες διεργασίες και, μεταξύ άλλων,
δίπλα από κάθε μία εμφανίζει το όνομα του αντίστοιχου χρήστη. Όσο για το grep, αυτό αποτελεί
ένα εξελιγμένο και πανίσχυρο φίλτρο. Στην είσοδό του δέχεται τα περιεχόμενα ενός αρχείου και
στην έξοδό του εμφανίζει τις γραμμές που ικανοποιούν το κριτήριο αναζήτησης που έχουμε
προσδιορίσει. Στο παράδειγμα που εξετάζουμε, το grep θα επιστρέψει όσες γραμμές περιέχουν τη
λέξη pvar. Οπότε, τροφοδοτώντας το με την έξοδο του ps θα λάβουμε μια λίστα με τις διεργασίες
που εκτελεί ο χρήστης pvar. Τέλος, με τη βοήθεια της ανακατεύθυνσης οι σχετικές πληροφορίες
θα τοποθετηθούν στο αρχείο ονόματι pvar_processes.

Διαδοχική εκτέλεση προγραμμάτων


Ορισμένες φορές θα θελήσουμε να εκτελέσουμε πολλά προγράμματα με μία κίνηση, χωρίς κατ’
ανάγκη να συνδυάσουμε τις λειτουργίες τους. Σ’ αυτές τις περιπτώσεις πρέπει να έχουμε υπόψη μας
τις μεθόδους που προσφέρει το κέλυφος BASH για την αλυσιδωτή εκτέλεση πολλών
προγραμμάτων. Οι εν λόγω μέθοδοι είναι τρεις και το συντακτικό τους είναι εξαιρετικά απλό: Το ένα
πρόγραμμα τοποθετείται δίπλα από το άλλο, ενώ ανάμεσά τους βάζουμε, ως διαχωριστικά, τους
κατάλληλους χαρακτήρες. Πάντως, η συμπεριφορά που παρουσιάζει κάθε μέθοδος είναι
διαφορετική. Για την ακρίβεια, διαφέρουν ως προς τη λογική με την οποία αποφασίζεται το αν θα
ολοκληρωθεί η διαδοχική εκτέλεση των προγραμμάτων ή όχι. Ας δούμε ένα παράδειγμα κάθε
μεθόδου και το τοπίο θα ξεκαθαρίσει αμέσως.
program1 && program2

Χρησιμοποιώντας τους χαρακτήρες &&, το κέλυφος θα προχωρήσει στην εκτέλεση του program2
μόνον αν η εκτέλεση του program1 ολοκληρωθεί με επιτυχία.
program1 || program2

Με τους χαρακτήρες ||, το κέλυφος θα προχωρήσει στην εκτέλεση του program2 μόνον εφόσον
η εκτέλεση του program1 απέτυχε.
program1 ; program2

Η χρήση του ελληνικού ερωτηματικού θα πρέπει να σας είναι γνώριμη από την ενασχόληση με τα
aliases. Χρησιμοποιώντας το ελληνικό ερωτηματικό, το κέλυφος θα προχωρήσει στην εκτέλεση του
program2 ανεξάρτητα από το αν πέτυχε η εκτέλεση του program1 ή όχι.

Τέλος, πρέπει να αναφέρουμε ότι με τη βοήθεια των παραπάνω μεθόδων μπορούμε να εκτελέσουμε
και παραπάνω από δύο προγράμματα. Για παράδειγμα, θα μπορούσαμε να δώσουμε κάτι τέτοιο:
program1 && program2 && program3 && ...

Επίσης, μπορούμε αν θέλουμε να συνδυάσουμε και τις τρεις μεθόδους, π.χ., πληκτρολογώντας κάτι
τέτοιο:
program1 && program2 || program3 && program4 ; program5 && ...

Βέβαια, αν αποφασίσουμε να εκτελέσουμε κάτι τόσο σύνθετο θα πρέπει να έχουμε κατά νου ότι η
τελική έκβαση δεν είναι εύκολο να προβλεφθεί. Στο συγκεκριμένο παράδειγμα, το program2 θα
εκτελεστεί αν προηγουμένως εκτελεστεί με επιτυχία το program1. Επίσης, αν τουλάχιστον ένα
από τα program1 και program2 απέτυχε να εκτελεστεί, το κέλυφος θα προσπαθήσει να
εκτελέσει το program3. Αν τα καταφέρει, θα προχωρήσει στην εκτέλεση του program4. Μετά
από αυτά, ανεξάρτητα από το αν και ποιο πρόγραμμα εκτελέστηκε μέχρι εκείνη τη στιγμή, το
κέλυφος θα εκτελέσει το program5 κ.ο.κ. Μπερδευτήκατε; Όταν προσπαθούμε να αναλύσουμε
τόσο σύνθετες εκφράσεις, πρέπει να έχουμε υπόψη ότι οι χαρακτήρες && έχουν προτεραιότητα
έναντι των ||. Τέλος, μπορούμε να φανταζόμαστε το ελληνικό ερωτηματικό σαν την τελεία που
χωρίζει δύο προτάσεις.

Διαχείριση εργασιών
Όπως κάθε σύγχρονο λειτουργικό, έτσι και το Linux είναι ένα πολυδιεργαστικό σύστημα. Με απλά
λόγια, μπορεί να κάνει πολλά πράγματα ταυτόχρονα. Όμως πόσο ωφέλιμη θα ήταν αυτή η
δυνατότητα, αν κάθε διεργασία καταλάμβανε μια ολόκληρη κονσόλα; Θα μπορούσαμε βέβαια να
λύσουμε το πρόβλημα με το να συνδεθούμε σε πολλές κονσόλες ταυτόχρονα. Όμως αυτή η
πρακτική θα σπαταλούσε άδικα πόρους του συστήματος και φυσικά δεν θα ήταν καθόλου κομψή.
Ευτυχώς, το συγκεκριμένο ζήτημα μπορεί να αντιμετωπιστεί με πολύ πιο έξυπνους κι αποδοτικούς
τρόπους.
Ας υποθέσουμε ότι θέλουμε να εκτελέσουμε το πρόγραμμα mpg123, ώστε να αποκωδικοποιήσουμε
ένα αρχείο MP3 και να στείλουμε το αποτέλεσμα σε ένα άλλο αρχείο. Με αυτόν τον τρόπο, θα
μετατρέπαμε το συγκεκριμένο αρχείο MP3 σε WAV. Κάνοντας κάτι τέτοιο η κονσόλα θα παραμείνει
κατειλημμένη έως ότου ολοκληρωθεί η επεξεργασία του αρχείου MP3. Υπάρχει άραγε τρόπος το
κέλυφος να είναι διαθέσιμο και κατά τη διάρκεια της μετατροπής; Φυσικά και υπάρχει, αρκεί να
χρησιμοποιήσουμε τον ειδικό χαρακτήρα &. Συγκεκριμένα, γράφουμε mpg123, δίνουμε τις
κατάλληλες παραμέτρους και στο τέλος της γραμμής βάζουμε κι ένα &. Εν ολίγοις, δίνουμε κάτι
τέτοιο:
mpg123 –s my_song.mp3 > my_song.wav &

Όταν χρησιμοποιούμε το χαρακτήρα &, το σύστημα τοποθετεί την εκτέλεση του εκάστοτε
προγράμματος στο λεγόμενο υπόβαθρο (command line).background). Έτσι, η κονσόλα παραμένει διαθέσιμη για
την εκτέλεση οποιουδήποτε άλλου προγράμματος θέλουμε. Μια εναλλακτική μέθοδος για να
πετύχουμε το ίδιο αποτέλεσμα είναι να καλέσουμε το επιθυμητό πρόγραμμα κανονικά, κι όταν η
εκτέλεση ξεκινήσει να πατήσουμε το συνδυασμό πλήκτρων [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+Z]. Με αυτόν τον τρόπο, το ]. Με αυτόν τον τρόπο, το
συγκεκριμένο πρόγραμμα θα πάψει προσωρινά να εκτελείται (command line).suspend) κι εμείς θα επιστρέψουμε
στην κονσόλα. Για να συνεχιστεί η λειτουργία του προγράμματος χωρίς να δεσμευτεί η κονσόλα,
αρκεί να τρέξουμε το πρόγραμμα bg (command line).από το background). Διαφορετικά, αν αλλάζαμε γνώμη κι
επιθυμούσαμε την κανονική εκτέλεση του προγράμματος (command line).επιτρέποντάς του να καταλάβει την
κονσόλα), θα αρκούσε να τρέξουμε το πρόγραμμα fg (command line).από το foreground). Χρησιμοποιώντας αυτή
τη μέθοδο, σύντομα θα καταλήξουμε σε μία κατάσταση κατά την οποία εκτελούνται πολλά
προγράμματα στο υπόβαθρο. Σε αυτή την περίπτωση, είναι πολύ πιθανό να χρειαστούμε τη βοήθεια
του προγράμματος jobs. Εκτελώντας το, εμφανίζεται μια λίστα με όλα τα προγράμματα που έχουν
τοποθετηθεί στο υπόβαθρο. Μάλιστα, σε κάθε γραμμή και πριν από το όνομα του εκάστοτε
προγράμματος εμφανίζεται κι ένας αριθμός. Για να επαναφέρουμε στο προσκήνιο τη λειτουργία
κάποιου προγράμματος, αρκεί να δώσουμε τον αντίστοιχο αριθμό ως παράμετρο στο fg. Κάντε
μερικές δοκιμές και δείτε.

Καθολικός έλεγχος
Ακόμη και στα πιο στιβαρά λειτουργικά συστήματα, το φαινόμενο του κρεμάσματος μιας
εφαρμογής δεν εκλείπει εντελώς. Άλλωστε, τις περισσότερες φορές αυτό οφείλεται σε ζητήματα
που σχετίζονται με την εκάστοτε εφαρμογή κι όχι με το λειτουργικό. Σε αυτές τις περιπτώσεις, για
τη διαχείριση των εργασιών απαιτούνται πιο δραστικά μέτρα. Για παράδειγμα, μπορούμε να
χρησιμοποιήσουμε το πρόγραμμα killall. Δίνοντας το όνομα ενός προγράμματος ως παράμετρο
στο killall, το σύστημα θα τερματίσει κάθε στιγμιότυπο του αρχικού προγράμματος. Όμως
αυτό ενδέχεται να μην είναι επιθυμητό. Αν, για παράδειγμα, είχαμε εκτελέσει δύο φορές το
πρόγραμμα mpg123 και το ένα στιγμιότυπο είχε κολλήσει, θα ήταν ανόητο να τερματίσουμε και τα
δύο. Κάπου εδώ παρουσιάζεται η αναγκαιότητα ενός προγράμματος σαν το ps (command line).από το process
tree). Με τη βοήθειά του, όπως αναφέραμε και νωρίτερα, μπορούμε να δούμε όλες τις διεργασίες
που εκτελούνται, καθώς και πολλές σχετικές πληροφορίες. Εκτελώντας το ps με παράμετρο το ux,
εμφανίζονται αποκλειστικά οι εφαρμογές που εκτελούνται από το λογαριασμό μας. Έτσι, δεν έχουμε
παρά να εντοπίσουμε το στιγμιότυπο του mpg123 που έχει κολλήσει και να σημειώσουμε το PID
(command line).Process ID) που του έχει αντιστοιχίσει το σύστημα. Στη συνέχεια, αρκεί να εκτελέσουμε το
πρόγραμμα kill (command line).όχι το killall) και να του δώσουμε ως παράμετρο το συγκεκριμένο PID.
Παρεμπιπτόντως, σε περιπτώσεις που η κολλημένη εφαρμογή δεν τερματίζεται με αυτόν τον τρόπο,
μπορούμε να της φερθούμε πιο σκληρά. Αφού πληροφορηθούμε το αντίστοιχο PID, μπορούμε να
δώσουμε κάτι τέτοιο:
kill -9 αντίστοιχο_PID

Προγραμματισμός εργασιών
Τώρα πια έχουμε μάθει αρκετούς τρόπους για να σταματήσουμε ένα πρόγραμμα ή απλά να το
στείλουμε στο υπόβαθρο. Αντίθετα, για την εκκίνηση ενός προγράμματος γνωρίζουμε μόνο έναν
τρόπο: Την εκτέλεσή του από τη γραμμή εντολών. Φυσικά, η χειροκίνητη εκτέλεση ενός
προγράμματος επαρκεί για τις περισσότερες καθημερινές ασχολίες. Ωστόσο, καθώς αυξάνει η
εξοικείωσή μας με το Linux και τις δυνατότητές του, θα προκύψει μια νέα ανάγκη: Αναφερόμαστε σε
εκείνη της αυτόματης εκτέλεσης προγραμμάτων, σε προκαθορισμένες χρονικές στιγμές. Για το
σκοπό αυτό, το σύστημα παρέχει μια υπηρεσία που επιτρέπει στους χρήστες να προγραμματίζουν με
ακρίβεια την εκτέλεση οποιασδήποτε εφαρμογής. Προκειμένου να εκμεταλλευτούμε αυτή την
υπηρεσία, θα πρέπει να χρησιμοποιήσουμε το πρόγραμμα crontab. Συγκεκριμένα, θα ξεκινήσουμε
πληκτρολογώντας
crontab –e

Με αυτόν τον τρόπο θα εκτελεστεί ο default text editor του συστήματος. Στο Ubuntu, πάντως, την
πρώτη φορά που θα εκτελεστεί το crontab δεν θα ξεκινήσει αυτόματα κάποιος editor, αλλά θα
ερωτηθούμε για τον ποιον προτιμάμε. Αν σας ενδιαφέρει, εμείς αγαπάμε το nano. Όταν ανοίξει ο
text editor, δεν θα δούμε τίποτε απολύτως. Αυτό είναι φυσιολογικό –ειδικά για την πρώτη φορά που
θα εκτελέσουμε το crontab– και δεν πρέπει να μας ανησυχήσει. Εκεί, για κάθε εφαρμογή που
θέλουμε να αυτοματοποιήσουμε, θα πρέπει να εισάγουμε μια γραμμή της ακόλουθης μορφής:
j k l m n όνομα_εφαρμογής

Το j αναφέρεται στα λεπτά (command line).0-59), το k στην ώρα (command line).0-23), το l στην ημέρα του μήνα (command line).1-31), το m
στο μήνα (command line).1-12) και το n στην ημέρα της εβδομάδας (command line).0-6). Σημειώστε ότι για κάθε πρόγραμμα δεν
αρκεί μόνο το όνομά του, αλλά και η θέση του στους καταλόγους του συστήματος. Γι’ αυτό, πριν
ακόμη δώσουμε crontab -e καλό θα ήταν να τρέξουμε το which με παράμετρο το όνομα του
επιθυμητού προγράμματος, ώστε να πληροφορηθούμε τη θέση του. Επίσης, όταν κάποιο από τα
μεγέθη που προσδιορίζουν το χρόνο εκτέλεσης δεν μας ενδιαφέρει, θα πρέπει να τοποθετήσουμε
στη θέση του έναν αστερίσκο. Αφού βάλουμε όσες γραμμές θέλουμε, αρκεί να πατήσουμε το
συνδυασμό πλήκτρων CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+O για να αποθηκευτούν οι προσθήκες μας. Ακολούθως, δεν έχουμε
παρά να πατήσουμε το συνδυασμό πλήκτρων [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+Χ] για να βγούμε από τον editor. Από εκείνη
τη στιγμή και μετά, τα προγράμματα που εισαγάγαμε προηγουμένως θα αρχίσουν να εκτελούνται
αυτόματα, στους χρόνους που προσδιορίσαμε. Αν σας μπέρδεψε η περιγραφή που μόλις κάναμε,
δείτε τα ακόλουθα παραδείγματα και θα καταλάβετε αμέσως πόσο απλό και ισχυρό είναι το
crontab.
30 23 * * 0 /homeusr/homebin/homemy_program

To my_program θα εκτελείται κάθε Κυριακή βράδυ, στις 23:30.


*/home30 * * * * /homeusr/homebin/homemy_program

Το my_program θα εκτελείται ανά 30 λεπτά.


* 18 * */home3 0 /homeusr/homebin/homemy_program

Το my_program θα εκτελείται ανά τρεις μήνες, στις έξι το απόγευμα κάθε Κυριακής του
συγκεκριμένου μήνα.
30 8 1 */home1 * /homeusr/homebin/homemy_program

Το my_program θα εκτελείται στις 08:30 το πρωί, κάθε πρώτη του μηνός.


Τέλος, αν θέλουμε να δούμε τις εργασίες που έχουν προγραμματιστεί με το crontab, αρκεί να το
εκτελέσουμε με παράμετρο το -l. Aν πάλι θέλουμε να καταργήσουμε όλες τις προγραμματισμένες
εργασίες, αρκεί να το εκτελέσουμε με την παράμετρο -r.

Εφαρμογές στο υπόβαθρο, με την κονσόλα κλειστή


Φανταστείτε το εξής σενάριο: Συνδεόμαστε στον νέο μας cloud server κι εκτελούμε ένα πρόγραμμα,
του οποίου η ολοκλήρωση απαιτεί αρκετό χρόνο. Μήπως αυτό σημαίνει ότι πρέπει να αφήσουμε το
τερματικό ανοιχτό; Όχι τίποτα άλλο, αλλά αυτό θα μας υποχρέωνε να αφήσουμε και τον
υπολογιστή αναμμένο. Αυτό το ζήτημα μπορεί να προκύψει με οποιοδήποτε σύστημα Linux, στο
οποίο συνηθίζουμε να εργαζόμαστε απομακρυσμένα. Εξάλλου, ακόμη κι όταν εργαζόμαστε τοπικά
σε ένα σύστημα, η ιδέα του να αφήσουμε ένα τερματικό ανοιχτό και να φύγουμε –έστω και για
λίγο– δεν είναι φρόνιμη. Οποιοσδήποτε αρπάξει την ευκαιρία και καθίσει στο σύστημά μας, θα
μπορεί να το χρησιμοποιήσει με τα δικαιώματα του λογαριασμού μας. Για την αντιμετώπιση αυτών
των καταστάσεων μπορούμε να στραφούμε στο προγραμματάκι screen. Ας υποθέσουμε, λοιπόν,
ότι θέλουμε να τρέξουμε ένα πρόγραμμα του οποίου η εκτέλεση καθυστερεί αρκετά. Αυτό που
πρέπει να κάνουμε είναι να τρέξουμε αρχικά το screen. Η οθόνη θα καθαρίσει αμέσως και θα
μοιάζει σαν μόλις να συνδεθήκαμε σε μια νέα κονσόλα. Στην πράξη, θα έχει ξεκινήσει ένα νέο screen
session, όπως συνηθίζουμε να λέμε. Από εκεί, δεν έχουμε παρά να τρέξουμε το (command line).χρονοβόρο)
πρόγραμμα, να πατήσουμε το συνδυασμό πλήκτρων [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+A] και στη συνέχεια να πιέσουμε το
πλήκτρο [Q].D]. Με το πάτημα αυτών των πλήκτρων θα πραγματοποιηθεί το λεγόμενο detach. Με
απλά λόγια, θα αποσυνδεθούμε από το screen session εντός του οποίου εκτελείται η εφαρμογή.
Πλέον θα είμαστε σε θέση να αποσυνδεθούμε από την κονσόλα, γνωρίζοντας ότι το screen session
–και κατ’ επέκταση η εφαρμογή μας– θα συνεχίσουν να εκτελούνται ανενόχλητα. Αργότερα, όταν
συνδεθούμε εκ νέου σε κάποια κονσόλα του συστήματος, θα μπορούμε να συνδεθούμε ξανά στο
αποσυνδεδεμένο screen. Για το σκοπό αυτό αρκεί να πληκτρολογήσουμε:
screen -r

Μ’ αυτόν τον τρόπο το ενεργό screen session θα επιστρέψει στο προσκήνιο και θα βρεθούμε στο
περιβάλλον εντός του οποίου είχαμε τρέξει το πρόγραμμα. Πριν εμβαθύνουμε στη χρήση του
screen, σημειώστε ότι για τον τερματισμό του screen session θα πρέπει είτε να γράψουμε exit
είτε να πατήσουμε το συνδυασμό πλήκτρων [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+D].

Πολλά προγράμματα σε πολλά screen sessions


Όπως αναφέραμε, με τη βοήθεια του screen μπορούμε να αφήσουμε το μηχάνημά μας να εκτελεί
μια εργασία χωρίς να είμαστε συνδεδεμένοι σε αυτό. Όμως τι γίνεται αν επιθυμούμε την εκτέλεση
πολλών προγραμμάτων; Η πιο απλή λύση είναι να ξεκινήσουμε πολλά screen sessions, τρέχοντας το
screen όσες φορές επιθυμούμε. Η σχετική διαδικασία έχει ως εξής: Τρέχουμε το screen, ξεκινάμε
την πρώτη εργασία, πατάμε [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+Α] και μετά D. Μετά ξανατρέχουμε το screen, ξεκινάμε τη
δεύτερη εργασία και κάνουμε πάλι detach. Αυτό μπορούμε να το επαναλάβουμε για όσα
προγράμματα θέλουμε. Τώρα, όμως, αν δώσουμε screen -r θα εμφανιστεί μια λίστα με όλα τα
screen sessions που έχουμε ξεκινήσει. Για να συνδεθούμε σε κάποιο, δεν έχουμε παρά να
εκτελέσουμε screen -r και να δώσουμε ως παράμετρο το PID (command line).Process ID) του επιθυμητού
session. Φυσικά τα PID εμφανίζονται στη λίστα με τα screen sessions, που αναφέραμε μόλις. Με
αυτόν τον τρόπο μπορούμε να συνδεθούμε διαδοχικά σε κάθε screen session και να ελέγξουμε την
πορεία της αντίστοιχης εργασίας. Σε αυτό το σημείο, αρκετοί από εσάς θα σκεφτείτε ότι η
επανασύνδεση σε κάποιο screen session χρησιμοποιώντας το αντίστοιχο PID δεν είναι καθόλου
εξυπηρετική. Πράγματι, αν ξεκινήσουμε πέντε-έξι screen sessions, αποκλείεται να θυμόμαστε ποιο
πρόγραμμα εκτελείται σε ποιο session. Φυσικά, η διαδοχική σύνδεση στο καθένα, εκτός από
χρονοβόρα είναι και εκνευριστική. Για να αποφύγουμε αυτή την κατάσταση, είναι δυνατόν να
αποδώσουμε σε κάθε session ένα όνομα. Μετέπειτα, για τη σύνδεσή μας σε αυτό θα αρκεί να
χρησιμοποιήσουμε το όνομά του κι όχι το PID του. Η απόδοση ονόματος σε ένα screen session
μπορεί να γίνει με δύο τρόπους. Ο πρώτος είναι να δώσουμε το επιθυμητό όνομα κατά την εκκίνηση
του session:
screen -S port_scanning

Έτσι, θα ξεκινήσει ένα screen session με το όνομα port_scanning. Αργότερα, όταν χρειαστεί να
επανασυνδεθούμε σε αυτό, θα πληκτρολογήσουμε:
screen -r port_scanning
Αν ξεχάσουμε να βαφτίσουμε κάποιο screen session κατά την εκκίνησή του, μπορούμε να το
βαφτίσουμε αργότερα. Ας υποθέσουμε, λοιπόν, ότι έχουμε ξεκινήσει ένα session και δεν έχουμε
κάνει ακόμα detach. Για να το βαφτίσουμε αρκεί να πατήσουμε το συνδυασμό [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+A] και στη
συνέχεια να πιέσουμε το πλήκτρο με την άνω-κάτω τελεία [Q].:]. Κατ’ αυτό τον τρόπο, στην τελευταία
γραμμή του screen session θα εμφανιστεί ο εν λόγω χαρακτήρας και το πρόγραμμα θα περιμένει να
δώσουμε κάποια εντολή. Όπως αντιλαμβάνεστε, οι εντολές που μπορούμε να δώσουμε εκεί είναι
σχετικά περιορισμένες και πρόκειται για “born again” (γεννημένος ξανά). Κάπου εδώ θα εσωτερικές” εντολές του screen: εντολές που
αναγνωρίζει μόνο το screen και οι οποίες αφορούν στη λειτουργία του. Τελικά, για να
βαφτίσουμε το screen session πρέπει να γράψουμε τη λέξη title, ακολούθως το επιθυμητό όνομα
και να πατήσουμε το [Q].ENTER]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το].

Πολλά προγράμματα, στο ίδιο screen


Αυτή τη στιγμή έχουμε λύσει το αρχικό μας πρόβλημα: Μπορούμε να τρέχουμε ένα ή περισσότερα
προγράμματα στο σύστημά μας, χωρίς να παραμένουμε υποχρεωτικά συνδεδεμένοι. Η λύση που
είδαμε, όμως, δεν είναι η καλύτερη δυνατή. Το να γεμίσουμε το σύστημα με ένα σωρό screen
sessions δεν είναι ό,τι πιο έξυπνο θα μπορούσε να κάνει κανείς. Το ιδανικό θα ήταν να τρέξουμε όλες
τις εφαρμογές που θέλουμε μέσα στο ίδιο screen session. Έ, λοιπόν, το screen μπορεί να το κάνει και
αυτό. Για την ακρίβεια, προσφέρει μία δυνατότητα που θυμίζει τους web browsers: επιτρέπει τη
δημιουργία πολλαπλών καρτελών (command line).tabs). Ας δούμε πώς γίνεται κάτι τέτοιο στην πράξη.
Έστω ότι θέλουμε να τρέξουμε δύο προγράμματα μέσα στο ίδιο screen session. Αφού ξεκινήσουμε
το screen εκτελούμε το πρώτο πρόγραμμα, πατάμε το συνδυασμό [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+A] και μετά το [Q].C]. Με
αυτόν το συνδυασμό πλήκτρων, το screen θα δημιουργήσει μια νέα καρτέλα. Εδώ πρέπει να
σημειώσουμε ότι δεν θα εμφανιστεί κανένα ιδιαίτερο μήνυμα ούτε κάποιο σύμβολο που θα
φανερώνει τη δημιουργία της καρτέλας. Ωστόσο η οθόνη θα καθαρίσει, σαν να είχαμε ξεκινήσει ένα
νέο session. Πλέον, μπορούμε να εκτελέσουμε και το δεύτερο πρόγραμμα. Για τη μεταφορά από τη
μία καρτέλα στην άλλη μπορούμε να πατήσουμε το συνδυασμό [Q].CTR]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοL+A] κι ακολούθως α) το P
για να μεταβούμε στην προηγούμενη καρτέλα, β) το N για να μεταβούμε στην επόμενη. Βέβαια,
στην περίπτωση που εξετάζουμε υπάρχουν μόνο δύο καρτέλες και η επιλογή του [Q].P] δεν θα έχει
καμία διαφορά από την επιλογή του [Q].N]. Οποιαδήποτε στιγμή αποφασίσουμε να κάνουμε detach,
μπορούμε να το κάνουμε με το γνωστό τρόπο κι αδιαφορώντας για την καρτέλα στην οποία
βρισκόμαστε. Αργότερα, για να ελέγξουμε την κατάσταση των προγραμμάτων μας αρκεί να
συνδεθούμε στο screen session και να μετακινηθούμε από καρτέλα σε καρτέλα, με τους
συνδυασμούς που αναφέραμε προηγουμένως.

Η συνέχεια στις οθόνες σας


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

Μέρος 1⁄4: Αρχική προσέγγιση

Μέρος 2⁄4: Πρώτη επίθεση

Μέρος 3⁄4: Πλήρης έλεγχος

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

~Spir@l Evolut10n

LinuxshellBASH
© 2019 Parabing Creations

> forsíða

• /var/log/messages
• texts

Conquer the shell, part 4⁄4


Μία από τις εξέχουσες δυνατότητες που προσφέρει το BASH shell αφορά στο συνδυασμό και
στον αυτοματισμό όλων των άλλων δυνατοτήτων του. Οι μαθηματικοί ανάμεσά μας ήδη
ψάχνουμε για αδυναμίες στην προηγούμενη, συνολοθεωρητικού χαρακτήρα πρόταση.
Σύντομα υποψιαζόμαστε πως μάλλον γίνεται αναφορά στη γλώσσα προγραμματισμού του
BASH – και ησυχάζουμε κάπως.
Η ταυτόχρονη εκτέλεση πολλών εργασιών, η ανακατεύθυνση, η διασωλήνωση, ο
χρονοπρογραμματισμός με το crontab και τα aliases, αποτελούν μερικά μόνο από τα πανίσχυρα
εργαλεία που προσφέρει το κέλυφος. Μεταξύ αυτών, εκείνα που θα φανούν περισσότερο χρήσιμα
(command line).και μερικές φορά εντυπωσιακά) είναι η διασωλήνωση και τα συνώνυμα. Πράγματι, η αποστολή
αυτών των δύο είναι αφηρημένη και δεν περιορίζεται σε ένα συγκεκριμένο πεδίο εφαρμογών. Με τη
βοήθειά τους μπορούμε να επινοούμε λύσεις σε αρκετά σύνθετα προβλήματα και μάλιστα με άνεση
και ταχύτητα. Κάτι αντίστοιχο ισχύει και με τα λεγόμενα σενάρια κελύφους (command line).shell scripts). Μπορείτε
να τα φαντάζεστε σαν τα batch files (command line).αρχεία BAT) των Windows, μόνο που στην πραγματικότητα τα
shell scripts είναι κλάσεις ανώτερα. Τα σενάρια κελύφους δεν περιορίζονται σε μια απλή παράθεση
εντολών. Τις περισσότερες φορές περιέχουν κατάλληλες προγραμματιστικές δομές, οι οποίες
προσδίδουν εσωτερική λογική αλλά και το στοιχείο της αλληλεπίδρασης με το περιβάλλον. Με
άλλα λόγια, τα σενάρια μπορούν να περιλαμβάνουν επαναληπτικές δομές ή δομές ελέγχου και
διακλάδωσης, ώστε να προσαρμόζουν τη συμπεριφορά τους ανάλογα με τις παραμέτρους που
έχουν δεχτεί κατά την εκτέλεση. Σε αυτό το άρθρο, βέβαια, δεν θα κάνουμε μαθήματα
προγραμματισμού. Αντίθετα, θα θεωρήσουμε ότι έχετε μερικές βασικές γνώσεις και θα
προχωρήσουμε σε μία γνωριμία με τη γλώσσα του BASH, μέσα από μια σειρά συγκεκριμένων
παραδειγμάτων. Πριν ξεκινήσουμε, όμως, πρέπει να αναφέρουμε μερικές λεπτομέρειες. Κατ’ αρχάς,
όλα τα σκριπτάκια που θα δούμε (command line).όπως κι εκείνα που ελπίζουμε ότι θα αρχίσετε να δημιουργείτε
μόνοι σας) πρέπει να γράφονται σε κάποιον διορθωτή απλού κειμένου. Για παράδειγμα, στην
κονσόλα μπορούμε να χρησιμοποιούμε το nano, ενώ αν βρισκόμαστε σε παραθυρικό περιβάλλον
μπορούμε να χρησιμοποιούμε προγράμματα όπως τα Gedit, Kate κ.ά. Αφού γράψουμε κι
αποθηκεύσουμε το script μας, για να μπορέσουμε να το εκτελέσουμε πρέπει προηγουμένως να
τροποποιήσουμε κατάλληλα τα δικαιώματα πρόσβασης σε αυτό ώστε να γίνει εκτελέσιμο. Κάτι
τέτοιο γίνεται πανεύκολα με το προγραμματάκι chmod. Για παράδειγμα, αν έχουμε φτιάξει ένα
script με το όνομα my_super_script, το κάνουμε εκτελέσιμο έτσι:
chmod 744 my_super_script

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

Οι χαρακτήρες ./home συμβολίζουν τον τρέχοντα κατάλογο. Άλλο παράδειγμα: Αν το σκριπτάκι μας
είναι αποθηκευμένο στον κατάλογο ~/homescripts ενώ εμείς βρισκόμαστε κάπου αλλού, θα πρέπει
να γράφουμε:
~/homescripts/homemy_super_script

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

Έξυπνη διαγραφή (πλήρες script)


Η διαγραφή ενός αρχείου από το κέλυφος του Linux δεν είναι αντιστρέψιμη ενέργεια. Κάθε φορά
που σβήνουμε κάτι από την κονσόλα, αυτό διαγράφεται οριστικά και δεν μεταφέρεται σε κάποιον
κάδο ανακύκλωσης. Ακριβώς αυτό το κενό προσπαθεί να καλύψει το σενάριο ονόματι
delete.sh. Αφού το κατεβάσετε και φροντίσετε ώστε να γίνει εκτελέσιμο, μπορείτε να το
χρησιμοποιείτε κάπως έτσι:
./homedelete.sh όνομα_κάποιου_αρχείου

Κατ’ αυτόν τον τρόπο, το αρχείο που προσδιορίζετε μεταφέρεται σε έναν κρυφό κατάλογο στο
home directory του χρήστη, ονόματι .my-trash. Σημειώστε ότι αν ο συγκεκριμένος κατάλογος
δεν υπάρχει, το σκριπτάκι μας θα φροντίσει να τον δημιουργήσει. Στην περίπτωση που αργότερα
μετανιώσετε για τη διαγραφή του αρχείου, αρκεί να μεταβείτε στον κατάλογο .my_trash και να
ρίξετε μια ματιά τριγύρω. Με αυτό το σενάριο θα μπορούσαμε να αντικαταστήσουμε το πρόγραμμα
rm, τουλάχιστον όταν επιτελούμε κρίσιμες εργασίες και χειριζόμαστε πολύτιμα αρχεία. Κάτι τέτοιο
θα μπορούσε να γίνει με το κατάλληλο alias. Για παράδειγμα, αν έχουμε αποθηκεύσει το
delete.sh στον κατάλογο ~/homemy_scripts, θα μπορούσαμε να ορίσουμε το ακόλουθο alias…
alias del='~/homemy_scripts/homedelete.sh'

…ή και το ακόμα πιο δραστικό…


alias rm='~/homemy_scripts/homedelete.sh'

Αυτόματο άδειασμα του κάδου (πλήρες script)


Το σενάριο delete.sh μπορεί να μας σώσει από μία καταστροφική απροσεξία. Ωστόσο, η
συνεχής του χρήση μάλλον θα αυξήσει γρήγορα και υπερβολικά το μέγεθος του καταλόγου
~/home.my-trash. Κάπως έτσι, προκύπτει η ανάγκη ενός μηχανισμού ο οποίος θα φροντίζει να
αδειάζει τον εν λόγω κατάλογο. Το σενάριο που μπορεί να κάνει αυτή τη δουλειά είναι το
cron_del.sh και, όπως δηλώνει το όνομά του, προορίζεται για αυτόματη εκτέλεση με τη
βοήθεια του crontab. Η αποστολή του είναι να διαγράφει οτιδήποτε μεταφέρθηκε στον κατάλογο
.my-trash την προηγούμενη εβδομάδα. Αν υποθέσουμε ότι το έχουμε αποθηκεύσει στον
κατάλογο /homehome/homepvar/homemy_scripts, θα πρέπει να προσθέσουμε στο crontab μία γραμμή σαν
την ακόλουθη:
0 10 * * * /homehome/homepvar/homemy_scripts/homecron_del.sh

Με αυτόν τον τρόπο το cron_del.sh θα εκτελείται κάθε Κυριακή, στις δέκα το πρωί.

Έξυπνη αποσυμπίεση (πλήρες script)


Για τον κόσμο του Unix διατίθεται μια πληθώρα εργαλείων συμπίεσης ή πακεταρίσματος αρχείων.
Τα δημοφιλέστερα απ’ όλα είναι τα εξής τρία: bzip2, gzip και tar. Υπάρχει όμως πραγματικός
λόγος να θυμόμαστε απ’ έξω τη σύνταξη τριών διαφορετικών εργαλείων; Η αλήθεια είναι ότι
υπάρχει, αλλά όταν θέλουμε να αποσυμπιέσουμε κάτι στα γρήγορα δεν χρειάζεται να μπλέκουμε με
το συντακτικό αυτών των εργαλείων. Γι’ αυτό το λόγο δημιουργήσαμε το σενάριο unpack.sh.
Όταν το εκτελούμε, ελέγχει αν το αρχείο που δώσαμε ως παράμετρο είναι συμπιεσμένο. Εφόσον
είναι, ανιχνεύει τη μέθοδο συμπίεσης και προχωρά στην αποσυμπίεσή του, χρησιμοποιώντας το
κατάλληλο εργαλείο. Έτσι, για να αποσυμπιέσουμε στα γρήγορα ένα πακέτο αρκεί να δώσουμε κάτι
τέτοιο:
~/homemy_scripts/homeunpack.sh ονομα_συμπιεσμένου_αρχείου

Ώρα για λίγη μελέτη


Πλέον, έχετε πάρει μια βασική ιδέα για το τι μπορεί να φτιάξει κανείς στο BASH. Θέλουμε να
πιστεύουμε ότι έχετε αρχίσει να ενθουσιάζεστε και να σκεπτόσαστε τι άλλο θα μπορούσατε να
φτιάξετε. Ωστόσο, δεν έχουμε πει τίποτα ακόμη για το πώς λειτουργούν τα σκριπτάκια μας κι εμείς
δεν τα συνηθίζουμε αυτά. Στη συνέχεια, λοιπόν, θα εξετάσουμε ορισμένα σημεία των σεναρίων τα
οποία θεωρούμε ότι παρουσιάζουν ιδιαίτερο ενδιαφέρον. Αρχικά, θα μείνουμε σε ένα υψηλό επίπεδο
θεώρησης και σε επόμενα παραδείγματα θα εμβαθύνουμε περισσότερο. Ας ξεκινήσουμε με την
πρώτη γραμμή των σεναρίων, η οποία είναι ίδια για όλα:
#!/homebin/homebash

Αυτή η γραμμή δηλώνει το διερμηνευτή (command line).interpreter) που θα αναλάβει την εκτέλεση του σεναρίου.
Το κέλυφος BASH δεν είναι ο μοναδικός υποψήφιος interpreter. Για παράδειγμα, ένα σενάριο
κελύφους θα μπορούσε να γραφεί σε Perl ή σε Python. Σε αυτές τις περιπτώσεις η πρώτη γραμμή θα
ήταν κάπως έτσι…
#!/homebin/homeperl

…ή κάπως έτσι:
#!/homebin/homepython

Ας προχωρήσουμε τώρα λίγο παρακάτω, στο σενάριο delete.sh.


if [ -f "$filename" ]; then
echo "The file exists. That's good!"
else
echo "The file doesn't exist or isn't regular!"
exit
fi

Όπως αναφέραμε προηγουμένως, η γλώσσα του BASH διαθέτει όλες τις παραδοσιακές δομές
ελέγχου που προσφέρουν οι γλώσσες προγραμματισμού. Στο συγκεκριμένο απόκομμα βλέπουμε ένα
παράδειγμα χρήσης της δομής ελέγχου if...then...else. Πρόκειται για την απλούστερη
δομή ελέγχου και διακλάδωσης. Σε αυτό το κομμάτι, το script ελέγχει για την ύπαρξη του αρχείου
που δώσαμε ως παράμετρο. Αν αποτύχει να εντοπίσει τον αρχείο, ενημερώνει το χρήστη και
τερματίζει τη λειτουργία του. Διαφορετικά ενημερώνει και πάλι το χρήστη, αλλά συνεχίζει κανονικά
την εκτέλεσή του αφού προηγουμένως τερματίσει τη δομή if...then...else. Ο τερματισμός
αυτής της δομής σηματοδοτείται με το fi. Ας δούμε τώρα κι ένα απόσπασμα από το σενάριο
unpack.sh:
case $filetype in
"bzip2compressed" )
echo "The file is compressed with bzip2. Decompressing..."
bzip2 -d $filename
;;

...

* )
echo "The file is compressed (or packed) with an unknown tool"
echo "or it is not compressed at all..."
echo -n "Filetype: "`file $filename | awk '{ print $2 }'`
echo " "`file $filename | awk '{ print $3 }'`
;;
esac

Η ομοιότητα με άλλες γλώσσες προγραμματισμού επεκτείνεται σε όλες τις παραδοσιακές δομές.


Στο προηγούμενο απόσπασμα βλέπουμε ένα παράδειγμα της δομής πολλαπλού ελέγχου και
διακλάδωσης, ονόματι case. Στη γλώσσα C η αντίστοιχη δομή ονομάζεται switch, ενώ στην
BASIC αποκαλείται select case. Σε αυτή την περιοχή, το σκριπτάκι μας ελέγχει τον τύπο του
αρχείου και προχωρά στην αποσυμπίεση με το κατάλληλο εργαλείο. Αν το αρχείο είναι συμπιεσμένο
με άγνωστη μέθοδο, το script εμφανίζει τον τύπο του αρχείου κι ενημερώνει το χρήστη για την
αποτυχία του. Εδώ αξίζει να σταθούμε για λίγο και να εξετάσουμε μια ενδιαφέρουσα λεπτομέρεια.
Παρακάτω φαίνεται η γραμμή που τυπώνει τον τύπο του επιλεγμένου αρχείου:
filetype=`file $filename | awk '{ print $2$3}'`
Βλέπουμε μια ιδιαίτερα ενδιαφέρουσα δυνατότητα του BASH. Ο λόγος γίνεται για το λεγόμενο
command substitution. Παρατηρείστε λίγο τον κώδικα. Το BASH θα εκτελέσει όλα όσα υπάρχουν
ανάμεσα στους χαρακτήρες του απλού εισαγωγικού (command line).back-tick). Στη συνέχεια, το αποτέλεσμα από
αυτήν την εκτέλεση θα αποδοθεί ως τιμή στη μεταβλητή filetype. Ας δούμε τώρα τι γίνεται
ανάμεσα στα back-ticks. Αρχικά εκτελείται το πρόγραμμα file, με παράμετρο το αρχείο που
δώσαμε κατά την εκτέλεση του script. Το όνομα αυτού του αρχείου έχει αποδοθεί στη μεταβλητή
filename. Το αποτέλεσμα αυτής της εκτέλεσης θα είναι η εμφάνιση μιας ολόκληρης πρότασης, η
οποία θα περιγράφει τον τύπο του συγκεκριμένου αρχείου. Αυτή η πρόταση, με τη βοήθεια της
διασωλήνωσης, θα σταλεί ως είσοδος στο πρόγραμμα awk. Με τη βοήθεια του τελευταίου,
απομονώνονται και τυπώνονται η δεύτερη και η τρίτη λέξη. Οι συγκεκριμένες λέξεις γνωρίζουμε ότι
αποτελούν τον τύπο του αρχείου και ακριβώς αυτές θα αποδοθούν τελικά στη μεταβλητή
filetype.

Αυτόματη δημιουργία αναφοράς (πλήρες script)


Είτε έχουμε πέντε cloud servers που εξυπηρετούν πενήντα χιλιάδες πελάτες ο καθένας είτε έναν
μικρό server στο σπίτι με μοναδικό πελάτη το PC του διπλανού δωματίου, είναι σίγουρο ότι θα
θέλαμε πάντα να γνωρίζουμε την κατάσταση του εκάστοτε συστήματος. Για παράδειγμα, θα είχε
ενδιαφέρον αν μπορούσαμε να βλέπουμε εύκολα τα στατιστικά από τη χρήση των αποθηκευτικών
μέσων, το σύνολο του τάδε είδους συνδέσεων που δέχτηκε το μηχάνημα, τη θερμοκρασία των
δίσκων και πάει λέγοντας. Στην πράξη, για να βρούμε αυτά τα στοιχεία πρέπει πρώτα να ψάξουμε σε
ένα σωρό τοποθεσίες και, φυσικά, να έχουμε συνδεθεί στο μηχάνημα που εξετάζουμε. Δεν θα ήταν
καλύτερα αν όλα τα στοιχεία συγκεντρώνονταν αυτόματα; Ε, λοιπόν, ένα μικρό script για το BASH
θα μπορούσε πανεύκολα να πετύχει αυτό το στόχο. Στη συνέχεια θα μελετήσουμε μια απλοϊκή
εκδοχή ενός τέτοιου script. Το σενάριό μας προβάλει τα διάφορα στοιχεία σε μια σελίδα HTML. Ας
δούμε το εν λόγω script τμήμα προς τμήμα.
Σελίδα αναφοράς. Για τη δημιουργία της σελίδας HTML, το script πρέπει να τυπώνει όσες
πληροφορίες συλλέγει ανάμεσα στα κατάλληλα HTML tags. Φυσικά, τα tags και οι πληροφορίες θα
μπορούσαν να τυπώνονται με τη χρήση του προγράμματος echo. Ωστόσο, όταν θέλουμε να
τυπώσουμε αρκετές γραμμές κειμένου χωρίς να ανησυχούμε για τους ειδικούς χαρακτήρες που
ενδέχεται να περιέχουν, είναι καλύτερα να χρησιμοποιούμε το cat. Στις πρώτες γραμμές του script,
φαίνεται ένα εξυπηρετικό κολπάκι:
#!/homebin/homebash

cat << REPORTSTART


<html>
<head><title>System Report</hometitle></homehead>
<body bgcolor="#c0c0c0" text="#000000">
<p><hr size=4></homehr></homep>
<h1>System Report</homeh1>
<p><hr size=4></homehr></homep>
REPORTSTART

Με τη σύνταξη που φαίνεται στη δεύτερη γραμμή, το πρόγραμμα cat θα τυπώσει όλα όσα
ακολουθούν στο σενάριό μας, μέχρι τη γραμμή που περιέχει τη λέξη REPORTSTART. Η εν λόγω
λέξη δεν αποτελεί κάποια ειδική παράμετρο και στη θέση της θα μπορούσαμε να χρησιμοποιήσουμε
οποιαδήποτε άλλη. Έτσι, με τις πρώτες γραμμές κώδικα το script ορίζει το όνομα της σελίδας και
τυπώνει τον τίτλο της.
Βασικά στοιχεία. Σε ποιο μηχάνημα εκτελείται το script και ποιος πυρήνας χρησιμοποιείται; Οι
επόμενες γραμμές φροντίζουν για την εκτύπωση αυτών των δύο στοιχείων.
echo "<p><b>System name: </homeb>"
hostname
echo "</homep>"

echo "<p><b>Kernel version: </homeb>"


uname --kernel-release
echo "</homep>"

Προφανώς, το πρόγραμμα hostname τυπώνει το όνομα του μηχανήματος, ενώ το uname (command line).με τις
συγκεκριμένες παραμέτρους) εμφανίζει την έκδοση του πυρήνα που χρησιμοποιείται στο σύστημα.
Σε παρόμοιες ενότητες θα μπορούσαμε να αξιοποιήσουμε πολλά ακόμα προγράμματα του
κελύφους. Για παράδειγμα, θα μπορούσαμε να χρησιμοποιήσουμε το uptime, ώστε να εμφανίζεται
κι ο συνολικός χρόνος λειτουργίας του συστήματος μετά την τελευταία εκκίνηση.
Επεξεργαστής και μνήμη. Τώρα που είδατε το όνομα του μηχανήματος και την έκδοση του πυρήνα,
μπορούμε να περάσουμε σε πληροφορίες που αφορούν στο υλικό του υπολογιστή. Συγκεκριμένα,
το script θα τυπώσει το μοντέλο του επεξεργαστή, το μέγεθος της μνήμης R]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, τοAM, καθώς και την
έκταση του χώρου SWAP.
cat << HARDWAREINFO
<p><hr></homehr></homep>
<p><b>Hardware information: </homeb></homep>
<dl><dd><small><pre>
HARDWAREINFO

echo -e "CPU model: \t \c"


grep 'model name' -m 1 /homeproc/homecpuinfo | awk '{print $5" "$6" "$7" "$8}'

echo -e "Main memory: \t \c"


grep 'MemTotal' /homeproc/homememinfo | awk '{print $2" "$3}'

echo -e "SWAP memory: \t \c"


grep 'SwapTotal' /homeproc/homememinfo | awk '{print $2" "$3}'

echo "</homepre></homesmall></homedd></homedl>"

Όπως και στο πρώτο τμήμα που εξετάσαμε, για την εκτύπωση αρκετών διαδοχικών γραμμών
HTML χρησιμοποιείται το κολπάκι με το πρόγραμμα cat. Κατ’ αυτόν τον τρόπο, τυπώνεται μία
επικεφαλίδα για την ενότητα (command line).hardware information) ενώ ταυτόχρονα ξεκινά μια περιοχή
(command line).<dl><dd><small>...) στην οποία θα εμφανίζονται τα πάντα με μικρότερο μέγεθος και
μετατοπισμένα κατά μία στήλη (command line).ένα TAB) δεξιά. Αμέσως μετά, με τη βοήθεια του grep το
σκριπτάκι φιλτράρει τις ζητούμενες πληροφορίες από τα αρχεία /homeproc/homecpuinfo και
/homeproc/homememinfo. Σε αυτό το τμήμα, πέρα από τα δύο αρχεία του συστήματος ενδιαφέρον έχει και
η χρήση του echo. Με την παράμετρο -e ενεργοποιούνται οι ειδικές αλληλουχίες χαρακτήρων
(command line).sequences) όπως είναι η \t και η \c. Η πρώτη επιβάλει την εκτύπωση ενός χαρακτήρα TAB και η
δεύτερη αποτρέπει την εκτύπωση του χαρακτήρα ENTER]. Αν αντί του [ENTER] πατήσουμε πάλι το πάνω βελάκι, το. Έτσι, οι πληροφορίες που συλλέγει το
grep σε κάθε περίπτωση προβάλλονται δίπλα από τα μηνύματα που εμφανίζονται με το echo κι
όχι στην από κάτω γραμμή.

Περισσότερα στοιχεία
Στα τμήματα κώδικα που ακολουθούν χρησιμοποιούνται τα τεχνάσματα που συναντήσαμε και
προηγουμένως. Για αυτό το λόγο, θα περιοριστούμε σε μία σύντομη περιγραφή των πληροφοριών
που συλλέγονται.
cat << DFINFO
<p><hr></homehr></homep>
<p><b>Mounted volumes: </homeb></homep>
<dl><dd><small><pre>
DFINFO

df -hT
echo "</homepre></homesmall></homedd></homedl>"

Σε αυτή την περιοχή χρησιμοποιείται το εργαλείο df, για την προβολή όλων των προσαρτημένων
κατατμήσεων. Η παράμετρος T επιβάλλει την προβολή του είδους κάθε filesystem, ενώ η
παράμετρος h καθορίζει σαν μονάδες μέτρησης τα TiB, GiB, MiB και KiB (command line).η αναφορά μας θέλουμε
να είναι ευανάγνωστη).
cat << SYSCRON1
<p><hr></homehr></homep>
<p><b>Scheduled tasks: </homeb><tt>(system wide)</homett></homep>
<dl><dd> <small><pre>
SYSCRON1

cat /homeetc/homecrontab
echo "</homepre></homesmall></homedd></homedl>"

Με τις παραπάνω γραμμές εμφανίζονται οι προγραμματισμένες εργασίες που εκτελεί ο cron


deamon, για λογαριασμό ολόκληρου του συστήματος. Αυτό επιτυγχάνεται με την εκτύπωση των
περιεχομένων του αρχείου /homeetc/homecrontab.
cat << SSHSTATS
<p><hr></homehr></homep>
<p><b>SSH statistics: </homeb></homep>
<dl><dd><small><pre>
SSHSTATS

yesterday="`date -d yesterday +%d`"


thismonth="`date -d yesterday +%b`"

cat /homevar/homelog/homemessages | grep sshd | grep "$thismonth $yesterday" >> /hometmp/home.my_tmp


tmp1="`cat /hometmp/home.my_tmp | grep Accepted | wc -l`"
tmp2="`cat /hometmp/home.my_tmp | grep "Invalid user" | wc -l`"
tmp3="`cat /hometmp/home.my_tmp | grep "authentication failure" | wc -l`"

echo -e "Valid connections: \t $tmp1"


echo -e "invalid username: \t $tmp2"
echo -e "invalid password: \t $tmp3"

echo "</homepre></homesmall></homedd></homedl>"

Σε αυτή την περιοχή το σκριπτάκι αποκτά ιδιαίτερο ενδιαφέρον. Μετά την εκτύπωση των
απαραίτητων γραμμών HTML, ορίζονται δύο μεταβλητές. Στη μία αποθηκεύεται η χθεσινή
ημερομηνία και στην άλλη το όνομα του μήνα. Οι τιμές των δύο μεταβλητών χρησιμοποιούνται ως
φίλτρο για το grep. Έτσι, καταφέρνουμε να απομονώσουμε όλα τα μηνύματα από το γενικό αρχείο
καταγραφής του συστήματος, που τυπώθηκαν την προηγούμενη μέρα. Τα εν λόγω μηνύματα
αποθηκεύονται προσωρινά στο αρχείο /hometmp/home.my_tmp. Στη συνέχεια, με τη βοήθεια του grep
και του εργαλείου wc, μετράμε πόσες φορές εμφανίζονται ορισμένα μηνύματα του SSH daemon.
Έτσι, το script υπολογίζει και προβάλλει το πλήθος των πετυχημένων συνδέσεων στο σύστημα,
καθώς και το πλήθος των αποτυχημένων.

Τερματισμός
Για να ολοκληρωθεί η σελίδα HTML χωρίς σφάλματα, πρέπει να τερματιστούν (command line).να κλείσουν) τα
tags που ανοίξαμε στην αρχή του script. Ακριβώς αυτό πετυχαίνουν οι ακόλουθες γραμμές:
cat << REPORTEND
<p><hr size=5></homehr></homep>
</homebody>
</homehtml>
REPORTEND

Το σενάριο που εξετάσαμε συλλέγει μερικές (command line).βασικές) πληροφορίες για το σύστημα και τις
χρησιμοποιεί για να δημιουργήσει τον κώδικα μιας σελίδας HTML. Αναρωτιέστε πώς θα πάρουμε
αυτόν τον κώδικα σε ένα αρχείο; Αν υποθέσουμε ότι το σενάριο ονομάζεται make_report.sh
καθώς και ότι βρισκόμαστε στον κατάλογο όπου είναι αποθηκευμένο, αρκεί να δώσουμε κάτι σαν
αυτό:
./homemake_report > ~/homereport_file.html

Πλέον, δεν έχουμε παρά να ανοίξουμε το αρχείο report_file.html με κάποιον web browser
και να θαυμάσουμε τη σελίδα που δημιούργησε το σενάριό μας.

Πρόσθετες δυνατότητες
Το σκριπτάκι που είδαμε είναι αρκετά απλό και συλλέγει εξίσου απλές πληροφορίες. Ωστόσο, με
λίγη φαντασία και την αντίστοιχη όρεξη για ψάξιμο, μπορούμε να το επεκτείνουμε απεριόριστα. Για
παράδειγμα, θα μπορούσαμε να προσθέσουμε μία ενότητα που να προβάλλει τη μέση θερμοκρασία
των δίσκων. Αναρωτιέστε πως μπορεί να γίνει κάτι τέτοιο; Τα κομμάτια HTML που θα χρειαστούν
είναι παρόμοια με αυτά που είδαμε παραπάνω. Ας δούμε λοιπόν τον υπόλοιπο μηχανισμό, ο οποίος
θα υπολογίζει τη μέση θερμοκρασία ενός δίσκου.
Αρχικά, θα πρέπει να εγκαταστήσουμε το εργαλείο hddtemp. Η εγκατάσταση ενός πακέτου
πραγματοποιείται με διαφορετικό τρόπο από διανομή σε διανομή, αλλά είμαστε βέβαιοι ότι θα
μάθετε εύκολα τι πρέπει να κάνετε με την δική σας. Στη συνέχεια οφείλουμε να προσθέσουμε ένα
νέο cronjob, το οποίο θα εκτελείται με αυξημένα δικαιώματα. Η εργασία που θα προσθέσουμε θα
εκτελείται ανά μία ώρα και θα αποθηκεύει σε ένα προσωρινό αρχείο την τρέχουσα θερμοκρασία
κάποιου δίσκου. Όπως καταλαβαίνετε, η λειτουργία του hddtemp απαιτεί δικαιώματα root κι
ακριβώς γι’ αυτό το αντίστοιχο cronjob πρέπει να ανήκει στο συγκεκριμένο χρήστη. Για να
δημιουργήσουμε ένα cronjob για τον root στο Ubuntu ή στο openSUSE, αρκεί να δώσουμε κάτι
τέτοιο:
sudo crontab -e
Εναλλακτικά, μπορούμε να αποσυνδεθούμε από το δικό μας λογαριασμό, να συνδεθούμε σε εκείνον
του root (command line).με sudo su, στο Ubuntu ή στο openSUSE) και να πληκτρολογήσουμε:
`crontab -e`

Τώρα, αν υποθέσουμε ότι θέλουμε να παρακολουθούμε τη θερμοκρασία του δίσκου /homedev/homesda,


αρκεί να δημιουργήσουμε το ακόλουθο cronjob:
0 */home1 * * * /homeusr/homesbin/homehddtemp -n /homedev/homesda >> /hometmp/home.my_disk

Έτσι, το σύστημα θα καταγράφει αυτόματα (command line).ανά μία ώρα) τη θερμοκρασία του δίσκου sda στο
αρχείο /hometmp/home.my_disk. Τώρα πρέπει να βρούμε έναν τρόπο για τον υπολογισμό της μέσης
θερμοκρασίας. Το script που φαίνεται παρακάτω πετυχαίνει ακριβώς αυτό: Προσθέτει όλες τις τιμές
της θερμοκρασίας που βρίσκει στο αρχείο /hometmp/home.my_disk και στη συνέχεια διαιρεί το άθροισμα
με το πλήθος των τιμών. Στο τέλος τυπώνεται το μέγεθος που προκύπτει (command line).ο μέσος όρος) και το
αρχείο με τις παλιές μετρήσεις θερμοκρασίας διαγράφεται:
#!/homebin/homebash
for i in `cat /hometmp/home.my_disk`; do
tbd=$(($tbd + $i))
tmp=$(($tmp + 1))
done

tbd=$(($tbd /home $tmp))


echo $tbd

rm /hometmp/home.my_disk
exit

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

Επίλογος (λέμε τώρα)


Κάπου εδώ αναγκαζόμαστε και σταματάμε –έστω και προσωρινά– την περιήγησή μας στον κόσμο
της γραμμής εντολών και του BASH. Θέλουμε να πιστεύουμε ότι μέσα από αυτή τη μίνι σειρά
άρθρων φάνηκε καλύτερα ο αληθινός χαρακτήρας του Linux (command line).καθώς και άλλων UNIX-like
συστημάτων). Ελπίζουμε πως όλα όσα συζητήσαμε θα σας κάνουν να εκτιμήσετε περισσότερο τις
δυνατότητές του. Στοιχηματίζουμε ότι αρκετοί από εσάς θα το ψάξετε περισσότερο και θα φτάσετε
πολύ πιο μακριά. Εδώ που τα λέμε, είμαστε βέβαιοι οπότε δεν χρειάζεται καν να στοιχηματίσουμε.
Άρθρα της σειράς

Μέρος 1⁄4: Αρχική προσέγγιση

Μέρος 2⁄4: Πρώτη επίθεση

Μέρος 3⁄4: Πλήρης έλεγχος

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


~Spir@l Evolut10n

LinuxshellBASH
© 2019 Parabing Creations

You might also like