Linux

Linux Basics (ημιτελές)

09/11/2010 12:20 μμ | nske από nske


Linux Basics

.. Putting the pieces together

 

 

__TOC__

 

 

 

Εισαγωγή

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

 

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

 

Φιλοδοξία του άρθρου είναι να αποτελέσει κάποια στιγμή έναν πλήρη εισαγωγικό οδηγό που θα δίνει μια γενική ιδέα (και θα παραπέμπει σε αναλυτικότερες πληροφορίες) για τη λογική και τον τρόπο λειτουργίας όλων των βασικών συστημάτων Unix-Like λειτουργικών.

 

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

 

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

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

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

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

 

Μην ξεχνάτε ότι το παρόν άρθρο είναι μια καταχώρηση WiKi. Μπορεί οποιοσδήποτε, άμεσα, να κάνει τις προσθήκες και τις αλλαγές που θέλει. ;)

 

 

 

Documentation

Man pages

Το 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 ή texinfo pages που έχουμε ανοίξει αρκεί να πατήσουμε το πλήκτρο "q" για τις κλείσουμε.

 

 

Άλλες πηγές πληροφοριών

Εκτός από τις 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. Slackbook-el: Μετάφραση του Slackbook στα ελληνικά, από το ILUG.
  4. LNAG: Παρομοίως, βιβλίο εισαγωγής στο Linux με διανομή αναφοράς το Redhat αλλά με γενική χρησιμότητα ανεξαρτήτως διανομής.
  5. Οδηγός Debian: Επίσης, βιβλίο εισαγωγής στο Linux στα ελληνικά, με διανομή αναφοράς το Debian αλλά με γενική χρησιμότητα. Από το ΕΛΛΑΚ.
  6. Greek Howto: Ελληνική προσπάθεια για τη μετάφραση οδηγών/HOWTO από το HELLUG.
  7. OpenBSD FAQ: Το εγχειρίδιο του OpenBSD.
  8. FreeBSD Handbook: Το εγχειρίδιο του FreeBSD.
  9. Debian Administration: Μεγάλη συλλογή άρθρων για διαχείριση συστημάτων Debian, αλλά γενικότερη παραδειγματική αξία.
  10. Linux Journal: Aξιόλογο περιοδικό για Linux με τακτική διάθεση online άρθρων.
  11. Linux Magazine: Άλλο ένα αξιόλογο περιοδικό για Linux με τακτική διάθεση online άρθρων κι έμφαση στη διαχείριση συστημάτων.
  12. ;login Magazine: Περιοδικό με παράδοση στον χόρο και ελεύθερη διάθεση των άρθρων παλαιότερων από 12 μηνες.
  13. Oreillynet Articles: Εξαιρετική και τακτικά ανανεώσιμη συλλογή άρθρων από τον γνωστό εκδοτικό οίκο.
  14. Librenix: Άλλη μια πλούσια πηγή άρθρων.
  15. Gentoo Wiki-HOWTOs: Από τις πιο πλούσιες distribution-specific συλλογές HOWTO. Γραμμένα για το Gentoo αλλά σε πάρα πολλές περιπτώσεις χρήσιμα ανεξαρτήτως λειτουργικού.
  16. Ubuntu Wiki: Παρομοίως, πλούσια συλλογή HOWTO γραμμένα για Ubuntu, πολλά από τα οποία έχουν βοηθητική αξία ανεξαρτήτως λειτουργικού.

 

 

 

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

Στο 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).

 

 

Ομάδες (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)

 

 

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

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

 

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

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

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

  • 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).

 

 

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

Το 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".

 

 

Κονσόλα/Shell

Κονσόλα, 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.

 

 

Η δομή του 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).