Προς το περιεχόμενο

Unix Basics


nske

Προτεινόμενες αναρτήσεις

* Αυτό το άρθρο έχει μετακινηθεί στο Insomnia WiKi. Θα προσπαθήσω να το κρατώ ενημερωμένο, όμως καλύτερα διαβάστε το από εδώ *

 

Σε αυτό το topic θα γίνει σύντομη εισαγωγή σε έννοιες και συστήματα απαραίτητα για την εργασία με λειτουργικά βασισμένα στο UNIX (*BSD, GNU/Linux, SunOS, κ.α.). Στο νου μου έχω τις παρακάτω ενότητες που ελπίζω να καλυφθούν στο μέλλον:

 

Documentation

Το documentation είναι εξίσου σημαντικό με το software. Περιγράφει τι μπορεί να κάνει κάθε μια από τις εκατοντάδες εφαρμογές που συνοδεύουν το λειτουργικό μας και με ποιο τρόπο. Αυτή η ενότητα υποδεικνύει τις διαθέσιμες πηγές documentation.

  • INIT scripts και Processes: Boot scripts και διεργασίες

Πώς φορτώνουν οι εφαρμογές με την εκκίνηση, τι δυνατότητες μας δίνουν τα runlevels και τι είναι μια διεργασία

Λογαριασμοί και δικαιώματα

Το σύστημα δικαιωμάτων και η σημασία του

Κονσόλα / Shell

Η δύναμη του Shell

  • Βασικές εφαρμογές κονσόλας

Οι εφαρμογές κονσόλας, πέρα από τις λειτουργίες που εκπληρώνουν μόνες τους είναι το "λεξιλόγιο" και η κινητήριος δύναμη του Shell.

  • Package Manager

Η λογική ενός συστήματος πακέτων για τη διαχείριση εγκατεστημένων εφαρμογών, οι πιο γνωστοί διαχειριστές πακέτων

  • Compiling applications from source

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

  • Kernel

Κάποια βασικά πράγματα για τον Linux kernel, τα modules του και τους drivers

Συσκευές

Ο ρόλος των συσκευών και το DEV filesystem

  • Filesystems

Η έννοια ενός συστήματος αρχείων, τα δημοφιλέστερα συστήματα αρχείων

  • Logging

Η σημασία της δημιουργίας, καταγραφής και ταξινόμησης των μηνυμάτων, η λογική και οι δυνατότητες του Syslog για τη διαχείριση μηνυμάτων

  • Συστημική προσέγγιση

Εφαρμόζοντας στη σκέψη μας ορισμένα στοιχεία της Συστημικής Θεωρίας μπορεί να μας βοηθήσει ιδιαίτερα στην κατανόηση και χρήση λειτουργικών UNIX

Σκοπός του θέματος είναι να προτρέψει την ενασχόληση με τις βασικές έννοιες και εργαλεία που υπάρχουν "κάτω από το καπό", πέρα από τα ιδιότροπα και αναξιώπιστα interfaces που ενθαρρύνουν πολλές "εύκολες" διανομές. Σκεπτόμενοι πέρα από τα στενά πλαίσια μιας διανομής, ενός γραφικού περιβάλλοντος, μιας εφαρμογής ή μιας τεχνολογίας μπορούμε να αξιοποιήσουμε τις πραγματικές δυνατότητες του λειτουργικού μας και να το δούμε σαν κάτι παραπάνω από έναν υποανάπτυκτο και προβληματικό κλώνο των windows. Α, ναι, και φυσικά να αυξήσουμε την παραγωγικότητά μας πετυχαίνοντας εντυπωσιακότερα αποτελέσματα στο μισό χρόνο και αποφεύγοντας το κρυφτό με προβλήματα-φαντάσματα. :)

 

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

 

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

 

Επισημάνσεις

 

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

- Ό,τι είναι σε bold είτε αξίζει επισήμανσης είτε είναι όρος αρκετά γνωστός για τον οποίο μπορείτε να βρείτε πολλές σχετικές πληροφορίες ψάχνοντας στο web.

- Όταν κάτι είναι σε italics σημαίνει ότι αναφέρεται σε κάτι συγκεκριμένο η χρήση του οποίου είναι documented από τον δημιουργό. Συνήθως εντολές, αρχεία ρυθμίσεων ή μεταβλητές περιβάλλοντος.

- Σε παραθέσεις εντολών, ένα $ στην αρχή της γραμμής σημαίνει ότι η εφαρμογή δε χρειάζεται ιδιαίτερα δικαιώματα, ενώ ένα # σημαίνει ότι θα πρέπει να εκτελεσθεί με δικαιώματα root.

 

Καλή αρχή

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Το UNIX έχει ένα οργανωμένο σύστημα documentation, το man. Το man, σαν μια ατζέντα, χωρίζει τα αντικείμενα που καλύπτει σε 8 αριθμημένες κατηγορίες (sections):

 

(1) Βασικές εντολές

(2) Κλήσεις συστήματος του εκάστοτε λειτουργικού

(3) Συναρτήσεις της εκάστοτε βιβλιοθήκης C

(4) Οδηγοί συσκευών

(5) Τεκμηρίωση αρχείων ρυθμίσεων

(6) Παιχνίδια

(7) Διάφορα

(8) Εξειδικευμένες εντολές

 

Παράλληλα υπάρχουν ορισμένες όχι και τόσο standard κατηγορίες, όπως αυτές που εισάγει ο X11 οι οποίες έχουν το ίδιο όνομα με τις παραπάνω με ένα "x" δίπλα (π.χ. "4x"), και αφορούν αποκλειστικά αντικείμενα του X11.

 

Οι κατηγορίες που μας ενδιαφέρουν είναι οι 1, 5 και 8.

 

Κάθε εφαρμογή μπορεί να προσθέσει “man pages" σε οποιαδήποτε κατηγορία με την εγκατάστασή της, αυτές θα είναι προσβάσιμες με την ομώνυμη εντολή man(1):

$ man $x όνομα

ή

$ man “όνομα($x)”

 

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

$ man όνομα

όπου όνομα το όνομα της συγκεκριμένης εντολής ή αρχείου ρυθμίσεων που εξετάζουμε. Όποτε συναντάμε αναφορές του στυλ κάτι($x), αυτό σημαίνει ότι μπορούμε να ανατρέξουμε στην man page του κάτι, στην κατηγορία $x, για λεπτομέρειες.

 

Ανοίγοντας μια man page, το περιεχόμενό της περνάει αυτόματα στον default $PAGER που χρησιμοποιεί το σύστημά μας (συνήθως την less(1)). Ο pager είναι μια εφαρμογή που δίνει τη δυνατότητα εμφάνισης ενός κειμένου ανά οθόνη και ενδεχομένως κάποια άλλα ωραία χαρακτηριστικά, όπως την αναζήτηση για λέξεις κλειδιά.

 

Οι man pages συνήθως βρίσκονται αποθηκευμένες στο /usr/share/man, όμως η εντολή man θα αναζητήσει αυτόματα man pages σε όσες διαδρομές έχουν οριστεί στο /etc/man.conf.

 

Σημειώνεται ότι το επίσημο σύστημα τεκμηρίωσης του GNU/LINUX είναι το texinfo(5). Όλες σχεδόν οι εφαρμογές δίνουν το documentation τους σε man pages, απλά ας έχουμε υπόψη και τις texinfo pages, οι οποίες είναι προσβάσιμες με την εντολή info(1). Σε ό,τι αφορά τα βασικά η χρήση είναι ίδια με την man, απλά σε info pages θα παρατηρήσουμε επιπλέον δυνατότητες πλοήγησης.

 

Εκτός από τις man/info pages υπάρχουν και ορισμένοι άλλοι τρόποι (offline) πληροφόρησης:

 

  • Η standard έξοδος των εφαρμογών. Αν εκτελέσουμε μια εντολή χωρίς παραμέτρους ή με παράμετρο -h, συνήθως θα μας επιστρέψει συνοπτικά τη σύνταξή της και τις υποστηριζόμενες λειτουργίες.
     
  • Στην περίπτωση των configuration files, τα σχόλια. Συνήθως κάθε εφαρμογή που χρησιμοποιεί αρχεία ρυθμίσεων συνοδεύεται από ένα υποδειγματικό configuration file με σχόλια (τα οποία συνήθως ξεκινάνε με τον χαρακτήρα #) ώστε να δούμε τη σύνταξη, τη λογική και τις βασικές παραμέτρους.
     
  • Τυχόν πρόσθετο documentation που συνοδεύει τις εφαρμογές συνήθως πάει στο /usr/share/doc/εφαρμογή.

Σημειώνεται ότι οι manpages πολλές φορές δεν αρκούν για να καταλάβουμε την λειτουργία της εφαρμογής που καλύπτουν, επειδή το περιεχόμενό τους είναι πολύ συγκεκριμένο. Δεν πρέπει να μας απογοητεύει αυτό, συνήθως ένα μικρό κομμάτι πληροφορίας είναι αυτό που μας λείπει για να βρούμε το νόημα. Αν συναντάμε άγνωστους όρους που στέκονται στη μέση θα πρέπει να τους κοιτάξουμε 1-1, ενώ αν δεν καταλαβαίνουμε τη λογική λειτουργίας της εφαρμογής θα πρέπει να ανατρέξουμε σε κάποια επιπλέον κείμενα (tutorials, howto). Η κοινότητα των χρηστών εφαρμογών ελεύθερου λογισμικού στο διαδίκτυο είναι πολύ δραστήρια, σχεδόν πάντα θα υπάρχει κάποιο κείμενο ή δημοσίευση που να εξηγεί αυτά που μας διαφεύγουν, αρκεί να ξέρουμε να χρησιμοποιούμε αποτελεσματικά κάποια καλή μηχανή αναζήτησης σαν το Google.

 

Πηγές documentation στο Internet:

  1. TLDP: The Linux Documentation Project. Από της μεγαλύτερες προσπάθειες συγκέντρωσης οδηγών/HOWTOs για οτιδήποτε σχετικό με το GNU/Linux.
  2. Slackbook: Ένα βιβλίο εισαγωγής στο Linux, με διανομή αναφοράς το Slackware αλλά με γενική χρησιμότητα ανεξαρτήτως διανομής.
  3. LNAG: Παρομοίως, βιβλίο εισαγωγής στο Linux με διανομή αναφοράς το Redhat αλλά με γενική χρησιμότητα ανεξαρτήτως διανομής.
  4. Οδηγός Debian: Επίσης, βιβλίο εισαγωγής στο Linux στα ελληνικά, με διανομή αναφοράς το Debian αλλά με γενική χρησιμότητα. Από το ΕΛΛΑΚ.
  5. Greek Howto: Ελληνική προσπάθεια για τη μετάφραση οδηγών/HOWTO από το HELLUG.
  6. OpenBSD FAQ: Το εγχειρίδιο του OpenBSD.
  7. FreeBSD Handbook: Το εγχειρίδιο του FreeBSD.
  8. Gentoo Wiki-HOWTOs: Από τις πιο πλούσιες distribution-specific συλλογές HOWTO. Γραμμένα για το Gentoo αλλά σε πάρα πολλές περιπτώσεις χρήσιμα ανεξαρτήτως λειτουργικού.
  9. Ubuntu Wiki: Παρομοίως, πλούσια συλλογή HOWTO γραμμένα για Ubuntu, πολλά από τα οποία έχουν βοηθητική αξία ανεξαρτήτως λειτουργικού.
     
    * Αν έχετε υπόψη κι άλλες πηγές τέτοιου είδους, στείλτε τις με PM για να προστεθούν

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

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

 

 

Χρήστες

 

Κάθε σύστημα έχει ορισμένους λογαριασμούς χρηστών, οι οποίοι αποθηκεύονται στο αρχείο /etc/passwd. Ας δούμε για παράδειγμα ποιους λογαριασμούς έχει το δικό μας σύστημα:

 

>$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/bin/false
[...]
nske:x:1000:1000::/home/nske:/bin/bash

 

Βλέπουμε έναν πίνακα του οποίου τα πεδία χωρίζονται με τον χαρακτήρα “:”.

  • Το πρώτο πεδίο δηλώνει το username του χρήστη.

  • Το δεύτερο πεδίο δεν χρησιμοποιείται πια (παλιά περιείχε τον κωδικό του χρήστη κρυπτογραφημένο).

  • Το τρίτο πεδίο περιέχει το user id του χρήστη. Το user id είναι ένας ακέραιος αριθμός που εξασφαλίζει ότι κάθε χρήστης θα είναι μοναδικός, το λειτουργικό εσωτερικά αναφέρεται σε κάθε χρήστη χρησιμοποιώντας το user id του.

  • Το τέταρτο πεδίο περιέχει το group id του default group του χρήστη. Ένας χρήστης μπορεί να είναι μέλος σε πολλά groups, όμως τα αρχεία που δημιουργεί θα έχουν ως ομάδα-ιδιοκτήτη το default group του (το οποίο ωστόσο μπορεί να αλλάξει προσωρινά μέσω της εντολής newgrp(1).

  • Στο πέμπτο πεδίο μπορεί να μπει οποιαδήποτε επιπλέον πληροφορία για τον χρήστη θέλουμε να σημειώσουμε σαν σχόλιο, συνήθως το πλήρες όνομά του, η ιδιότητά του (ή τίποτα).

  • Στο έκτο πεδίο δηλώνεται η διαδρομή ενός καταλόγου ο οποίος θα αποτελεί το $HOME του χρήστη. Μέσα στο home αποθηκεύονται τα αρχεία του χρήστη και οι ρυθμίσεις των εφαρμογών του. Ο χρήστης θα πρέπει να μπορεί να γράψει μέσα στο $HOME του. Συνήθως το $ΗΟΜΕ βρίσκεται στο “/home/username”.

  • Το έβδομο και τελευταίο πεδίο περιέχει τη διαδρομή προς ένα $SHELL το οποίο θα εκτελείται αυτόματα όταν ο χρήστης συνδέεται στο μηχάνημα. Το Shell είναι μια γραμμή εντολών με αυξημένες δυνατότητες αυτοματοποίησης.

 

Στο /etc/passwd μας βλέπουμε πολλούς λογαριασμούς χρηστών τους οποίους έχει προσθέσει η διανομή μας. Οι περισσότεροι από αυτούς υπάρχουν μόνο για να λειτουργούν ως ιδιοκτήτες σε συγκεκριμένες εφαρμογές, το οποίο είναι καλό για λόγους ασφαλείας, οι λογαριασμοί αυτοί δεν έχουν δηλωμένο ούτε κάποιο έγκυρο $HOME ούτε κάποιο έγκυρο $SHELL επειδή δεν τα χρειάζονται. Ο χρήστης root είναι ο μόνος χρήστης που μπορεί να διαχειριστεί το σύστημα, προσθέτοντας χρήστες και ομάδες, εγκαθιστώντας εφαρμογές, κλπ.

 

Μπορούμε να προσθέσουμε ή τροποποιήσουμε χρήστες πειράζοντας το /etc/passwd με έναν text editor, όμως υπάρχουν έτοιμα εργαλεία για αυτό το σκοπό:

 

- Προσθέτουμε νέους χρήστες με την εντολή useradd(8). Π.χ. για να προσθέσουμε έναν νέο χρήστη με $HOME στο “/home/user”, $SHELL το “/bin/bash” και default group το “usergroup” θα δίναμε:

 

># useradd -d /home/user -s /bin/bash -g usergroup user

 

- Τροποποιούμε υπάρχοντες χρήστες με την usermod(8). Π.χ. για να τροποποιήσουμε τον χρήστη “user” που μόλις φτιάξαμε, έτσι ώστε να χρησιμοποιεί το /bin/csh ως $SHELL, το username του να μετονομαστεί σε “user2” και το $HOME του να είναι το “/home/user2”, θα δίναμε:

 

># usermod -d /home/user2 -s /bin/csh -l user2 user

 

- Διαγράφουμε υπάρχοντες χρήστες με την userdel(8).

 

  • Παραπομπές:
    man
passwd(5), useradd(8), usermod(8), userdel(8), newgrp(1)

 

Ομάδες (groups)

 

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

 

Τα groups βρίσκονται αποθηκευμένα στο αρχείο /etc/group:

 

>$ cat /etc/group

root::0:root
bin::1:root,bin,daemon
[...]
nske:x:1000:

 

Και πάλι, βλέπουμε έναν πίνακα του οποίου τα πεδία χωρίζονται με τον χαρακτήρα “:”.

 

  • Το πρώτο πεδίο περιέχει το όνομα του group.

  • Το δεύτερο δεν χρησιμοποιείται πια (παλιά περιείχε τον κωδικό του group κρυπτογραφημένο).

  • Το τρίτο έχει το group id του group. Όπως και το user id, είναι ένας ακέραιος αριθμός που εξασφαλίζει ότι κάθε group θα είναι μοναδικό.

  • Το τέταρτο και τελευταίο περιέχει τα usernames όσων χρηστών είναι μέλη σε αυτό το group, χωριζόμενα με κόμμα.

 

Μπορούμε να προσθέσουμε ή τροποποιήσουμε ομάδες πειράζοντας το αρχείο /etc/group με έναν text editor, όμως υπάρχουν έτοιμα εργαλεία για αυτό το σκοπό:

 

- Προσθέτουμε νέες ομάδες με την groupadd(8). Π.χ. για να προσθέσουμε ένα νέο group με όνομα “omada1”, θα δίναμε:

 

># groupadd omada1

 

- Προσθέτουμε ή αφαιρούμε μέλη/διαχειριστές του group με την gpasswd. Για παράδειγμα για να προσθέσουμε ως μέλος αυτού του group τον χρήστη “user1” θα δίναμε:

># gpasswd -a user1 omada1

 

- Διαγράφουμε το group με την groupdel(8)

 

  • Παραπομπές:
    man
group(5), groupadd(8), groupmod(8), groupdel(8), newgrp(1)

 

 

Δικαιώματα αρχείων

 

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

 

Κάθε αρχείο έχει τις εξής πληροφορίες αντιστοιχισμένες με αυτό:

 

  • ένα σετ δικαιωμάτων

  • έναν χρήστη-ιδιοκτήτη

  • mια ομάδα-ιδιοκτήτη

  • ορισμένα άλλα προαιρετικά “attributes”

 

 

Τα δικαιώματα πρόσβασης είναι τρία: Ανάγνωση (r), Εγγραφή (w) και Εκτέλεση (x). Η ανάγνωση δηλώνει τη δυνατότητα προβολής (ή αντιγραφής) του περιεχομένου του αρχείου, η εγγραφή τη δυνατότητα τροποποίησης (ή διαγραφής) του περιεχομένου του αρχείου και η εκτέλεση τη δυνατότητα εκτέλεσης του αρχείου, αν πρόκειται για εκτελέσιμο κάποιας εφαρμογής. Εκτός από τα παραπάνω δικαιώματα πρόσβασης, κάθε αρχείο μπορεί να έχει και 3 άλλα όχι και τόσο βασικά attributes:

 

  • το Set User ID bit ορίζει ότι το process ενός εκτελέσιμου θα τρέχει με τα δικαιώματα του ιδιοκτήτη του αρχείου, ανεξάρτητα ποιος το εκτελεί.

  • το Set Group ID bit ορίζει ότι το process ενός εκτελέσιμου θα έχει τα δικαιώματα της ομάδας-ιδιοκτήτη του αρχείου, ανεξάρτητα ποιο είναι το default group αυτού που το εκτελεί.

  • το Sticky bit σήμερα χρησιμοποιείται αν θέλουμε να αποτρέψουμε τη διαγραφή αρχείων από χρήστες που έχουν δικαίωμα εγγραφής στον μητρικό τους κατάλογο.

 

Ας δούμε στην πράξη πώς φαίνονται αυτά:

 

$ ls -l /etc/passwd

-rw-r--r-- 1 root root 1261 Apr 18 20:32 /etc/passwd

 

Αριστερά βλέπουμε έναν πίνακα με 10 πεδία, κάποια από αυτά έχουν παύλες και κάποια όχι.

 

  • Το πρώτο πεδίο (filetype) μας λέει το είδος του αρχείου: αν είναι κατάλογος (d), απλό αρχείο (-), συντόμευση (l) ή κάποιο είδος συσκευής, τις οποίες θα δούμε παρακάτω.

 

  • Τα επόμενα τρία πεδία (rw-) μας λένε τι δικαιώματα πρόσβασης έχει ο ιδιοκτήτης του αρχείου (u). Το “r” σημαίνει ανάγνωση, το “w” εγγραφή και το τρίτο πεδίο που στο παράδειγμα έχει παύλα δηλώνει την απουσία δυνατότητας εκτέλεσης.

 

  • Τα αμέσως επόμενα τρία πεδία (r--) μας λένε τι δικαιώματα πρόσβασης έχουν οι χρήστες που είναι μέλη του ίδιου group στο οποίο ανήκει το αρχείο (g). Θα έχουν μόνο δυνατότητα ανάγνωσης.

 

  • Τα τελευταία τρία πεδία (r--) μας λένε τι δικαιώματα πρόσβασης θα έχουν όλοι οι υπόλοιποι χρήστες (o). Θα έχουν μόνο δυνατότητα ανάγνωσης και αυτοί.

 

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

 

Αμέσως μετά βλέπουμε το username του χρήστη-ιδιοκτήτη και δίπλα το groupname της ομάδας-ιδιοκτήτη. Στη συνέχεια είναι η ημερομηνία τελευταίας εγγραφής του αρχείου και τέλος το όνομα του αρχείου.

 

Σημειώνεται ότι το set δικαιωμάτων ενός αρχείου, για να μην περιγράφεται με 9 ολόκληρους χαρακτήρες συνηθίζεται να ορίζεται ως εξής:

 

Κάθε είδος πρόσβασης αντιπροσωπεύεται από μια αριθμητική τιμή (1 για εκτέλεση, 2 για εγγραφή, 4 για ανάγνωση). Το άθροισμα των τιμών των δικαιωμάτων που έχει το αρχείο είναι ένας αριθμός που περιγράφει τον συνδυασμό επιπέδων πρόσβασης (για κάθε έναν από τους User, Group, Others) με μοναδικό τρόπο. Οπότε για παράδειγμα τα δικαιώματα του αρχείου στο παραπάνω παράδειγμα θα αντιπροσωπεύονταν αριθμητικά ως 644.

 

Αν θέλουμε να ορίσουμε και κάποιο από τα άλλα τρία attributes (SUID, GUID, STICKY), τοποθετούμε και ένα άλλο ψηφίο στην αρχή, που ομοίως αποτελεί το άθροισμα των τιμών των attributes που επιθυμούμε: 4 για SUID, 2 για GUID, 1 για STICKY.

 

 

Πώς καθορίζεται τι δικαιώματα θα έχει ένα αρχείο όταν πρωτοδημιουργείται;

 

Ορίζεται από την umask(1). Ο root μπορεί να ορίσει τα default δικαιώματα των νέων αρχείων για όλους τους χρήστες μέσω της παραμέτρου UMASK στο αρχείο /etc/login.defs. Οι απλοί χρήστες μπορούν να τροποποιήσουν τη umask τους μέσω της ομώνυμης εντολής η οποία θα πρέπει να εκτελείται σε κάθε νέα σύνδεση.

 

Πως τροποποιούμε τα δικαιώματα, τον χρήστη-ιδιοκτήτη ή την ομάδα-ιδιοκτήτη ενός αρχείου;

 

Μόνο ο ιδιοκτήτης χρήστης μπορεί να αλλάξει τα δικαιώματα ή την ομάδα-ιδιοκτήτη ενός αρχείου. Τα δικαιώματα τροποποιούνται μέσω της εντολής chmod(1) και η ομάδα ιδιοκτήτης μέσω της εντολής chgrp(1). Τον ιδιοκτήτη ενός αρχείου μπορεί να τον αλλάξει μόνο ο root, μέσω της εντολής chown(1).

 

Για παράδειγμα, για να δώσουμε δικαιώματα ανάγνωσης, εκτέλεσης και εγγραφής στον ιδιοκτήτη, ανάγνωσης και εκτέλεσης σε χρήστες της ομάδας-ιδιοκτήτη και καθόλου δικαιώματα στους υπόλοιπους, θα μπορούσαμε να δώσουμε:

 

>$ chmod 750 αρχείο
ή
$ chmod u=rwx,g=r-x,o=--- αρχείο

 

Τέλος, σχετικά με τις διεργασίες (processes), μπορούμε να δούμε τον ιδιοκτήτη τους μέσω της εντολής ps(1).

 

  • Παραπομπές
    - man
chmod(1), chown(1), chgrp(1), umask(1), ps(1)
- Wikipedia's article on Permissions

 

Η σημασία των δικαιωμάτων

 

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

 

Σήμερα που Unix-like λειτουργικά όπως το Linux χρησιμοποιούνται σε προσωπικούς υπολογιστές η παραπάνω δυνατότητα ίσως ακούγεται άχρηστη, όμως ακόμη και σε υπολογιστές που χρησιμοποιούνται μόνο από ένα άτομο μπορεί να ενισχύσει σημαντικά την ασφάλεια. Απλά και μόνο χρησιμοποιώντας έναν λογαριασμό εκτός του root για την καθημερινή χρήση του PC μας είμαστε αρκετά σίγουροι ότι αν κάποιος αποκτήσει πρόσβαση στον λογαριασμό μας (είτε επειδή τρέξαμε κάτι ύποπτο είτε με οποιοδήποτε άλλο τρόπο) δε θα μπορεί να πειράξει το λειτουργικό. Αντίστροφα, αν κάποιος αποκτήσει πρόσβαση από κάποια προβληματική εφαρμογή που τρέχει σε δικό της χρήστη, δε θα έχει πρόσβαση στα αρχεία μας (εφόσον έχουμε προσέξει τα δικαιώματά τους). Ακόμα και αν δε μας ενδιαφέρει η ασφάλεια, τα δικαιώματα και οι λογαριασμοί είναι αναπόσπαστο μέρος του Unix και θα τα βρίσκουμε συνέχεια μπροστά μας.

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Στα περισσότερα λειτουργικά βασισμένα στο UNIX, οι εφαρμογές μας (userspace) επικοινωνούν με το hardware μέσω του /dev filesystem. Οι περισσότεροι οδηγοί συσκευών είναι γραμμένοι έτσι ώστε να μπορούμε να επικοινωνήσουμε από το userspace με οποιαδήποτε από τις συσκευές που εξυπηρετούν, απλά κατασκευάζοντας ένα ειδικό αρχείο μέσα στο /dev που περιέχει πληροφορίες για την αρίθμηση του driver και της συσκευής και το είδος του driver, και "γράφοντας" δεδομένα σε αυτό. Το αρχείο αυτό ονομάζεται driver node και έχει filetype "c" ή "b", ανάλογα το είδος του.

 

  • Το είδος του driver ορίζει με ποια μέθοδο θα προσπελαύνεται η συσκευή, αν είναι Character device ή Block device. Οι character devices μεταφέρουν 1-1 byte τα δεδομένα, χωρίς χρήση buffer. Συσκευές όπως πληκτρολόγια, ποντίκια, εκτυπωτές, κάρτες ήχου, σειριακές θύρες και εικονικά τερματικά που δεν απαιτούν τη μεταφορά μεγάλου όγκου δεδομένων είναι character devices. Οι block devices μεταφέρουν 1-1 block, όπου block μια μονάδα όγκου δεδομένων προκαθορισμένου για κάθε συσκευή μεγέθους, και χρησιμοποιούν buffers για να διασφαλίσουν την μεταφορά τους σε αντίξοες συνθήκες. Σκληροί δίσκοι, κάμερες και οι περισσότερες συσκευές αποθηκευτικών μέσων είναι block devices.

 

  • Η αρίθμηση του driver (Major Device Number) είναι ένας ακέραιος αριθμός ο οποίος παραπέμπει στον driver.

 

  • Η αρίθμηση της συσκευής (Minor Device Number) είναι ένας ακέραιος, αύξων για κάθε συσκευή, αριθμός τον οποίο χρησιμοποιεί ο driver για να διαχωρίσει τις πολλαπλές συσκευές που πιθανόν να εξυπηρετεί.

 

Ο Major number για κάθε συσκευή πρέπει να αναφέρεται στο documentation του kernel. Π.χ. μια λίστα με τα device numbers όλων των drivers που περιέχονται στον Linux kernel διανέμεται στο $kernel-source-dir/Documentation/devices.txt

 

Συνήθως δε θα χρειαστεί να φτιάξουμε driver nodes, στα περισσότερα UNIX-οειδή πλέον φτιάχνονται αυτόματα από το udev ή το devfs, όμως αν χρειαστεί μπορούμε να το κάνουμε με την mknod(1). Να σημειωθεί οτι αν και η λογική είναι κοινή σε όλα τα UNIX-οειδή, η ονομασία και η διαθεσιμότητα των συσκευών είναι από τα πράγματα που διαφέρουν, οπότε θα πρέπει να ανατρέξετε στο documentation του εκάστοτε λειτουργικού για τα τυπικά.

 

Οι συσκευές είναι μέρος τον Kernel. Ορισμένες από αυτές παρέχονται από προαιρετικά components που σημαίνει ότι το ποιες συσκευές υπάρχουν διαθέσιμες στο σύστημά μας εξαρτάται από το compile-time configuration του kernel μας και τα kernel modules που είναι φορτωμένα στη μνήμη.

 

Παραπομπές:

- Wikipedia articles on Userspace, Device Nodes, devfs

- man mknod(1)

 

Συνηθισμένες συσκευές στο Linux

 

  • Σκληροί δίσκοι
     
    Η ονομασία των σκληρών δίσκων έχει ως εξής:
     
>
ΘΕΣΗ----------------------ATA------------------SATA/SCSI
1ος --------------------- hda --------------------- sda
2ος --------------------- hdb --------------------- sdb
3ος --------------------- hdc --------------------- sdc
4ος --------------------- hdd --------------------- sdd


 
Η θέση αντιπροσωπεύει στους μεν ATA/EIDE δίσκους τη θέση τους πάνω στους controllers (primary master, primary slave, secondary master, secondary slave), στους δε SATA και SCSI, την σειρά με την οποία τους έκανε initialize το BIOS. Για παράδειγμα αν θέλαμε να προσπελάσουμε έναν ΑΤΑ/EIDE δίσκο που είναι στη θέση Primary Master, θα το κάναμε μέσω της συσκευής /dev/hda.
 
Ένας δίσκος ως block device θα μπορούσε ενδεχομένως να φιλοξενήσει απευθείας ένα filesystem, όμως για πολλούς λόγους σχεδόν πάντα θα χωρίζεται σε ένα ή περισσότερα partitions. Υπάρχουν δύο ειδών partitions, τα Primary (καμία σχέση με την διάκριση τον ATA/EIDE συσκευών παραπάνω) και τα Logical. Τα Primary είναι συνηθισμένα partitions, όμως για τεχνικούς λόγους μπορούν να είναι μέχρι 4. Για να ξεπεραστεί αυτός ο περιορισμός χωρίς να σπάσει η συμβατότητα, εφευρέθηκαν τα Extended partitions, τα οποία εξωτερικά είναι "Primary" partitions, όμως στο εσωτερικό τους χρησιμεύουν αποκλειστικά ως "κελύφη" εικονικών, "λογικών" partitions τα οποία λέγονται "Logical". Πλέον όλα τα σύγχρονα λειτουργικά είναι συμβατά με logical partitions, όμως είναι σημαντικό να γνωρίζεις το διαχωρισμό επειδή επηρεάζει την αρίθμηση των partitions στο Linux.
 
Τι είναι η αρίθμηση; Για κάθε συσκευή δίσκου στο /dev filesystem, υπάρχουν και μερικές άλλες συσκευές, όσες και τα partitions του, τα οποία ονομάζονται όπως το device του ίδιου του δίσκου, όμως έχουν δίπλα έναν αναγνωριστικό αριθμό.
 
Η αρίθμηση έχει ως εξής:
 

  • Τα 4 primary partitions που μπορεί να υπάρχουν (όσα από αυτά υπάρχουν) έχουν αντίστοιχα αριθμό από 1 μέχρι 4. Όπως είπαμε, ο αριθμός αυτός κολλάει δίπλα στο device name του δίσκου, δηλαδή το πρώτο primary partition του πρώτου σκληρού δίσκου SATA θα αντιστοιχεί στο /dev/sda1, το 3ο στο /dev/sda3 κ.ο.κ.

 

  • Τα Logical partitions τώρα, άσχετα σε ποια θέση βρίσκεται το extended partition που τα περιέχει, ξεκινάνε να μετράνε από το 5. Οπότε το 1ο Logical partition του ίδιου δίσκου θα βρίσκεται στο /dev/sda5.

 

Να σημειωθεί ότι εξωτερικές USB μονάδες αποθήκευσης όπως Flash Drives αναγνωρίζονται στο Linux σαν SCSI συσκευές, οπότε είναι προσβάσιμες με την αντίστοιχη αρίθμηση.

 

Περισσότερα για τα filesystems η φιλοξενία των οποίων είναι η βασική χρήση αυτών των συσκευών στο αντίστοιχο κεφάλαιο.

 

  • Ποντίκια
     
    Πλέον όλα τα ποντίκια ανεξαρτήτως interface σύνδεσης περνάνε την είσοδό τους σε μια κοινή συσκευή, που βρίσκεται στο /dev/input/mice. Αυτό το device θα χρειαστεί να το δηλώσουμε σε οποιαδήποτε εφαρμογή θέλει να κάνει χρήση mouse, όπως ο
Xorg(1x) ή το gpm(8). Εναλλακτικά, αν θέλουμε να παραμετροποιήσουμε πάνω από ένα ποντίκια να κάνουν διαφορετικές δουλειές, μπορούμε να τα προσπελάσουμε και μεμονωμένα μέσω της αντίστοιχης συσκευής τους στο /dev/input/mouse[0-n].
 
Σχετικά Linux Kernel components: CONFIG_INPUT_MOUSEDEV_*, CONFIG_INPUT_MOUSE, CONFIG_MOUSE_*, CONFIG_USB_IDMOUSE, CONFIG_USB_HID, CONFIG_USB_HIDDEV

 

  • Modems
     
    • serial:
      Παραδοσιακά τα καλύτερα υποστηριζόμενα modems, όπως κάθε σειριακή συσκευή είναι άμεσα διαθέσιμα μέσω του device της σειριακής θύρας στην οποία είναι συνδεδεμένα (/dev/ttyS[0-n]). Αυτό το device θα χρειαστεί να το δηλώσουμε σε εφαρμογές που θέλουν να κάνουν χρήση του modem, όπως ο
pppd ο wvdial ή ένας serial terminal client σαν το minicom.
 
Σχετικά Linux Kernel components: CONFIG_SERIAL_8250_*

 

  • usb:
    Υπάρχει ένα πρότυπο για ενοποιημένη υποστήριξη σε USB modems, το CDC/ACM (Communication Device Class / Abstract Control Model). Δυστυχώς δεν είναι όλοι οι κατασκευαστές πρόθυμοι να ακολουθούν ανοιχτά πρότυπα, οπότε πολλά modems δεν μπορούν να υποστηριχτούν από τον αντίστοιχο driver και απαιτούν δικούς τους device drivers ξεχωριστούς ανά περίπτωση. Αν το USB modem μας υποστηρίζει το CDC/ACM, τότε είναι εξίσου εύκολα προσβάσιμο με ένα σειριακό modem, μέσω του /dev/usb/ttyACM0 device.
     
    Σχετικά Linux Kernel components: CONFIG_USB_ACM

 

  • εσωτερικά (isa/pci/pcmci):
    Δεν υπάρχει κάποιο ανοιχτό πρότυπο ενοποιημένης υποστήριξης εσωτερικών modems. Ο,τιδήποτε υπάρχει θα το βρείτε μέσω
αυτoύ του project

 

 

  • Εκτυπωτές
     
    Κάθε εκτυπωτής έχει εσωτερική υποστήριξη για μια Page Description Language (PDL). Οι PDL είναι γλώσσες ικανές να περιγράψουν οτιδήποτε μπορεί να περιέχει μια σελίδα με ακρίβεια DPI (και όχι μόνο). Ως standard PDL στο UNIX θεωρείται η Postscript, η οποία είναι πανίσχυρη και ανοιχτή, όμως η ενσωμάτωσή της στους εκτυπωτές έχει αυξημένο κόστος. Δυστυχώς οι περισσότεροι εκτυπωτές προσσιτού κόστους υποστηρίζουν μόνο κλειστές, proprietary, γλώσσες, με αποτέλεσμα κάθε postscript σελίδα να χρειάζεται μετάφραση πριν σταλεί στον εκτυπωτή. Το Ghostscript είναι μια εφαρμογή Postscript ερμηνευτή που δίνει τη δυνατότητα μετάφρασης σε διάφορες άλλες PDL. Πλέον υποστηρίζει σχεδόν όλες τις γνωστές γλώσσες.
     
    Υπάρχει όμως και μια άλλη απαραίτητη παράμετρος εκτός από την PDL: τα τεχνικά χαρακτηριστικά που διαφέρουν από εκτυπωτή σε εκτυπωτή όπως ανάλυση, μέγεθος χαρτιού, τεχνικές εξοικονόμησης αναλώσιμων και άλλες εξειδικευμένες λειτουργίες οι οποίες μπορούν να οριστούν στον εκτυπωτή με κωδικοποιημένες (πολλές φορές με μη τεκμηριωμένο τρόπο) εντολές. Αυτά περιγράφονται στα λεγόμενα Postscript Printer Description files (.PPD) τα οποία άλλες φορές είναι διαθέσιμα από την κατασκευάστρια εταιρία και άλλες φορές κατασκευάζονται κατά προσέγγιση από την κοινότητα μέσω μεθόδων reverse engineering. Το σύστημα εκτύπωσης του UNIX, εφόσον υποστηρίζει PPD και εφόσον το συγκεκριμένο αρχείο είναι διαθέσιμο, δίνει τη δυνατότητα στον χρήστη να ορίσει κατά βούληση για κάθε εκτύπωση οποιεσδήποτε δυνατότητες υποστηρίζει ο εκτυπωτής του. Το πλέον διαδεδομένο σύστημα εκτύπωσης για UNIX, το
CUPS, υποστηρίζει όλα τα παραπάνω, ενώ το Foomatic project αποτελεί την πιο αξιόλογη προσπάθεια συλλογής PPD files.
 
Το interface σύνδεσης του εκτυπωτή δε θα μας απασχολήσει σχεδόν καθόλου σε σχέση με το παραπάνω εφόσον χρησιμοποιήσουμε το CUPS, όμως σε περίπτωση που θέλουμε να στείλουμε "ωμά" δεδομένα στον εκτυπωτή για κάποιο λόγο μπορούμε να το κάνουμε μέσω του /dev/lp[0-n] αν συνδέεται με παράλληλο interface, ή /dev/usb/lp[0-n] αν πρόκειται για USB εκτυπωτή.
 
Σχετικά Linux Kernel components: CONFIG_PRINTER, CONFIG_USB_PRINTER

 

  • Κάρτες δικτύου
     
    Οι κάρτες δικτύου (ΝIC) συνήθως δεν έχουν interface στο /dev. Αντ' αυτού σε όποια εφαρμογή χρειάζεται πρόσβαση σε επίπεδο NIC (λίγες και εξειδικευμένες) απλά εισάγουμε το όνομά του με τον τρόπο που το ζητάει. Στο Linux οι NIC ονομάζονται eth[0-n] ενώ στα περισσότερα άλλα Unix-οειδή πρόθεμα[0-n], όπου πρόθεμα μια συντόμευση του ονόματος του driver που χρησιμοποιείται (ανάλογα τον κατασκευαστή της κάρτας). Οι παράμετροι IP μπορούν να περαστούν σε μια NIC μέσω της
ifconfig(8) ή της -πιο εξελιγμένης- ip(8) ή οποία αποτελεί μέρος του IProute2, ενός πακέτου με εξειδικευμένες εφαρμογές διαχείρισης δικτύου για Linux. Για να ρυθμίσουμε σωστά τις διευθύνσεις θα πρέπει να γνωρίζουμε την έννοια ενός (υπο)δικτύου IP. Τρεις χρήσιμες πηγές για την κατανόηση αυτής της έννοιας: εδώ, εδώ και εδώ.
 
Σχετικά Linux Kernel components: CONFIG_NET_*, CONFIG_INET_*, more

 

Υπάρχουν επίσης ορισμένες συσκευές που δεν αντιπροσωπεύουν υλικές συσκευές αλλά εξυπηρετούν κάποιες λειτουργίες. Για παράδειγμα:

 

  • /dev/null
    Μια συσκευή φτιαγμένη για να καταπίνει δεδομένα όσο το δυνατόν γρηγορότερα. Τα δεδομένα απλά απορρίπτονται, ενώ η συσκευή επιστρέφει πάντα μηδενική έξοδο.

 

  • /dev/zero
    Μια συσκευή που επιστρέφει επ αόριστον bits με μηδενική τιμή. Είναι ο πιο γρήγορος τρόπος για να "γεμίσουμε" ένα αρχείο, ή αλλιώς για να φτιάξουμε ένα αρχείο που να καταλαμβάνει συγκεκριμένο χόρο στο υπάρχον filesystem. Χρησιμοποιείται συνήθως για αυτό το σκοπό με την
dd(1).

 

  • /dev/urandom
    Μια συσκευή που επιστρέφει επ αόριστον bits με τυχαία τιμή, χρησιμοποιώντας τον pseudo-random generator του kernel. Θεωρητικά δεν είναι πραγματικά τυχαία η έξοδος, μιας και είναι αποτέλεσμα αλγόριθμου, αλλά είναι αρκετά τυχαία για τις περισσότερες χρήσεις.

 

  • /dev/random
    Μια συσκευή που επιστρέφει bits με τυχαία τιμή τα οποία συλλέγονται κατά τη διάρκεια λειτουργίας του συστήματος από πηγές "θορύβου", δηλαδή δεδομένων που είναι αδύνατο να προβλεφθούν. Αυτά αποθηκεύονται στη λεγόμενη "entropy pool".

* Αυτή η ενότητα έχει πολλά περιθώρια βελτίωσης

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ευχαριστούμε! :-)

 

btw, βλέπω ότι οι ενότητες είναι 11 αλλά έχεις πιάσει μόνο 6 μηνύματα. Γιατί δεν πιάνεις άλλα τόσα, να είναι συνεχόμενα;

 

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

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Όντως θα ήταν χρήσιμη μια ενότητα που θα προσδιόριζε τον καθαρά οργανωτικό ρόλο μιας διανομής και θα επισήμαινε τα συνηθέστερα σημεία διαφοροποίησης, αλλά για να βγάζει νόημα όπως τη φαντάζομαι θα πρέπει πρώτα να γίνει κατανοητό το πώς λειτουργεί κάθε μια από τις μονάδες (τα επιμέρους τμήματα software) που οργανώνει. Αν ολοκληρωθούν οι ενότητες που καλύπτουν αυτές τις μονάδες μετά ο αναγνώστης (εφόσον τις έχει δει και στην πράξη) θα μπορεί να διαβάσει ευχάριστα μια τέτοια ενότητα χωρίς να συναντά άγνωστους όρους ή να του φαίνεται τόσο τρομακτικό το χάσμα θεωρίας-πράξης. Βέβαια από κάθε κείμενο όσο άγνωστο και να είναι ο καθένας κάτι συγκρατεί, αν θέλει και μπορεί κάποιος να καλύψει το θέμα από τώρα θα ήταν σίγουρα χρήσιμο!

 

btw, βλέπω ότι οι ενότητες είναι 11 αλλά έχεις πιάσει μόνο 6 μηνύματα. Γιατί δεν πιάνεις άλλα τόσα, να είναι συνεχόμενα;

 

Τα ενδιάμεσα posts τα άνοιξα με τον χρήστη "nske2" απλά για να αποφύγω να ενωθούν όσα posts έβαλα (το οποίο κάνει αυτόματα το forum για συνεχόμενες δημοσιεύσεις του ίδιου χρήστη). Πιστεύω τώρα που μπήκαν πια σε χωριστά posts θα μπορούσαν να διαγραφούν όλα τα posts του nske2. Επειδή συνήθως κάθε ενότητα καταλαμβάνει πάνω από μια οθόνη δε νομίζω ότι έχει σημασία να είναι συνεχόμενες οι δημοσιεύσεις (αφού ούτως ή άλλως θα μπει link στο πρώτο post). Για τον ίδιο λόγο τελικά είναι μάλλον άσκοπη και η πρότασή που είχα κάνει να μπουν μόνο πληροφοριακές δημοσιεύσεις σε αυτό το topic.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 εβδομάδες αργότερα...

[σημ. λόγω περιορισμού του forum, η συγκεκριμένη ενότητα χωρίζεται σε δύο δημοσιεύσεις]

 

Κονσόλα, terminal, shell, ..

 

Όταν γεννήθηκε το UNIX οι υπολογιστές που το τρέχανε δεν είχαν τη σημερινή μορφή. Υπήρχε ένας κεντρικός υπολογιστής που επεξεργαζόταν και αποθήκευε τα δεδομένα και οι χρήστες είχαν πρόσβαση μέσω συσκευών γνωστών ως κονσόλες ή “κουτά τερματικά”, οι οποίες συνδέονταν σειριακά με αυτόν. Ο μόνος ρόλος τους ήταν να στέλνουν την είσοδο από ένα πληκτρολόγιο και να δέχονται την έξοδο, που την εμφάνιζαν σε μια οθόνη. Σήμερα μπορεί να μην χρησιμοποιούμε τέτοια τερματικά, το UNIX όμως χρησιμοποιεί. Απλά οι λειτουργίες τους αντί να γίνονται μέσω hardware εξομοιώνονται μέσω software το οποίο μπορεί να κάνει χρήση των σύγχρονων interfaces εισόδου/εξόδου (κάρτα γραφικών, usb/ps2 πληκτρολόγιο ή ακόμη δικτυακές υπηρεσίες σαν το telnet/ssh).

 

Ο X11 server, που παρέχει το γραφικό περιβάλλον, εκτελείται πάνω από ένα (pseudo) terminal, όμως έχει δικούς του οδηγούς εισόδου/εξόδου. Για να έχουμε πρόσβαση σε ένα περιβάλλον κονσόλας κάτω από τον X11, χρειάζεται να χρησιμοποιηθεί ένας terminal emulator που καλύπτει τις ιδιαίτερες απαιτήσεις όπως η δυνατότητα προσαρμογής της εξόδου στο μέγεθος του παραθύρου και της λήψης εισόδου από συσκευές του X11. Τέτοιοι είναι ο konsole του KDE, το gnome-terminal του gnome και το xterm(1) του XFree86/Xorg.

 

Το shell (μετάφραση “κέλυφος”) είναι ένα πρόγραμμα που διαβάζει τις εντολές που στέλνει ο χρήστης μέσω ενός terminal και τις εκτελεί. Είναι δηλαδή ένας interpreter με πολλά χαρακτηριστικά. Ο σκοπός του είναι να παρέχει ένα ομοιόμορφο περιβάλλον για την εκτέλεση και τη διαχείριση εφαρμογών ενώ, με τη βοήθεια εργαλείων όπως η awk(1) και η sed(1) και facilities όπως το procfs(1), το sysfs(2) και το devfs, μπορεί να εκπληρώσει πάρα πολλές λειτουργίες προσεγγίζοντας αρκετά μια γλώσσα προγραμματισμού. Υπάρχουν αρκετά Shells, με πιο γνωστά το bash(1), το zshell και το tcsh. Μόλις κάποιος συνδεθεί (κάνει login) στο σύστημα θα εκτελεστεί αυτόματα το shell που είναι αντιστοιχισμένο με το λογαριασμό του, με τα δικαιώματά του (πληροφορίες για τις έννοιες των λογαριασμών και των δικαιωμάτων στη σχετική ενότητα).

 

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

 

  • Παραπομπές:
    - Wikipedia articles on
Shell, Computer Terminal, Terminal emulator, Pseudo Terminal
- Linfo articles on Console, Shell

 

 

Η δομή του Shell

 

Η δύναμη του Shell βασίζεται στο γεγονός ότι μπορεί να εκμεταλλευτεί τις λειτουργίες όλων των εφαρμογών κονσόλας και να τις συνδυάσει εφευρετικά, παίρνοντας την έξοδο της μίας, υποβάλλοντάς την σε βασική επεξεργασία και δίνοντάς την ως είσοδο σε άλλη. Επίσης μπορεί να ανταλλάξει δεδομένα με συσκευές, μέσω του Devfs, να διαβάσει και να γράψει διάφορες πληροφορίες του kernel μέσω του Procfs και του Sysfs ή να παρέχει γραφικά interfaces μέσω πολλών widget libraries. Το Shell διαθέτει βασικές δομές γλωσσών προγραμματισμού (μεταβλητές, operators, loops, conditionals), επιτρέπει βασική πρόσβαση στις περισσότερες βάσεις δεδομένων μέσω των συνοδευτικών Command Line Client-Interfaces που συνήθως τις συνοδεύουν και σε μερικές περιπτώσεις (όπως του bash) έχει ακόμη και εσωτερική υποστήριξη για TCP/IP sockets. Αν σκεφτούμε τον τεράστιο αριθμό εφαρμογών κονσόλας, είναι ελάχιστα τα πράγματα που δε μπορούν να φτιαχτούν σε Shell Script, όμως δεν χρησιμοποιείται για μεγάλες εφαρμογές λόγω της μικρής ταχύτητάς των Shell interpreters, της έλλειψης πιο σύνθετων δομών και της απόλυτη εξάρτησης από εξωτερικές εφαρμογές που θα έκανε τη συντήρηση μαρτύριο. Χρησιμοποιείται συνήθως για "quick-and-dirty" δουλειές, όπως ταξινόμηση/μετονομασία αρχείων, εξαγωγή και διαμόρφωση πληροφοριών από αρχεία κειμένου ή εφαρμογές κ.α.

 

Παρακάτω Θα αναφέρω τα στοιχεία που δίνουν στο Shell ευελιξία και δυνατότητες μαζί με κάποια παραδείγματα, όπου χρειάζεται. Το πιο δημοφιλές (και ίσως το πιο πλούσιο) Shell είναι το bash και αυτό χρησιμοποιείται για αναφορά. Η λογική ελάχιστα διαφέρει από shell σε shell, μόνο το συντακτικό.

 

 

Variables (μεταβλητές)

 

Όπως είπαμε το shell υποστηρίζει μεταβλητές. Οι μεταβλητές μας επιτρέπουν να αντιστοιχίσουμε ένα περιεχόμενο (τιμή) με ένα όνομα, έτσι ώστε να μπορούμε να προσπελάσουμε το περιεχόμενο ανά πάσα στιγμή δίνοντας απλά το όνομα (στην προκειμένη προττάσοντας το σύμβολο "$"). Το περιεχόμενο τυπικά είναι είτε μια ακολουθία χαρακτήρων (string) είτε ένας ακέραιος αριθμός (integer).

 

Για να ορίσουμε τιμή σε μια μεταβλητή χρησιμοποιούμε τον "=" operator ως εξής:

variable="value"

 

Η μεταβλητή variable θα ισχύει μέσα στο συγκεκριμένο shell που εκτελείται, δε θα κληροδοτηθεί σε θυγατρικά shells. Αν θέλουμε να κάνουμε μια μεταβλητή διαθέσιμη σε όλα τα θυγατρικά shells θα πρέπει να την εξάξουμε σαν μεταβλητή περιβάλλοντος δίνοντας:

export variable="value"

 

Οι environmental variables είναι διαθέσιμες σε όλα τα θυγατρικά shells. Πολλές χρήσιμες πληροφορίες σχετικά με το σύστημά μας αποθηκεύονται σε environmental variables προκειμένου να είναι διαθέσιμες σε οποιεσδήποτε εφαρμογές τις χρειαστούν. Μπορούμε να δούμε λίστα με όλες τις environmental variables μέσω της εντολής env(1p) ή set(1p). Αν θέλουμε να διαγράψουμε μια μεταβλητή χρησιμοποιούμε την εντολή unset(1p).

 

  • Παραπομπές:
    - Wikipedia articles on
Environmental Variables
- man set(1p), unset(1p), env(1p)

 

 

Operators (τελεστές)

 

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

 

  • Ορισμός μεταβλητών, όπως είπαμε παραπάνω ορίζουμε τιμές στις μεταβλητές μεσολαβώντας το σύμβολο "=" χωρίς κενά. Παράδειγμα:
    metabliti1=10
    metavliti2=είκοσι
     
  • Αριθμητικές πράξεις: πρόσθεση, αφαίρεση, διαίρεση, πολλαπλασιασμός, ύψωση σε εκθέτη, υπολογισμός υπολοίπου. Χρησιμοποιούμε αντίστοιχα τα σύμβολα +, -, /, *, **, % . Παράδειγμα:
    let x=20+2
    // x=22, πρόσθεση
     
    let y=$x-4
    // y=18, αφαίρεση
     
    let x=5**2
    // x=25 ύψωση σε εκθέτη
     
    let y=$x/5
    // y=5, διαίρεση
     
    let x=5*2
    // x=10, πολλαπλασιασμός
     
    let y=12%5
    // y=2, υπόλοιπο της διαίρεσης 12/5
     
    Επειδή είναι πολύ συνηθισμένο να κάνουμε κάποια αριθμητική πράξη σε μια μεταβλητή και να δώσουμε το αποτέλεσμα ως νέα τιμή στην ίδια μεταβλητή, μπορούν να χρησιμοποιηθούν προαιρετικά οι εξής operators: +=, -=, /=, *=, **=, %=. Για παράδειγμα αντί να δίναμε x=$x+4 θα μπορούσαμε να δώσουμε x+=4. Χρησιμοποιούμε την εντολή let για να ορίσουμε στο bash ότι ακολουθούν αριθμητικές πράξεις και όχι εντολές.
     
  • Τελεστές δοκιμασίας. Μας επιτρέπουν να υποβάλουμε κάποια δεδομένα σε συγκεκριμένη δοκιμασία. Το αποτέλεσμα της δοκιμασίας είναι TRUE στην περίπτωση που η πρόταση αποδεικνύεται αληθής ή FALSE στην περίπτωση που είναι ψευδής. Συνήθως οι τελεστές δοκιμασίας χρησιμοποιούνται σε μια conditional ή σε μια loop, ώστε ανάλογα με το αποτέλεσμα να ορίσουμε μια ενέργεια. Αυτές οι δομές αναφέρονται πιο αναλυτικά παρακάτω. Οι δυνατές δοκιμασίες είναι οι εξής:
     
    • Σύγκριση μεγέθους. Αν θέλουμε να συγκρίνουμε το μέγεθος ενός αριθμού με το μέγεθος ενός άλλου. Οι operators σύγκρισης μεγέθους είναι οι εξής: =, <, <=, >, >= για ίσο, μικρότερο, μικρότερο ή ίσο, μεγαλύτερο, μεγαλύτερο ή ίσο αντίστοιχα.
      if (( $x<$y )); then echo "$x μικρότερο του $y"; fi
       
    • Σύγκριση ομοιότητας. Αν θέλουμε να διαπιστώσουμε την ομοιότητα ενός string με ενός άλλου, χρησιμοποιούμε τον operator ==.
      if [ $x==$y ]; then echo "το $x είναι όμοιο με το $y"; fi

       
    • Δοκιμασίες αρχείων. Operators που δοκιμάζουν την ύπαρξη ή τις ιδιότητες αρχείων. Είναι αρκετοί τέτοιοι τελεστές, μερικοί συνηθισμένοι: -e (υπάρχει), -f (είναι αρχείο), -d (είναι κατάλογος), -h (είναι συντόμευση), -s (δεν έχει μηδενικό μέγεθος).
      if [ -f $x ]; then echo "το $x είναι υπάρχον αρχείο"; fi

     

    [*] Συνδετικοί τελεστές. Μας επιτρέπουν να συνδέσουμε μια σειρά από προτάσεις σε μια νέα πρόταση κατά τρόπο ώστε η εγκυρότητα αυτής της πρότασης να εξαρτάται από την εγκυρότητα των συνδεδεμένων προτάσεων. Αυτοί οι τελεστές είναι δύο: && (ισχύουν και οι δύο προτάσεις που συνδέει), || (ισχύει τουλάχιστον μια από τις προτάσεις που συνδέει).

    if (( $x < 5 )) && (( $y < 5 )); then echo "και το $x και το $y είναι μικρότερα του 5"; fi

    [*] Τελεστές ανακατεύθυνσης. Περιγράφονται αναλυτικά παρακάτω.

 

 

Standard ροές, ανακατευθύνσεις

 

Όπως θα ξέρουν όσοι προγραμματίζουν σε C ανεξαρτήτως λειτουργικού, "standard output (stdout), Standard input (stdin) και Standard Error (stderr) είναι 3 τοποθεσίες (προσβάσιμες σαν "αρχεία") αντιστοιχισμένες με ένα terminal έτσι ώστε οι εφαρμογές μας να μπορούν να διαβάσουν εύκολα πληροφορίες που εισάγονται από το πληκτρολόγιο και να τις τυπώσουν στην οθόνη χωρίς να γνωρίζουν τίποτα ούτε για το συγκεκριμένο τερματικό ούτε βέβαια για το hardware. Όλες σχεδόν οι εφαρμογές κονσόλας γράφουν (κάποια) επιστροφή τους στο stdout, ενώ πολλές διαβάζουν δεδομένα από το stdin και τα επεξεργάζονται. Τέλος, όλες οι εφαρμογές κανονικά γράφουν τα σημαντικά μηνύματα τους στο stderr. Το stderr είναι αντιστοιχισμένο με ένα terminal το οποίο πρέπει να παρακολουθείται από τον χρήστη. Συνήθως είναι το ίδιο terminal όπου γράφεται και το stdout, δηλαδή το terminal από το οποίο ξεκίνησε η εκάστοτε εφαρμογή, όμως πολλές φορές σε μηχανήματα που προορίζονται για χρήση από πολλούς χρήστες το stderr στέλνεται σε ένα δικό του τερματικό αποκλειστικά για αυτή τη δουλειά. Έτσι ο διαχειριστής μπορεί να βλέπει με μια ματιά όλα τα σημαντικά μηνύματα.

 

Από τα πιο ισχυρά εργαλεία του Shell είναι η δυνατότητα ανακατεύθυνσης του stdout (και, προαιρετικά, του stderr) που επιστρέφει κάποια εφαρμογή στο stdin μιας άλλης εφαρμογής. Η δεύτερη εφαρμογή, προφανώς, θα πρέπει να είναι σχεδιασμένη για να επεξεργάζεται το stdin της.

 

Μπορούμε να ανακατευθύνουμε την έξοδο μιας εφαρμογής σε μια άλλη μεσολαβώντας τον χαρακτήρα | ως εξής:

$ ls -R / | less

$ ps -aux | grep root | grep init

 

Στο πρώτο παράδειγμα πήραμε την επιστροφή της ls -R (η οποία τυπώνει αναδρομικά όλα τα αρχεία ξεκινώντας από το σημείο /) στην εφαρμογή less. Η εφαρμογή less είναι σχεδιασμένη να δέχεται είσοδο κειμένου πολλών σειρών και να την τυπώνει ανά οθόνη, δηλαδή να τυπώνει όσες σειρές χωράνε στην οθόνη, να παγώνει, και να προτρέπει τον χρήστη για να συνεχίσει, τυπικά πατώντας ένα πλήκτρο.

 

Στο δεύτερο παράδειγμα παίρνουμε την επιστροφή της "ps -aux", η οποία εμφανίζει πληροφορίες για τις εργασίες που εκτελούνται στο σύστημα, μια γραμμή ανά διεργασία, και την "ταΐσαμε" στην grep, η οποία είναι σχεδιασμένη για να φιλτράρει όσες σειρές περιέχουν το string που ακολουθεί (στην προκειμένη "root") και να τις τυπώσει στο stdout, το οποίο φιλτράραμε πάλι με τον ίδιο τρόπο για σειρές που περιέχουν "init". Έτσι απομονώσαμε όσες σειρές περιέχουν "init" και "root", κάτι αρκετά κοντά στο στόχο μας να εμφανίσουμε διεργασίες που έχουν στο όνομά τους "init" και ανήκουν στον χρήστη root.

 

Μία άλλη δυνατότητα του Shell, είναι η χρήση αρχείων για αποθήκευση του stdout ή/και τροφοδότηση του stdin μιας εφαρμογής. Αυτό γίνεται μέσω των τελεστών > και < αντίστοιχα. Η σύνταξής τους έχει ως εξής:

$ locate conf > apotelesmata

// Αναζητάμε αρχεία που έχουν στο όνομά τους "conf" και αποθηκεύουμε τα αποτελέσματα στο αρχείο "apotelesmata"

 

$ tr a-z A-Z < apotelesmata

// Μετατρέπουμε όλους τους χαρακτήρες των αποτελεσμάτων από μικρούς σε κεφαλαίους. Φυσικά η εντολή tr θα μπορούσε να δέχεται ως παράμετρο το όνομα ενός αρχείου και να το άνοιγε, όμως όπως βλέπουμε στην info page της δεν δέχεται παράμετρο filename, θέλει τα δεδομένα από το stdin.

 

Παραπομπές:

- Wikipedia articles on Standard Streams, Pipelines, Redirection, File Descriptors

 

 

Προτάσεις συνθήκης (conditional statements) if..else

 

Το shell μας επιτρέπει να εκτελέσουμε μια ενέργεια ανάλογα με την εγκυρότητα μιας πρότασης. Την διατύπωση αυτής της πρότασης την κάνουμε είτε με τη βοήθεια των operators δοκιμασίας που είδαμε παραπάνω, είτε με τη βοήθεια οποιασδήποτε εφαρμογής κονσόλας επιστρέφει exit status (δηλαδή σχεδόν όλων). Η ενέργεια που μπορεί να οριστεί μπορεί να είναι είτε απλά η εκτέλεση μιας εντολής είτε η εκτέλεση μιας σειράς άλλων προτάσεων συνθήκης και loops.

 

Exit Status:

Κάθε εφαρμογή, όταν ολοκληρώσει την εκτέλεσή της επιστρέφει στο process που την ξεκίνησε έναν αριθμό που δηλώνει γιατί τερμάτισε. Αν ο αριθμός αυτός είναι 0, σημαίνει ότι η εφαρμογή έκανε αυτό που έπρεπε να κάνει και τερμάτισε επιτυχημένα. Άλλοι αριθμοί εξαρτώνται από την εκάστοτε εφαρμογή και δηλώνουν διαφορετικά ενδεχόμενα, ανάλογα με το τι δουλειά κάνει η εφαρμογή. Το shell αποθηκεύει την τιμή του Exit Status στην μεταβλητή $?, και στους οποιουσδήποτε ελέγχους του ερμηνεύει μια τιμή 0 ως TRUE και μια οποιαδήποτε άλλη τιμή ως FALSE.

 

Η σύνταξη της συνθήκης στο bash είναι η εξής:

 

>[color="DarkGreen"]if συνθήκη; 
then εντολές;
else εντολές;
fi[/color]

Αν η συνθήκη είναι μια expression που πρέπει να υπολογιστεί από το shell (αν περιέχει κάποιον τελεστή δοκιμασίας) τότε θα πρέπει να μπει ολόκληρη μέσα σε [ ], αν χρησιμοποιήσουμε μια εντολή τότε μπαίνει κατευθείαν. Παράδειγμα:

 

>[color="DarkGreen"]x=10
if [ $x == 10 ];
then echo $x;
else echo "κάτι δεν πάει καλά!"
fi

[/color]

// Αν το $x ισούται με 10, τύπωσε την τιμή του αλλιώς τύπωσε "κάτι δεν πάει καλά!".

 

>[color="DarkGreen"]if grep root /etc/passwd>/dev/null;
then echo "user root found!";
else echo "WTF?"
fi[/color]

// Αν υπάρχει χρήστης με όνομα root στο σύστημά μας, τύπωσε "user root found!". Το stdout της συνθήκης το κατευθύνουμε στο /dev/null επειδή δε μας ενδιαφέρει να τυπωθεί. Ο έλεγχος της συνθήκης γίνεται με βάση το exit status της grep η οποία επιστρέφει 0 αν βρει αυτό που της ζητήθηκε και 1 αν δεν το βρει.

 

 

For loops

 

Το shell δίνει τη δυνατότητα να πάρουμε μια σειρά από αντικείμενα και να εκτελέσουμε μια ενέργεια έχοντας διαθέσιμο το όνομα του κάθε αντικειμένου σε μια προσωρινή μεταβλητή. Για παράδειγμα:

 

>[color="DarkGreen"]
for x in *.rar; do
if unrar x $x>/dev/null;
	then echo "το $x αποσυμπιέστηκε!";	
fi
done[/color]

 

// Θα έπαιρνε 1-1 όλα τα αρχεία με κατάληξη .rar και θα τα αποσυμπίεζε με την εντολή unrar, αν η αποσυμπίεση ήταν επιτυχής θα τύπωνε για κάθε ένα "Το αρχείο.rar αποσυμπιέστηκε".

 

ή

>[color="DarkGreen"]
y=1
for x in a b c; do
echo "$y) $x";
let y+=1;
done[/color]

 

// θα τύπωνε

// 1) a

// 2) b

// 3) c

 

 

While loops

 

Επίσης το shell μας επιτρέπει να εκτελούμε μια ενέργεια για όσο μια συνθήκη ισχύει με χρήση της While loop. Για παράδειγμα:

 

>[color="DarkGreen"]while ping -c1 1.2.3.4>/dev/null; do
echo `date` ":Το μηχάνημα είναι εντάξει";
sleep 5;
done[/color]

// Στέλνει ένα ping request κάθε 5 δευτερόλεπτα στη διεύθυνση IP 1.2.3.4 και αν λάβει απάντηση τυπώνει την ώρα και το μήνυμα "το μηχάνημα είναι εντάξει".

 

Semantics

  • Ορισμένοι χαρακτήρες έχουν ειδική σημασία για το Shell. Αν τυχόν θέλουμε να τους συμπεριλάβουμε σε κάποιο όνομα, θα πρέπει να τους "φυγαδεύσουμε" (escape). Μπορούμε να τους κάνουμε escape είτε με χρήση εισαγωγικών είτε τοποθετόντας τον χαρακτήρα \ πριν από κάθε έναν από αυτούς.
  • O Χαρακτήρας ~ αντικαθίσταται από την τιμή της environmental variable $ΗΟΜΕ, η οποία περιέχει τον κατάλογο κάθε χρήστη, συνήθως στην τοποθεσία /home/χρήστης.
  • Η τοποθεσία . αντιπροσωπεύει τον τρέχον κατάλογο στον οποίο βρισκόμαστε, αυτόν που περιέχεται και στην τιμή της environmental variable $PWD. Επίσης η τοποθεσία .. αντιπροσωπεύει τον μητρικό κατάλογο αυτού στον οποίο βρισκόμαστε.
  • Ο χαρακτήρας # δηλώνει ότι όλοι οι χαρακτήρες που ακολουθούν στην ίδια γραμμή είναι σχόλιο και θα αγνοηθούν από τον interpreter.
  • Ο χαρακτήρας ; δηλώνει το τέλος μιας εντολής. Χρειάζεται να χρησιμοποιηθεί μόνο αν θέλουμε να εκτελέσουμε πολλές εντολές στην ίδια σειρά.
  • Ο χαρακτήρας * χρησιμοποιείται για να αντιπροσωπεύσει οποιοδήποτε συνδυασμό χαρακτήρων σε ένα όνομα αρχείου, με εξαίρεση αρχεία που το όνομά τους ξεκινά με τελεία τελεία.
  • Ο χαρακτήρας ? χρησιμοποιείται για να αντιπροσωπεύσει οποιονδήποτε ένα χαρακτήρα.
  • Ο χαρακτήρας $ χρησιμοποιείται για να δηλώσει ότι το string που ακολουθεί είναι ένα όνομα μεταβλητής.
  • Τα διπλά εισαγωγικά (") χρησιμοποιούνται για να αποτρέψουν την ερμηνεία οποιωνδήποτε ειδικών χαρακτήρων βρίσκονται μέσα τους από τον interpreter του shell. Μόνο ο χαρακτήρας $ δεν γίνεται escape από αυτά, οπότε οι μεταβλητές που είναι μέσα σε διπλά εισαγωγικά αντικαθίστανται κανονικά.
  • Tα μονά εισαγωγικά (') χρησιμοποιούνται για να αποτρέψουν την ερμηνεία οποιωνδήποτε ειδικων χαρακτήρων βρίσκονται μέσα τους από τον interpreter του Shell, ακόμα και του $.
  • Ο χαρακτήρας ` χρησιμοποιείται σε μια πρόταση πριν και μετά από μια εντολή, για να δηλώσει ότι θα πρέπει να εκτελεστεί η εντολή που περιέχεται και το αποτέλεσμά της να αντικατασταθεί στην πρόταση.
  • Η μεταβλητή $? χρησιμοποιείται για να αποθηκεύσει την τιμή Exit Status που επέστρεψε η τελευταία εντολή που εκτελέστηκε.
  • Χαρακτήρες που χρησιμοποιούνται σε operators είναι επίσης ειδικοί χαρακτήρες και χρειάζονται escaping.
  • Τα spaces, tabs και newline characters αγνοούνται στις περισσότερες περιπτώσεις

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 εβδομάδες αργότερα...

Shell Scripts

 

Όλα όσα είπαμε παραπάνω μπορούν να εφαρμοστούν απλά εισάγοντάς τα σε ένα bash shell, γραμμή γραμμή. Αυτό δεν είναι και τόσο πρακτικό αν θέλουμε να εκτελέσουμε ενέργειες που χρειάζονται πολλές σειρές για να διατυπωθούν. Για αυτό το λόγο μπορούμε να εισάγουμε τις εντολές μας σε ένα αρχείο κειμένου και να καλέσουμε τον shell interpreter να το ερμηνεύσει. Το αρχείο αυτό ονομάζεται shell script και μπορεί να εκτελεστεί δίνοντας το όνομά του ως παράμετρο στο εκτελέσιμο ενός shell interpeter. Για παράδειγμα, αν αποθηκεύαμε τις εντολές μας σύμφωνα με τη σύνταξη του bash στο αρχείο script.sh, θα μπορούσαμε να τις εκτελέσουμε δίνοντας sh script.sh (όπως μπορούμε να δούμε, το sh είναι μια συντόμευση που οδηγεί στο /bin/bash). Επίσης το Unix μας δίνει τη δυνατότητα να ορίσουμε να εκτελείται αυτόματα ένα script από κάποιον interpreter, σα να ήταν εκτελέσιμο, εφόσον ορίσουμε στην πρώτη γραμμή του αρχείου

#!/path/to/interpreter

 

Στην προκειμένη δηλαδή #!/bin/sh. Στη συνέχεια, εφόσον το αρχείο έχει ορισμένο το δικαίωμα execute από τον συγκεκριμένο χρήστη με τον οποίο είμαστε συνδεδεμένοι, μπορούμε να το εκτελέσουμε κατευθείαν δίνοντας /path/to/script.sh.

 

Συνηθισμένες ανέσεις του Shell

 

Όλα τα σύγχρονα shells παρέχουν τις ακόλουθες ευκολίες:

 

  • Profile file. Είναι ένα αρχείο που διαβάζεται αυτόματα με την εκκίνηση ενός shell, τυπικά βρίσκεται στο /etc/profile. Περιέχει μεταβλητές περιβάλλοντος που επηρεάζουν διάφορα πράγματα, από την κωδικοποίηση των χαρακτήρων (Locales) μέχρι τις διαδρομές στις οποίες ο shell interpreter θα ψάχνει για εκτελέσιμα όταν του εισάγουμε εντολές ($PATH). Επίσης συνηθίζεται να ορίζει την αυτόματη εκτέλεση ενός αρχείου μέσα στον αρχικό κατάλογο του χρήση που εκτέλεσε το shell (αν αυτό υπάρχει). Οι χρήστες μπορούν να περάσουν δικές τους ρυθμίσεις σε αυτό το αρχείο, ώστε να έχουν προσαρμοσμένο περιβάλλον shell σύμφωνα με τις προτιμήσεις τους. Το bash συνήθως ορίζεται να διαβάζει το αρχείο $HOME/.bashrc.
  • Ιστορικό. Όλες οι εντολές που εκτελεί ο κάθε χρήστης αποθηκεύονται προσωρινά στη μνήμη, ώστε να μπορεί να ανατρέξει σε αυτές πατώντας το πάνω βέλος του πληκτρολογίου, ή μέσω της εντολής history(3). Με την αποσύνδεση του χρήστη οι εντολές αποθηκεύονται μόνιμα στο αρχείο $ΗΟΜΕ/.bash_history.
  • Αυτόματη συμπλήρωση εντολών. Πληκτρολογώντας τα αρχικά γράμματα μιας εντολής ο χρήστης, και πατώντας το πλήκτρο [TAB] επανειλημμένα μπορεί να δει όλες τις εντολές που αρχίζουν με αυτά τα γράμματα. Το ίδιο ισχύει και για διαδρομές και αρχεία.
  • Aliases. Ο χρήστης με την εντολή alias(p1) μπορεί να ορίσει δικές του εντολές τις οποίες να αντιστοιχίσει με άλλες εντολές. Παραδείγματος χάρη, ένας χρήστης που προτιμάει να ερωτάται πάντα για τη διαγραφή ενός αρχείου, θα μπορούσε να δημιουργήσει ένα alias με όνομα "rm", το οποίο να αντιστοιχεί με "rm -i". Τα aliases έχουν πάντα προτεραιότητα σε σχέση με τις εντολές, οπότε πληκτρολογώντας rm θα εκτελούταν το περιεχόμενο του alias αντί η εντολή rm. Τα aliases συνήθως ορίζονται στο αρχείο $HOME/.bashrc, ή απευθείας στο /etc/profile. H σύνταξη για το παραπάνω παράδειγμα θα ήταν:
    alias rm="rm -i"
  • Logout file. Ένα αρχείο του οποίου το περιεχόμενο εκτελείται μόλις ο χρήστης αποσυνδεθεί. Στο bash το αρχείο αυτό είναι συνήθως το $HOME/.bash_logout.
  • Παραμετροποίσημη prompt. Είναι το κειμενάκι που εμφανίζεται στην αρχή κάθε γραμμής ενός shell και συνηθίζεται να περιέχει χρήσιμες πληροφορίες όπως το hostname και τον τρέχον κατάλογο. Επίσης συνηθίζεται να τελειώνει με τον χαρακτήρα "$" αν είμαστε συνδεδεμένοι ως απλοί χρήστες και με τον χαρακτήρα "#" αν είμαστε συνδεδεμένοι ως root. Αυτό το prompt μπορεί να παραμετροποιηθεί πειράζοντας την τιμή της μεταβλητής PS1.

 

  • Παραπομπές:
    • : Το επίσημο εγχειρίδιο του Bash. Ό,τι πιο πλήρες, για όποιον μπορεί να αντέξει κάποιες εξεζητημένες (για τις περισσότερες χρήσεις) λεπτομέρειες.

    • : Advanced Bash Scripting HOWTO. Πιθανότατα ο πιο πλήρης ανεπίσημος οδηγός για Bash.

    • : Σύντομη εισαγωγή σε Bash scripting.

    • : Αναλυτικός οδηγός για το Zshell.

    • : Λίστα με τις συνηθέστερες εντολές κονσόλας (posted by
      )

* Η συγκεκριμένη ενότητα δεν είναι πλήρης. Χρειάζεται να γίνει μια μικρή εισαγωγή στα regular expressions, ένα κεφάλαιο για την ρύθμιση γλωσσών πληκτρολογίου και γραμματοσειρών σε κονσόλα και ίσως να εξηγηθούν καλύτερα κάποια πράγματα. Αν είναι κάτι που θεωρείτε δυσνόητο ή κακογραμμένο επισημάνετέ το και θα βελτιωθεί!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 3 εβδομάδες αργότερα...

Ωραιο ποστ. Χρειαζομαι και αλλο :)

Αν και φανατικος των win xp pro δεν σημαινει οτι μενω εκει..

Προσπαθω να περασω στα linux και καποιοι οδηγοι σαν αυτον βοηθανε παρα πολυ.

tnx nske

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 1 μήνα μετά...

Ακόμα και clopy paste να ήτανε και πάλι κουράγιο θέλει,πράγμα λίγο δύσκολο μιας και έχω καταλάβει πως σκέφτεται ο nske.

 

Συγχαρητήρια όχι τόσο για το τι γράφει αυτό το tut/guide όσο για τον κόπο που έκανες για να το γράψεις.

 

Ωραίος ο παίχτης.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

  • 2 μήνες μετά...

Αρχειοθετημένο

Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.

  • Δημιουργία νέου...