Αυτό το commit περιλαμβάνεται σε:
infl00p 2022-03-23 20:14:33 +02:00
commit 8ec8e9bee2
451 αρχεία άλλαξαν με 46736 προσθήκες και 0 διαγραφές

32
content/articles/34/01_editorial.md Κανονικό αρχείο

@ -0,0 +1,32 @@
+++
title = 'Editorial'
date = '2003-10-01T00:00:00Z'
description = ''
author = 'Ιατρού Μιχάλης iatrou ατ hellug ντοτ gr(mailto:iatrouNO@SPAMhellug.gr)'
issue = ['Magaz 34']
issue_weight = 1
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Magaz\... still unpatented.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αναμφισβήτητα το πιο σημαντικό γεγονός του Σεπτεμβρίου ήταν η ψηφοφορία σχετικά με τα software patents στο Ευρωπαϊκό Κοινοβούλιο. Η ψηφοφορία πραγματοποιήθηκε
στις 24 Σεπτεμβρίου, ενώ είχε ήδη αναβληθεί δύο φορές, εκ των οποίων η τελευταία ήταν στις αρχές Σεπτεμβρίου. Τα αποτελέσματα της ψηφοφορίας δικαίωσαν τις
προσπάθειες όλων όσων αντιτάχθηκαν στα software patents: οι περισσότερες τροποποιήσεις που ψηφίστηκαν στηρίζουν την ιδέα ότι το software δεν μπορεί να
πατενταριστεί. Αν κρίνουμε δε από διάφορες [αντιδράσεις](http://news.zdnet.co.uk/business/legal/0,39020651,39116709,00.htm) μάλλον \"κάποιοι\" ενοχλήθηκαν πολύ
από αυτή την εξέλιξη\...
Όπως όμως ήταν αναμενόμενο, σε μία ψηφοφορία που διήρκεσε μόλις 40 λεπτά και ψηφίστηκαν συνολικά 78 τροποποιήσεις, δεν ήταν εφικτό να γίνουν όλα **ακριβώς**
όπως θα τα θέλαμε: μπορεί οι βάσεις να έχουν μπει, αλλά περίπου το 20% των τροποποιήσεων πρέπει να επανεξεταστεί και να καταστεί απόλυτα σαφές ότι software και
πατέντες δεν συμβαδίζουν.
Το σίγουρο είναι ότι αν και κερδίσαμε αυτή τη μάχη, δεν έχουμε κερδίσει τον πόλεμο. Είναι βέβαιο πως στο εγγύς μέλλον θα υπάρξουν πολλές προσπάθειες να πληγεί η
ελευθερία του λογισμικού και πρέπει όλοι να είμαστε σε εγρήγορση
**Επί του πιεστηρίου\...**\
9 με 12 Οκτωβρίου πραγματοποιήθηκε στον εκθεσιακό χώρο της HELEXPO στη Θεσσαλονίκη η δεύτερη μεγαλύτερη έκθεση πληροφορικής στην Ελλάδα, η Infosystem. Ο
HEL.L.U.G. μετά από δύο χρόνια απουσίας έδωσε και πάλι το παρόν. Η παρουσία του μπορεί να χαρακτηριστεί απόλυτα επιτυχής: μοιράστηκαν μερικές χιλιάδες CD, ο
κόσμος ενημερώθηκε για το Linux, τον σύλλογο, το ελεύθερο λογισμικό αλλά και για σημαντικά προβλήματα όπως τα software patents. Φωτογραφίες τόσο από την έκθεση
όσο και από τις λοιπές δραστηριότητες του τετραήμερου μπορείτε να βρείτε [εδώ](http://www.hellug.gr/infosystem2003/index.html).

326
content/articles/34/02_texinfo.md Κανονικό αρχείο

@ -0,0 +1,326 @@
+++
title = 'Documentation ala GNU'
date = '2002-07-01T00:00:00Z'
description = ''
author = 'Καπελώνης Κωστής kkapelon _AT_ freemail.gr(mailto:kkapelonSPAM@SUXfreemail.gr)'
issue = ['Magaz 34']
issue_weight = 2
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Σε αυτό το άρθρο γίνεται μία εισαγωγή στο επίσημο εργαλείο για documentation της GNU, το σύστημα Texinfo. Απευθύνεται σε προγραμματιστές που έχουν τελειώσει
την κατασκευή μιας εφαρμογής κονσόλας και επιθυμούν να ενσωματώσουν βοήθεια σε αυτή.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Εισαγωγή**
-----------------------------------------
**2. Οι επιλογές σας**
------------------------------------------------
**3. Το texinfo από την μεριά του χρήστη.**
---------------------------------------------------------------------
**4. texinfo vs manpages**
----------------------------------------------------
**5. Η φιλοσοφία του texinfo**
--------------------------------------------------------
**6. To πιο απλό Texinfo αρχείο**
-----------------------------------------------------------
**7. Ένα μεγαλύτερο έγγραφο**
-------------------------------------------------------
**8. Συγγραφή του κυρίως κειμένου.**
--------------------------------------------------------------
**9. Emacs shortcuts**
------------------------------------------------
**10. Επίλογος**
--------------------------------------------
### [1. Εισαγωγή]{#s1}
Δεν νομίζω ότι χρειάζεται να επαναλάβω ρήσεις για το Documentation και το sex. Μεγάλα παιδιά είστε, οπότε ξέρετε ότι μεγάλο βάρος στην ποιότητα και την
ευχρηστία μιας εφαρμογής, έχει ΚΑΙ η βοήθεια/τεκμηρίωση που την συνοδεύει.
Δυστυχώς αρκετές φορές η βοήθεια ενός προγράμματος παραμελείται από τους προγραμματιστές της. Όλοι μας έχουμε συναντήσει προγράμματα που ενώ ήταν λειτουργικά
και μπορούσαν να εκπληρώσουν το σκοπό τους, είχαν ελλιπές ή ακόμα και μηδαμινό documentation.
Ειδικά στον χώρο του ανοιχτού λογισμικού (open source) τα πράγματα δεν είναι πολύ καλά. Άπειρες επιλογές με περίεργα ονόματα σε γραφικά προγράμματα, ή
undocumented παράμετροι σε προγράμματα κονσόλας (command line arguments) είναι καθημερινό φαινόμενο. Δεν μου αρέσει να ενεργοποιώ επιλογές που απλά είδα στο
δίκτυο ή άκουσα από φίλους ότι \"έτσι λειτουργεί\". Οι μέρες του voodoo πρέπει να μείνουν επιτέλους στην ιστορία.
Τώρα θα πούνε μερικοί, \"σιγά ρε φίλε! Use the source, Luke!\". Μα καλά είμαστε σοβαροί; Είμαστε στο 2000+ και θα πρέπει να ανοίξω τον πηγαίο κώδικα του
προγράμματος για να δω τι κάνει;Δεν το δέχομαι αυτό. Καλή εφαρμογή = καλός κώδικας + καλή τεκμηρίωση.
Γράφω λοιπόν αυτό το άρθρο έτσι ώστε όταν τελειώσετε το προγραμματιστικό σας αριστούργημα, με την τέλεια δομημένη εσωτερική αρχιτεκτονική, την ταχύτατη μεταφορά
πληροφορίας ανάμεσα στα διάφορα μέρη του, τις βελτιστοποιημένες στο έπακρο εσωτερικές ρουτίνες και τις πολύπλοκες δομές δεδομένων,όταν πιστέψετε ότι έχετε βάλει
τάξη στο χάος ;-), όταν νιώσετε ένας μικρός θεός και βιώσετε το θαύμα της δημιουργίας, να μην ξεχάσετε και τον παράγοντα τεκμηρίωση.
### [2. Οι επιλογές σας]{#s2}
Αν η εφαρμογή που γράφετε έχει γραφικό μέρος και ανήκει σε κάποιο από τα δύο γνωστά περιβάλλοντα εφαρμογών (desktop environments), δεν χρειάζεται να συνεχίσετε
την ανάγνωση. Απλά δείτε τις αντίστοιχες σελίδες που εξηγούν πως πρέπει να είναι το documentation της εφαρμογής σας. Λογικά θα πρέπει να γράψετε ένα αρχείο SGML
Docbook το οποίο θα πρέπει να έχει μια συγκεκριμένη μορφή.
Αν η εφαρμογή σας είναι απλά γραφική και δεν υπάρχει \"σωστός\" τρόπος για την εισαγωγή βοήθειας, προτιμήστε το δοκιμασμένο Latex. Βάζετε το output σε html στο
site του προγράμματος για online αναζήτηση, ενώ μαζί με το ίδιο το πρόγραμμα ενσωματώνετε τα ps και pdf αρχεία. Αυτό είναι απλά μία πρόταση. Είναι στην κρίση
σας να επιλέξετε.
Εδώ θα μιλήσουμε για την περίπτωση όπου το πρόγραμμα σας δεν έχει γραφικό περιβάλλον, αλλά εκτελείται σε περιβάλλον γραμμής εντολών. Αν είναι πολύ απλό στην
χρήση, και με λίγες παραμέτρους τα πράγματα είναι εύκολα. Απλά βάλτε στο -h/\--help του να εμφανίζεται κάθε δυνατή παράμετρος με μία μικρή εξήγηση. Σε αυτήν την
περίπτωση μπορείτε να ακολουθήσετε και το GNU style για τις παραμέτρους όπου κάθε μία έχει ένα σύντομο όνομα για τους έμπειρους χρήστες (πχ -b) και ένα πιο
μεγάλο για τους αρχάριους (πχ \--buffer-size).
Αν όμως δεν ισχύει κάτι τέτοιο οφείλετε να δώσετε ξεχωριστό documentation. Αυτό θα βοηθήσει τόσο τους έμπειρους χρήστες όταν θα θελήσουν να \"ξεζουμίσουν\" το
πρόγραμμα σας, αλλά και τους αρχάριους που αρέσκονται στο να βρίσκουν κάπου \"μαζεμένη\" την βοήθεια ενός προγράμματος.
### [3. Το texinfo από την μεριά του χρήστη.]{#s3}
Ας δούμε ένα παράδειγμα. Έστω ότι θέλετε να μάθετε τα πάντα για το GNU flex.
Αρχικά μπορείτε να ανοίξετε ένα τερματικό στο pc σας και να δώσετε \"info flex\" [\[εικόνα\]](/34/img/flexINFO.png). Πατώντας το πλήκτρο space μπορείτε να διαβάσετε
όλο το manual από την αρχή μέχρι το τέλος. Με τα πλήκτρα (p)revious, (n)ext kai (u)p μπορείτε να περιπλανηθείτε στους κόμβους του. Μπορείτε επίσης να φορτώσετε
τον Emacs 21+ και με Ctrl-h i ή από το μενού \"Help-\>manuals-\>Browse manuals with info\" να δείτε όλα τα manuals που έχετε στο σύστημα σας σε texinfo format
(το ίδιο γίνεται και αν γράψετε σκέτο \"info\" στην γραμμή εντολών). Μόλις πάτε στο manual του flex ισχύουν τα ίδια keyboard shortcuts. Επίσης έχετε όμορφα
κουμπιά στην toolbar, ενώ μπορείτε να κάνετε και μεσαίο κλικ στα links που βλέπετε [\[εικόνα\]](/34/img/flexEMACS.png).
Αν επιθυμείτε κάτι πιο συμβατικό μπείτε στο [gnu.org (manuals section)](http://www.gnu.org/manual/manual.html) όπου μπορείτε είτε να κατεβάσετε ολόκληρο το
manual σε Postscript μορφή [σε Postscript μορφή](http://www.gnu.org/manual/flex-2.5.4/ps/flex.ps.gz) για να το τυπώσετε ή μπορείτε να το διαβάσετε Online σε
απλή και γρήγορη [HTML μορφή](http://www.gnu.org/manual/flex-2.5.4/html_node/flex_toc.html)
Τέλος ακόμα και αν έχετε GNOME η KDE βάζοντας info://foo στην γραμμή διεύθυνσης, μπορείτε να δείτε τα infopages της εφαρμογής foo. (Αν και νομίζω ότι στις
τελευταίες εκδόσεις KDE και GNOME υπάρχει στο help ξεχωριστή επιλογή \"browse info pages\" όπου βρίσκονται όλα τα manuals του συστήματος.)
Τώρα πια θα πρέπει να έχετε αναγνωρίσει την άνεση που προσφέρει το texinfo. Browsing σε κονσόλα χρήσιμο για τους servers σας, ενσωμάτωση με τον emacs, γνώριμη
html μορφή και υψηλής ποιότητας manual έτοιμο για εκτύπωση. Ταχύτητα, ευχρηστία και συμβατότητα. Και όπως προφανώς καταλάβατε τα πάντα βγαίνουν από ένα αρχείο
που γράφετε μία φορά και μετά με τα διάφορα εργαλεία το μετατρέπετε σε ότι μορφή θέλετε.
### [4. texinfo vs manpages]{#s4}
Λυπάμαι που θα απογοητεύσω όλους τους hard-core unixάδες, αλλά το επίσημο documentation format σύμφωνα με την GNU είναι το texinfo και όχι οι manpages. Μία
manpage είναι αρκετή για μικρά προγράμματα, από κάποιο σημείο και μετά όμως τα πράγματα δυσκολεύουν.
Το γεγονός ότι μία manpage στερείται δομής, την κάνει δύσχρηστη. Πόσες φορές δεν έχετε εκνευρισθεί όταν ψάχνετε μία παράμετρο σε μία manpage και έχετε βρει όλες
τις άλλες εκτός από αυτήν που χρειάζεστε;Κατά την γνώμη μου μία manpage πρέπει να έχει απλά μια μικρή περιγραφή του προγράμματος.
Έτσι σήμερα είναι δυνατόν να βρείτε προγράμματα που διαθέτουν infopages αλλά όχι manpages. Άλλες φορές μάλιστα υπάρχει manpage η οποία όμως απλά αναφέρει \"see
the info pages for the full documentation\" η κάτι παρόμοιο.
Μπορεί λοιπόν οι manpages να ήταν αρκετές το 1980, σήμερα όμως έχετε την δυνατότητα να έχετε και δομημένο και εύκολα αναγνώσιμο documentation,οπότε γιατί να μην
το χρησιμοποιήσετε;
### [5. Η φιλοσοφία του texinfo]{#s5}
Το texinfo ως σύστημα βασίζεται πάνω στο Tex/Latex. Γράφετε ένα απλό αρχείο κειμένου lala.texi με ειδική σύνταξη (τα @-commands) και μετά με την εντολή texi2foo
παίρνετε το lala.foo όπου foo μέχρι τώρα μπορεί να είναι html/dvi/pdf. Υπάρχει και εντολή makeinfo με διάφορες παραμέτρους για την παραγωγή των info αρχείων.
Αυτό όμως δεν πρέπει να σας φοβίζει αν δεν γνωρίζετε το Latex. (Αν και κάποια στιγμή πρέπει να μάθετε και Latex :-). Το Texinfo είναι ένα επίπεδο πιο πάνω από
το Latex. Αυτό σημαίνει ότι αποκρύπτει από εσάς τα \\verylongandcomplicatedLatexdirectives και σας επιτρέπει να γράψετε το κείμενο σας με μικρά \@commands
δηλαδή εντολές/keywords που απλά ξεκινάνε με το @. Τα \@commands είναι όλα documented στο manual του texinfo το οποίο είναι γραμμένο επίσης σε (μαντέψτε!)
texinfo. Έτσι υπάρχει το \@chapter, \@section ,\@code, \@itemize με απλά και κατανοητά ονόματα. Αν μάλιστα χρησιμοποιείτε emacs θα βρείτε ότι η συγγραφή texinfo
αρχείων με το αντίστοιχο mode είναι πραγματικά πολύ εύκολη.
H μαγεία είναι ότι μπορείτε να χρησιμοποιήσετε ακόμα τις εντολές του Latex αν το επιθυμείτε (κυρίως για τα εκτυπώσιμα outputs). Μάλιστα μπορείτε να γράψετε
διαφορετικά τμήματα για την περίπτωση που το texinfo αρχείο μετάφράζεται σε tex, html ή info. (Περίπου σαν τα \#ifdef του C-preprocessor).
Παρόλο που το texinfo διαθέτει την εντολή \@image για την εισαγωγή εικόνων σε ένα έγγραφο, δεν θα πρέπει να την χρησιμοποιήσετε (στην αρχή τουλάχιστον). Και
αυτό γιατί η εικόνα δεν θα φαίνεται στο info output του αρχείου σας οπότε \"χάνεται\" η συμβατότητα του texinfo, για την οποία το διαλέξατε. Δηλαδή το texinfo
τεχνικά μπορεί να χειριστεί εικόνες (αφού μπορεί το Latex).
### [6. To πιο απλό Texinfo αρχείο]{#s6}
Ας ξεκινήσουμε με το πιο μικρό texinfo αρχείο(σχεδόν). Στον αγαπημένο σας editor γράψτε τα παρακάτω: (σε emacs και gvim θα έχετε και syntax highlighting)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
\input texinfo
@setfilename example.texi
@settitle example
@bye
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αφού το αποθηκεύσετε με όνομα sample.texi δοκιμάστε με τις εντολές texi2dvi,texi2html,texi2pdf και makeinfo να το μετατρέψετε στα αντίστοιχα format. (To dvi
αρχείο μπορείτε να το δείτε με την εντολή xdvi. Τα dvi αρχεία είναι μια ενδιάμεση μορφή του tex.Μπορείτε να τα κάνετε Postscript με την εντολή dvips). Τo .info
αρχείο μπορείτε να το δείτε με την εντολή info ./example.info.
H πρώτη γραμμή είναι η μοναδική εντολή σε ένα texinfo αρχείο που δεν ξεκινάει με @. Και αυτό γιατί φορτώνει το texinfo.tex το οποίο περιέχει τα defines/macros
που ενεργοποιούν τις ίδιες τις @-εντολές. Η επόμενη γραμμή ορίζει το όνομα του αρχείου που γράφετε (το οποίο προφανώς θα πρέπει να είναι ίδιο με του αρχείου που
την περιέχει).
Η \@settitle δίνει έναν γενικό τίτλο στο manual σας, και η τελευταία εντολή δείχνει που σταματάει η επεξεργασία (processing) του κειμένου. Οτιδήποτε μετά το
\@bye αγνοείται από το Texinfo.
Παρατηρείστε αυτό που ανέφερα παραπάνω σχετικά με την απλότητα του Texinfo. Οι @-εντολές έχουν μικρά και κατανοητά ονόματα, κάτι που δεν συμβαίνει με το Latex.
### [7. Ένα μεγαλύτερο έγγραφο]{#s7}
Ας δούμε ένα μεγαλύτερο παράδειγμα. Σε ένα νέο αρχείο γράψτε τα παρακάτω.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
\input texinfo
@setfilename sample.info
@settitle A sample manual
@setchapternewpage odd
@titlepage
@title My first Texinfo manual
@subtitle Demo for Magaz
@author Kapelonis Kostis
@comment This is a comment
@page
@vskip 11pt plus 1fill1
Copyright @copyright{} 2002
@end titlepage
@comment name,next,prev,up
@node Top,First Chapter,,(dir)
@menu
* First Chapter:: The first chapter is the only chapter in this sample
* Concept Index:: This index has two entries
@end menu
@node First Chapter,Concept Index,Top,Top
@chapter First Chapter
@cindex Sample index entry
These are the contents of the first chapter
Here is a simple line of text.
@cindex Another sample index entry
Here is a numbered list
@enumerate
@item
This is the first item
@item
This is the second item
@end enumerate
@iftex
This paragraph should
appear only in a printed manual.
It is enclosed inside iftex keywords.
@end iftex
@ifinfo
This paragraph should
appear only in the info manual.
It is enclosed inside ifinfo keywords.
@end ifinfo
The @command{makeinfo} command will convert this manual
into an info file and @TeX{} to a printed file.
@node Concept Index ,,First Chapter,Top
@unnumbered Concept Index
@printindex cp
@comment Place here table of contents
@contents
@bye
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Εδώ βλέπουμε αρκετές \@εντολές. Δεν θα τις αναφέρω όλες, για τις λεπτομέρειες δείτε το manual του texinfo. Οι γνώστες του Latex ήδη θα έχουν δει πως το texinfo
\"καλύπτει\" με τις δικές του \@εντολές τις αντίστοιχες του Latex.
Το παράδειγμα δείχνει τις εντολές για την δημιουργία indexing, την \@menu για την δημιουργία μενού για το browsing μέσα σε Info αρχείου, καθώς και την πολύ
σημαντική εντολή \@node. H εντολή \@vskip υπάρχει για να δείξει ότι δεν έχει χαθεί η ευελιξία που διαθέτει το Tex/Latex.
Ένα node (κόμβος στα ελληνικά) είναι το μικρότερο δομικό στοιχείο ενός info αρχείου. Όταν πατήσατε previous,next και up στο manual του flex, ουσιαστικά
μετακινηθήκατε στα αντίστοιχα nodes. Κάθε info αρχείο \"κρέμεται\" από έναν top node που είναι ο αρχικός κόμβος του αντίστοιχου manual. Όλοι οι top nodes από τα
manuals που έχετε στο σύστημα σας \"κρέμονται\" από έναν top node(supernode) του συνολικού info tree. Αν γράψετε σκέτο info σε ένα τερματικό (χωρίς όνομα manual
δηλαδή) βλέπετε αυτόν τον supernode και άρα έχετε μπροστά σας όλα τα manual που έχετε εγκατεστημένα. To ίδιο συμβαίνει και όταν μπαίνετε στο info mode του
Emacs.
Πρακτικά αυτό σημαίνει ότι τελικά θα πρέπει να χωρίσετε το κείμενο σας σε nodes. Τα \@chapter και \@section δεν είναι αυτά που καθορίζουν την δομή του online
manual. Όπως είδατε και στην σελίδα [της GNU για τον flex](http://www.gnu.org/manual/flex-2.5.4/flex.html) ειδικά η html μορφή είναι δυνατόν να κατασκευαστεί με
διάφορους τρόπους ανάλογα με τα nodes/chapters. Αυτή είναι και μια μεγάλη διαφορά που ίσως δυσκολέψει όσους \"σκέφτονται\" σε Latex. (Αναφέρομαι πάντα στο .info
output που είναι browsable. Για ps/pdf ισχύουν τα γνωστά, δηλαδή το texinfo είναι ένα πιο φιλικό tex. Αν γράψετε ένα manual και ξέρετε από πριν ότι θα το
βγάλετε μόνο σε pdf δεν χρειάζεται να δώσετε σημασία σε \@node και \@menu).
To \@node command συντάσσεται ως εξής:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
@node όνομα,όνομα-επόμενου,όνομα-προηγούμενου,όνομα-πατρικού.
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Μία από τις πρώτες δυσκολίες που θα συναντήσετε κάθε φορά που γράφετε ένα καινούριο node,είναι να συμπληρώσετε τα παραπάνω ονόματα. Αν γράφετε σε Emacs υπάρχει
βέβαια έτοιμη εντολή που απλοποιεί τα πράγματα. Στην αμέσως επόμενη γραμμή βάλτε ένα \"συμβατικό\" δομικό \@command (π.χ. \@chapter, \@section) για τα outputs
se html/ps/pdf.
Τo \@menu ορίζει το μενού που θα φαίνεται στην κάτω μεριά του node που βρίσκεται ο χρήστης. Συνήθως περιέχουν pointers σε άλλα nodes του ίδιου manual. Το
supernode (μετά από ένα εισαγωγικό κείμενο) δεν είναι παρά ένα μεγάλο μενού με όλα τα manuals του συστήματος. Οι λεπτομέρειες αφήνονται ως άσκηση στον αναγνώστη
(Βασικά δεν έχω ασχοληθεί πολύ με μενού ;-)
Τα outputs του παραπάνω αρχείου είναι τα παρακάτω [\[PDF screenshot\]](/34/img/samplePDF.png) [\[HTML screenshot\]](/34/img/sampleHTML.png) [\[INFO
screenshot\]](/34/img/sampleINFO.png)
### [8. Συγγραφή του κυρίως κειμένου.]{#s8}
Κατά τα άλλα, απλά γράφετε στο body του κειμένου, το τι ακριβώς κάνει το πρόγραμμα σας, ποιες παραμέτρους παίρνει και τι έξοδο πρέπει να περιμένει ο χρήστης.
Έχετε ανοιγμένο και το manual του texinfo για να βλέπετε τα διάφορα \@commands και την χρήση τους. Θα δείτε ότι το texinfo διαθέτει αρκετά \@commands ειδικά για
το documentation προγραμμάτων (σε αντίθεση με το Latex που έχει δώσει μεγαλύτερο βάρος στο επιστημονικό/μαθηματικό κείμενο).
Υπάρχουν τα \@key για keyboard input, τα \@env για environment variables, τα \@file για ονόματα αρχείων, και διάφορα άλλα \@commands που ανάλογα με την
περίπτωση μπορεί να σας φανούν πολύ χρήσιμα. Αυτά τα \@commands καθορίζουν απλά την εμφάνιση του κειμένου πάνω στο οποίο εφαρμόζονται και όχι την δομή του.
Προφανώς έχουν περισσότερη σημασία στο τυπωμένο manual αφού η html έχει λίγα tags μορφοποίησης κειμένου, και σχεδόν μηδαμινή στο περιβάλλον κονσόλας.
Επίσης υπάρχουν όλα τα αναμενόμενα \@commands για list,bullets, subsection,verbatim text,code κ.τ.λ. Όλα βρίσκονται μέσα στο manual του texinfo με παραδείγματα.
Όπως ίσως έχετε υποψιαστεί για να βάλετε το ίδιο το \"@\" μέσα στο κείμενο το γράφετε δύο φορές δηλαδή \"@@\". Υπάρχει και ειδικό \@command με όνομα \@email.
### [9. Emacs shortcuts]{#s9}
Αφού το texinfo είναι μέρος της Gnu tool chain (Emacs,gcc,make,gdb, [m4](http://www.gnu.org/software/m4/) ,automake,autoconf,
[gprof](http://sources.redhat.com/binutils/docs-2.12/gprof.info/)) δεν ήταν δυνατόν να μην συνεργάζεται άψογα με τον Emacs.
Έτσι λοιπόν υπάρχει ειδικό Texinfo mode το οποίο διαθέτει πολύ συχνά χρησιμοποιούμενα short commands (Ctrl-c) και λιγότερο συχνά long commands (Meta/Alt-x)
Αναφέρω εδώ μερικά:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
C-c C-c n Enter node
C-c C-c e Enter end
C-c C-c i Enter item
C-c C-c v Enter variable
C-c C-s Show structure
C-c C-u C-m update Menu
C-c C-u C-n update Node
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αυτά που πραγματικά σας λύνουν τα χέρια είναι οι εντολές για την εισαγωγή ενός νέου node,αφού συμπληρώνονται αυτόματα τα next,prev, up καθώς και η εντολή που
ανοίγει ένα νέο buffer με την δομή του texinfo αρχείου όπου μπορείτε να καταλάβετε οπτικά πως είναι αυτή.
Γενικά, ακόμα και αν είστε φανατικός χρήστης του vi/vim/gvim σας προτείνω να ασχοληθείτε λίγο με τον Emacs κατά την συγγραφή texinfo αρχείων. Είναι πολύ
χρήσιμος, ενώ για πολύ μεγάλα manuals με περίπλοκη δομή/μενού και cross references σχεδόν απαραίτητος.
### [10. Επίλογος]{#s10}
Ξέρω ότι έδωσα λιγότερες τεχνικές λεπτομέρειες από όσες ίσως θα θέλατε. Δεν αναφέρθηκα στην δημιουργία indexing/table of contents ,cross-references,table και
διάφορων άλλων δυνατοτήτων του Texinfo. Υπάρχει και η πολύ εντυπωσιακή δυνατότητα της δημιουργίας link σε εντελώς διαφορετικό manual, όπου μεταφέρεται αυτόματα
ο χρήστης, όταν χρησιμοποιεί το info format.
Έτσι είναι δυνατόν ο χρηστής να διαβάζει το manual του flex μέσα στον Emacs και με ένα κλικ να βρεθεί σε αυτό του bison. Η από αυτό του automake να μεταφερθεί
σε αυτό του autoconf και μόλις δει αυτό που θέλει, να επιστρέψει. Σε html και τυπωμένα manual τέτοια links γίνονται απλά \"See the bison manual page 33\" ή κάτι
τέτοιο, και πάλι όμως είναι εντυπωσιακή η αυτόματη εισαγωγή τους, αφού εσείς μέσα στο texinfo αρχείο απλά βάζετε το όνομα του manual που θα μεταφερθεί ο χρήστης
καθώς και το όνομα του node στο οποίο θα γίνει η μεταφορά.
Νομίζω όμως ότι ο σκοπός των άρθρων του magaz δεν είναι να σας πάρουν από το χεράκι και να σας δείξουν βήμα-βήμα τις οδηγίες χρήσης. Οφείλετε απλά να δείτε τι
υπάρχει διαθέσιμο και αν κάτι σας φαίνεται χρήσιμο να ασχοληθείτε μαζί του.

686
content/articles/34/03_security.md Κανονικό αρχείο

@ -0,0 +1,686 @@
+++
title = 'Host/network security'
date = '2003-06-01T00:00:00Z'
description = ''
author = 'Αλέξανδρος Παπαδόπουλος apapadop@cmu.edu(mailto:apapadop+magaz@cmu.edu)'
issue = ['Magaz 34']
issue_weight = 3
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Βήματα για να ασφαλίσουμε το GNU/Linux σύστημά μας έναντι τοπικών και δικτυακών επιθέσεων. Ίσως πούμε δυο λογάκια και για θέματα privacy.*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Τοπική ασφάλεια (Local Access)**
----------------------------------------------------------------
- [1.1 sXid binaries](#ss1.1)
- [1.2 Password cracking](#ss1.2)
- [1.3 Φυσική πρόσβαση](#ss1.3)
**2. Δικτυακή ασφάλεια**
---------------------------------------------------
- [2.1 Επιθέσεις Denial of Service (DoS)](#ss2.1)
- [2.2 Network Visibility](#ss2.2)
- [2.3 Firewalls](#ss2.3)
**3. Privacy**
-----------------------------------------
- [3.1 Διαφημίσεις (banner ads)](#ss3.1)
- [3.2 Cookies](#ss3.2)
- [3.3 Web bugs](#ss3.3)
### [1. Τοπική ασφάλεια (Local Access)]{#s1}
Με αυτό τον όρο εννοούμε τα μέτρα που πρέπει να πάρουμε ώστε κάποιος χρήστης που έχει πρόσβαση στον υπολογιστή μας (είτε φυσική πρόσβαση, είτε user account), να
μη μπορεί να αποκτήσει τον έλεγχο του συστήματος (root access).
### [1.1 sXid binaries]{#ss1.1}
Ιδιαίτερα επικίνδυνα για αυτό το σκοπό είναι τα suid root binaries. Δηλαδή τα προγράμματα που, ασχέτως του χρήστη που τα καλεί, εκτελούνται πάντα σαν να τα είχε
καλέσει ο root. Ο αριθμός των suid root binaries σε ένα σύστημα είναι ένα νούμερο που θέλουμε να το κρατήσουμε όσο το δυνατό μικρότερο, και να ελέγχουμε τακτικά
οποιαδήποτε αλλαγή. Μια ατέλεια στον κώδικα ενός εκτελέσιμου προγράμματος αρκεί για να γίνει ένα [buffer
overflow](http://www.wikipedia.org/wiki/buffer_overflow), το οποίο, σε suid root binaries, σημαίνει root shell, δηλαδή πλήρη έλεγχο του συστήματος.
Αν λοιπόν έχουμε μετρήσει όλα τα suid root binaries και ξέρουμε ότι είναι 25 στο σύστημά μας, και μετά από λίγο καιρό ελέγξουμε και βρούμε 26, πρέπει να
εξετάσουμε πολύ προσεχτικά αυτό το 26ο πρόγραμμα και να σιγουρευτούμε ότι είναι κάτι που εμείς εγκαταστήσαμε.
Για μια λίστα με τα setuid και setgid αρχεία στο σύστημά μας, κάνουμε το εξής:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
# find / \( -perm -02000 -o -perm -04000 \) -ls > setXid
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Κατόπιν μπορούμε να μετρήσουμε τις γραμμές αυτού του αρχείου, και έτσι να ξέρουμε πόσα τέτοια (setXid) ειδικά αρχεία έχουμε:
# wc -l setXid
Είναι καλή ιδέα να ελέγχουμε περιοδικά το πλήθος αυτών των ειδικών αρχείων και να εντοπίζουμε τυχόν διαφορές.
### [1.2 Password cracking]{#ss1.2}
Ακόμα και αν κάποιος καταφέρει να αποκτήσει τοπική πρόσβαση στο σύστημά μας, με κάποιον υπάρχοντα λογαριασμό, έχουμε χάσει μόνο τη μάχη, αλλά όχι απαραιτήτως
τον πόλεμο. Για να μην τραβήξει την προσοχή, ο επιτιθέμενος θα προσπαθήσει να μάθει όλα τα συνθηματικά (passwords) των χρηστών του συστήματος, χωρίς να τα
αλλάξει. Ακόμα και αν κάποιος έχει root access στο μηχάνημά σας, πρέπει να είναι ιδιαίτερα προσεχτικός για να μην τον ανακαλύψετε. Οπότε, παρόλο που ο root
μπορεί να αλλάξει οποιοδήποτε password και να προσθέσει οποιονδήποτε λογαριασμό, η καλύτερη μέθοδος είναι να ξέρει κανείς όλα τα υπάρχοντα συνθηματικά, και να
τα χρησιμοποιεί όποτε χρειάζεται πρόσβαση.
Έχοντας root, ή έχοντας καταφέρει να διαβάσει το αρχείο /etc/shadow με κάποιο άλλο τρόπο, ο επιτιθέμενος θα προσπαθήσει να μάθει όλα τα συνθηματικά που
βρίσκονται σε αυτό το αρχείο. Αν τα συνθηματικά ακολουθούν τους κανόνες των δυνατών passwords, κάτι τέτοιο θα είναι από πολύ δύσκολο έως πρακτικά αδύνατο.
Ο καλύτερος τρόπος για να διαπιστώσετε πόσο ισχυρά είναι τα συνθηματικά που χρησιμοποιούνται στο σύστημά σας, είναι να προσπαθήσετε να τα \"σπάσετε\" (crack)
μόνοι σας. Χρησιμοποιώντας το καλύτερο password cracker για συστήματα UNIX [(John the Ripper)](http://www.openwall.com%20john/), θα μάθετε αν το συνθηματικό σας
θα αντέξει σε τέτοιου είδους επιθέσεις.
Η χρήση του John είναι πολύ απλή: Αφού κατεβάσετε το tarball (\*.tar.gz), το κάνετε extract (tar xvfz \*.tar.gz), μπαίνετε στον κατάλογο john-1.x/src/ και
δίνετε ένα
$ make
Αυτό θα σας πει τις επιλογές που έχετε, και θα διαλέξετε την πιο κατάλληλη για το σύστημά σας. Μόλις τελειώσει το compile, μπείτε στον κατάλογο john-1.x/run/
και:
# ./unshadow /etc/passwd /etc/shadow > passwords
$ ./john passwords
Ο John θέλει λίγα δευτερόλεπτα για να μαντέψει τα τελείως ελεεινά συνθηματικά (όμοια με το όνομα χρήστη, κάτω από 4 χαρακτήρες, λέξεις λεξικού), αλλά μπορεί να
τρέχει επί εβδομάδες χωρίς να μπορεί να βρει ένα δυνατό password 8 χαρακτήρων.
Καλά συνθηματικά είναι αυτά που έχουν τα εξής στοιχεία:
- Έχουν τουλάχιστον 6 χαρακτήρες
- Περιέχουν τουλάχιστον έναν χαρακτήρα από τις εξής κατηγορίες:
- Kεφαλαία (A-Z)
- Πεζά (a-z)
- Aριθμούς (0-9)
- Eιδικούς χαρακτήρες (!, @, \#, %, : κτλ.)
- Δεν συνδέονται με κάτι που μπορεί να μαντέψει ο επιτιθέμενος αν σας γνωρίζει προσωπικά (ημερομηνία γέννησης, όνομα συγγενή κτλ)
- Είναι αρκετά εύκολα να τα θυμάστε εσείς και να τα πληκτρολογείτε ώστε να μη σας σπάνε τα νεύρα! Δε λέω, καλό συνθηματικό το **kj%{8\*\#I**, αλλά δεν
πρόκειται να το θυμάμαι για πάνω από 2 λεπτά, **ή** (ακόμα χειρότερα), άπαξ και το μάθω δεν θα θέλω να το αλλάξω ποτέ επειδή είναι το πλέον uncrackable
συνθηματικό. Αυτή είναι εξίσου κακή πρακτική με το να έχετε πολύ εύκολα συνθηματικά, επειδή αν κάποιος καταφέρει να κλέψει αυτό το συνθηματικό
παρακολουθώντας το δίκτυο, πχ, θα έχει αιώνια πρόσβαση στο μηχάνημά σας.
- Δεν είναι λέξη σε οποιαδήποτε γλώσσα! Αν νομίζετε ότι ένα συνθηματικό σε Σουαχίλι ή από κάποιον επιστημονικό κλάδο σας σώζει, ρίξτε μια ματιά στις
[λίστες](ftp://ftp.ox.ac.uk/pub/wordlists/) που κυκλοφορούν.
Μια καλή πρακτική είναι να δημιουργούμε συνθηματικά από χαρακτήρες φράσεων που μπορούμε να τις θυμηθούμε εύκολα, αλλά αν δεν ξέρει κάποιος την φράση, το
συνθηματικό να μην έχει κανένα νόημα. Παράδειγμα: Ας πούμε ότι το αγαπημένο σας τραγούδι είναι το \"Welcome to the machine\" των Pink Floyd. Από τους πρώτους
χαρακτήρες κάθε λέξης, βγάζουμε το εξής: Wttm\_PF, που δεν είναι καθόλου άσχημο, αλλά δεν σέβεται όλους τους κανόνες ενός καλού συνθηματικού. Οπότε
αντικαθιστούμε μερικούς χαρακτήρες με αριθμούς σε \"leet-speak lingo\": **W11m-PF** και ιδού!
### [1.3 Φυσική πρόσβαση]{#ss1.3}
Για να προστατέψουμε τον υπολογιστή μας από επιθέσεις με φυσική πρόσβαση, όπου ο χρήστης κάθεται στο πληκτρολόγιο, χρειαζόμαστε πολλά και διάφορα. Ο γενικός
κανόνας είναι ότι \"φυσική πρόσβαση = root πρόσβαση\", για τους εξής λόγους:
Ας πούμε ότι αφήνουμε τον υπολογιστή μας και πεταγόμαστε στο διπλανό δωμάτιο για μερικά λεπτά. Αν κάποιος θέλει να αποκτήσει πρόσβαση στον υπολογιστή μας,
μπορεί απλά να κάτσει στο πληκτρολόγιο και να ψάξει για τυχόν root logins που έχουμε αφήσει ενεργά. Λύση: ΠΟΤΕ μην αφήνετε root logins ενεργά χωρίς πολύ καλό
λόγο. Αν χρειάζεται να τρέχει κάτι σαν root για μεγάλα χρονικά διαστήματα, μπορείτε να το καλέσετε με έναν τρόπο που να κάνει logout μόλις τερματιστεί η
εργασία. Παράδειγμα:
# tail -f /var/log/messages ; logout
Με αυτή τη γραμμή, μπορείτε να αφήσετε ένα root terminal με σχετική ασφάλεια, επειδή αν κάποιος διακόψει την εργασία με CTRL+C, εκτελείται αμέσως το logout και
χάνεται το root shell.
Αλλά ακόμα και η πρόσβαση σαν κανονικός χρήστης μπορεί να είναι καταστροφική. Πχ, μπορεί κάποιος να σβήσει/διαβάσει/διαφθείρει όλα τα προσωπικά σας αρχεία, να
στείλει email με το όνομά σας και άλλα δυσάρεστα. Μια λύση είναι όταν δουλεύετε στο γραφικό περιβάλλον να κλειδώνετε το τερματικό πριν φύγετε από το
πληκτρολόγιο (όλοι οι μοντέρνοι window managers μπορούν να καλέσουν το xlock που κάνει ακριβώς αυτή τη δουλειά).
Τι γίνεται όμως αν κάποιος πατήσει απλά CTRL+ALT+Backspace και \"σκοτώσει\" το γραφικό περιβάλλον; Δεν θα μείνει με ένα shell του χρήστη μας;
Δεν είναι απαραίτητο. Για να αποφύγουμε αυτό το πρόβλημα μπορούμε να προσθέσουμε ένα alias στο .bashrc μας, που να θέτει:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
alias startx="startx -- -nolisten tcp; logout"
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Έτσι, με το που τερματίσουμε με οποιοδήποτε τρόπο το X session μας, ο χρήστης μας κάνει αυτόματα logout. Για τη σημασία του **\"-nolisten tcp\"** θα μιλήσουμε
παρακάτω.
Όμως ακόμα και αν ο επιτιθέμενος δεν βρει έτοιμο prompt στο μηχάνημά μας, δεν μπορεί να το εκμεταλλευτεί; Σίγουρα, αν έχουμε \"ευκολίες\" όπως automount και
autoexec στο CDROM. Μια δυσάρεστη έκπληξη που είχα σε ένα φρεσκο-εγκατεστημένο σύστημα ήταν όταν έβαλα ένα δισκάκι στο CD drive και μετά από λίγα δευτερόλεπτα
είδα τον Mozilla να ανοίγει ένα παράθυρο και να μου δείχνει την \"αρχική σελίδα\" του CD, παίζοντας περιχαρώς **μουσική**! Τι θα γινόταν αν αυτό το CD είχε
κώδικα με περίεργες προθέσεις, που περίμενε την αρχική σελίδα (index.html) για να ενεργοποιηθεί;
Για να αποφύγουμε τέτοιες εκπλήξεις καλό είναι να απενεργοποιήσουμε οποιοδήποτε automount και να σιγουρευτούμε ότι το mount γίνεται με ασφαλείς παραμέτρους.
Μερικές χρήσιμες παράμετροι είναι oι noexec, nosuid. Ρίξτε μια ματιά στο man mount για περισσότερα.
Αλλά και πάλι, αν κάποιος μπορεί να επανεκκινήσει τον υπολογιστή, μπορεί να επιλέξει από τον boot loader (LILO, GRUB ή οτιδήποτε άλλο χρησιμοποιούμε) να κάνει
boot σε single mode, όπου έχει πλήρη έλεγχο του συστήματος. Για να αποκλείσουμε και αυτή την πιθανότητα, μπορούμε να βάλουμε έναν κωδικό στον boot loader. Έτσι,
μόνο όποιος ξέρει τον κωδικό μπορεί να ξεκινήσει το σύστημα. Αυτό επιτυγχάνεται στα αρχεία /etc/lilo.conf και /etc/grub.conf (για τους δύο πιο δημοφιλείς boot
loaders).
Όμως ποιος τα χρειάζεται όλα αυτά, όταν υπάρχει το [KNOPPIX](http://www.knopper.net/knoppix/index-en.html); Απλά κάνουμε ένα reboot τον υπολογιστή, βάζουμε το
δισκάκι στο drive, παρακάμπτουμε ό,τι είδους ασφάλεια υπάρχει, και κάνουμε mount τον δίσκο του θύματος με πλήρη δικαιώματα! Εύκολο; Όχι τόσο γρήγορα. Γι\'αυτό
υπάρχουν τα [BIOS](http://www.webopedia.com/TERM/B/BIOS.html) passwords, που ζητούν τον κωδικό του χρήστη πριν επιτρέψουν σε κάποιον να αλλάξει τη συνηθισμένη
σειρά εκκίνησης και να κάνει boot από CD ή δισκέτα.
Αλλά αν έχετε laptop πχ, και ο \"κακός\" μπορεί να βουτήξει απλά ολόκληρο το laptop ή να βγάλει στο πι και φι τον δίσκο και να τον πάρει μαζί του; Αυτή είναι
μάλλον η χειρότερη περίπτωση, και το μόνο που μας σώζει είναι κάποιο encrypted filesystem, που δεν επιτρέπει στον δίσκο να διαβαστεί από κάποιον που δεν έχει το
κατάλληλο λογισμικό και δεν ξέρει το σωστό συνθηματικό (pass-phrase) για να τον αποκωδικοποιήσει. Επειδή δεν έχω εμπειρία σε κάτι τέτοιο, θα σας προτείνω απλά
να κωδικοποιείτε με το [Gnu Privacy Guard (GPG)](http://gnupg.org) οτιδήποτε δεν θέλετε να πέσει με τίποτα σε λάθος χέρια.
Δεν είναι καθόλου δύσκολο! Αν έχετε ήδη [δημιουργήσει τα κλειδιά](http://andrew.cmu.edu/~apapadop/linux/howto.html#3.3.7) σας και μπορείτε να χρησιμοποιήσετε το
gpg, μπορείτε να μαζέψετε όλα τα ευαίσθητα αρχεία σας σε έναν κατάλογο (ας πούμε secret/). Με ένα
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ tar -cf secret.tar secret
----------------------------------------------------------------------------------------------------------------------------------------------------------------
δημιουργείτε ένα αρχείο που περιέχει ολόκληρο τον κατάλογο secret. Μετά μπορείτε να κωδικοποιήσετε (encrypt) το αρχείο αυτό με το προσωπικό σας κλειδί, ώστε
μόνο εσείς να μπορείτε να το αποκωδικοποιήσετε στο μέλλον:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ gpg -esr apapadop@cmu.edu secret.tar
----------------------------------------------------------------------------------------------------------------------------------------------------------------
(αντικαταστήστε το email μου με το email που αντιστοιχεί στο προσωπικό κλειδί σας) Αυτή η εντολή θα έχει σαν αποτέλεσμα ένα αρχείο secret.tar.gpg που θα
μπορείτε μόνο εσείς να το διαβάσετε. Μπορείτε να ελέγξετε αν το σύστημα δουλεύει σωστά με τις εξής εντολές:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ gpg -d -o test.tar secret.tar.gpg
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αυτή η εντολή θα αποκωδικοποιήσει το αρχείο και θα το σώσει σαν test.tar. Για να δοκιμάσουμε αν έχει την παραμικρή διαφορά από το αυθεντικό αρχείο που έχει τα
ευαίσθητα περιεχόμενα, δίνουμε
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ md5sum test.tar secret.tar
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αν το αποτέλεσμα δεν είναι ακριβώς το ίδιο, κάτι δεν πήγε καλά. Αν το checksum όμως είναι το ίδιο, μπορούμε να σβήσουμε τον κατάλογο με τα ευαίσθητα αρχεία
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ rm -r secret/
----------------------------------------------------------------------------------------------------------------------------------------------------------------
και να αποκρυπτογραφήσουμε/αποσυμπιέσουμε ξανά τα περιεχόμενά του όποτε τα χρειαστούμε με τις εντολές
----------------------------------------------------------------------------------------------------------------------------------------------------------------
$ gpg -d -o secret.tar secret.tar.gpg
$ tar xvf secret.tar
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αν τα παραπάνω σας φαίνονται υπερβολικά, θυμηθείτε ότι υπάρχουν εργαστήρια που διαβάζουν δεδομένα χωρίς κανένα πρόβλημα από [καμένους
υπολογιστές](http://www.datarr.com/tfds.html), συσκευές που [διαβάζουν οθόνες πίσω από τοίχους](http://www.sans.org/rr%20encryption/TEMPEST.php) και κυβερνήσεις
που θεωρούν σκόπιμο το [ψήσιμο](http://treachery.net/~jdyson/dod_cd_declassification.html) των CD που θέλουν να αποσύρουν\...
### [2. Δικτυακή ασφάλεια]{#s2}
Σε αυτή την ενότητα θα εξετάσουμε τις επιθέσεις DOS και τα μέτρα που μπορούμε να πάρουμε για να αμυνθούμε. Κατόπιν θα αναφέρουμε διάφορες βασικές αρχές για τις
δικτυακές σας περιπέτειες, που (ελπίζω) θα σας γλιτώσουν από πολλές δυσάρεστες γνωριμίες\...
### [2.1 Επιθέσεις Denial of Service (DoS)]{#ss2.1}
[Αυτές οι επιθέσεις](http://www.wikipedia.org/wiki%20Denial_of_service) έχουν σαν σκοπό τους να μην επιτρέψουν στο σύστημά μας να επιτελέσει τον στόχο του.
Δηλαδή, αν έχουμε κάποιον server που παρέχει υπηρεσίες email για μια εταιρεία, ο σκοπός της επίθεσης DoS είναι να μη μπορεί πλέον ο συγκεκριμένος server να
παρέχει αυτές τις υπηρεσίες. Οι επιθέσεις αυτές είναι ή μέρος μιας ιδιαίτερα συντονισμένης και μελετημένης επίθεσης (οπότε δε μας σώζει τίποτα), ή το τελευταίο
στάδιο της απογοήτευσης για έναν φιλόδοξο επιτιθέμενο που δεν μπορεί να μπει στο σύστημά μας και απλά καταφεύγει στην επίδειξη δύναμης, προσπαθώντας να μας
\"πετάξει έξω από το δίκτυο\".
Υπάρχουν πολλές περιπτώσεις στις οποίες επιθέσεις DoS έχουν χρησιμοποιηθεί για να επιτευχθεί κάποιος άλλος σκοπός. Παράδειγμα: Ο επιτιθέμενος καταφέρνει
προσωρινό DoS ενός SSH server για 10 κρίσιμα λεπτά. Σε αυτά τα 10 λεπτά, κάποιος νόμιμος χρήστης προσπαθεί να συνδεθεί στον SSH server, αλλά ο επιτιθέμενος
δίνει στο μηχάνημά του την IP του SSH server (που δεν μπορεί να απαντήσει), και προσκαλεί τον χρήστη να συνδεθεί στο μηχάνημά του. Ο χρήστης βλέπει ένα
[περίεργο μήνυμα](http://www.hpcvl.org/faqs/ssh_help.html#answer_4) ότι το fingerprint του server έχει αλλάξει, λέει \"ώχου μωρέ τώρα\" και επιλέγει να
συνδεθεί, αγνοώντας το μήνυμα. Ο επιτιθέμενος δέχεται την σύνδεση του χρήστη-θύματος, σταματάει το DoS του πραγματικού SSH server, και επιπροσθέτως του στέλνει
όλα τα πακέτα του θύματος. Αποτέλεσμα; Ο χρήστης κάνει κανονικά τη δουλειά του στον server, και ο επιτιθέμενος βλέπει και καταγράφει τα πάντα σε clear text,
μαθαίνοντας συνθηματικά, λογαριασμούς, άλλους κωδικούς, προσωπικά στοιχεία του θύματος, κτλ. Συγχαρητήρια, μόλις λάβατε μέρος σε μια επίθεση man-in-the-middle.
Το συγκεκριμένο σενάριο μπορεί να πραγματοποιηθεί πανεύκολα με παλιά SSH πρωτόκολλα και το εκπληκτικό πακέτο
[dsniff](http://naughty.monkey.org/~dugsong/dsniff/).
Δυστυχώς δεν υπάρχει καμία καθολική λύση για το πρόβλημα των DoS. Για την ακρίβεια, με την άνθιση των DDoS (Distributed Denial of Service) επιθέσεων, τα
πράγματα γίνονται διαρκώς χειρότερα. Πάντως, μερικά βήματα που μπορούμε να ακολουθήσουμε για να αντιμετωπίσουμε τις πιο παραδοσιακές επιθέσεις DoS ( [SYN
floods](http://www.cert.org/advisories/CA-1996-21.html) και ping floods) είναι τα εξής:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
# Ενεργοποιούμε προστασία έναντι επιθέσεων SYN flood
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
# Μην απαντάς σε ICMP echo requests (προστατεύει έναντι ping floods)
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Επίσης μπορούμε να χρησιμοποιήσουμε το module LIMIT που παρέχει το [netfilter](http://netfilter.org), το σύστημα που διαχειρίζεται τα πακέτα στο επίπεδο του
πυρήνα, με κάτι σαν:
----------------------------------------------------------------------------------------------------------------------------------------------------------------
iptables -A INPUT -p tcp --syn -m limit --limit 1/s -j ACCEPT
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Αυτός ο κανόνας λέει στον πυρήνα να δέχεται μόνο μία νέα TCP σύνδεση ανά δευτερόλεπτο, και να αγνοεί τις υπόλοιπες. Γενικά ο πυρήνας έχει αρκετές δυνατότητες
άμυνας έναντι DoS επιθέσεων μέσω του συστήματος netfilter και των ρυθμίσεων στον κατάλογο /proc/sys/net/ipv4.
### [2.2 Network Visibility]{#ss2.2}
**\...ή, πόσο μεγάλο στόχο δίνουμε.**
Εκτός από τις DoS, που έχουν έναν πολύ συγκεκριμένο σκοπό, υπάρχουν και άλλες επιθέσεις, που συνήθως έχουν σκοπό την εκμετάλλευση κάποιου bug σε ένα service του
υπολογιστή μας. Παράδειγμα: Υπάρχουν \"εργαλεία\" που μπορεί να βρει ο καθένας στο Internet, και να δίνουν άμεσο root access αν χρησιμοποιηθούν εναντίον
συστημάτων που τρέχουν παλιές εκδόσεις του HTTP server Apache. Όσο γρήγορα και να αναβαθμίζουμε το σύστημά μας όταν ο διανομέας βγάζει patches που κλείνουν
αυτές τις τρύπες, υπάρχει πάντα μια ακαθόριστη περίοδος προτού γνωστοποιηθεί το bug, κατά την οποία το σύστημά μας είναι ευάλωτο. Ό,τι και να κάνουμε, και όσα
firewalls και να έχουμε, κάποτε συμβαίνει σε όλους.
Οπότε εκτός από τα άμεσα patches, μια **πολύ** καλή ιδέα είναι να μην έχετε κανένα ενεργό service στο σύστημά σας, εκτός από τα τελείως απαραίτητα. Έτσι οι
ευκαιρίες για εκμετάλλευση bugs ελαχιστοποιούνται, επειδή κανείς δεν μπορεί να εκμεταλλευτεί ένα πρόγραμμα που δεν τρέχει!
Αυτές οι επιθέσεις είναι πιο δύσκολες στον εντοπισμό από τις DoS, μιας και δεν δημιουργούν άμεσα προβλήματα στο σύστημά μας. Σχεδόν όλες ξεκινούν με
αναγνωριστικές κινήσεις, όπως portscans και προσπάθειες σύνδεσης σε συνήθεις πόρτες (80-http, 22-ssh, 23-telnet, 25-smtp, 110-pop3 κτλ). Η καλύτερη άμυνα είναι
να ρυθμίσουμε το μηχάνημά μας ώστε να μη δίνει καν στόχο. Η κλασσική λύση που ακούγεται παντού είναι ένα firewall, αλλά υπάρχει κάτι πολύ πιο σημαντικό: το να
κλείσουμε οποιαδήποτε πόρτα / δικτυακό service δεν χρειαζόμαστε.
Μία default εγκατάσταση μιας μοντέρνας \"φιλικής προς το χρήστη\" διανομής, συνήθως αφήνει πολλές περιττές πόρτες ανοιχτές στον υπολογιστή μας. Μπορούμε να
δούμε ποια services έχουμε ενεργά με ένα
# lsof -i
ή, από την μεριά του επιτιθέμενου (χρήσιμο για να καταλάβουμε τι μπορούν να δουν οι άλλοι για το μηχάνημά μας):
# nmap <η_ΙΡου>
Για να δούμε τι βλέπω για το σύστημά μου:
# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
privoxy 14769 privoxy 3u IPv4 173542 TCP localhost.localdomain:6969
(LISTEN)
# ifconfig wlan0
wlan0 Link encap:Ethernet HWaddr 00:20:E0:8D:01:2D
inet addr:192.168.1.106 Bcast:192.168.1.255 Mask:255.255.255.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:58578 errors:0 dropped:0 overruns:0 frame:0
TX packets:69317 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:100
RX bytes:34820912 (33.2 MiB) TX bytes:2989402 (2.8 MiB)
# nmap -p1-65535 192.168.1.106
Starting nmap V. 3.10ALPHA4 ( www.insecure.org/nmap/ )
All 65535 scanned ports on 192.168.1.106 are: closed
Nmap run completed -- 1 IP address (1 host up) scanned in 100.306 seconds
Τί μας λένε τα παραπάνω; Με την εντολή lsof -i βλέπω μια υπηρεσία (privoxy) να \"ακούει\" (LISTEN) για τοπικές συνδέσεις TCP στην πόρτα 6969 (TCP
localhost.localdomain:6969). Αλλά το nmap μου λέει ότι όλες οι πόρτες είναι κλειστές! Τι γίνεται εδώ;
Ο privoxy στην συγκεκριμένη περίπτωση \"ακούει\" μόνο για συνδέσεις στη διεύθυνση localhost.localdomain:6969. Επειδή αυτό το όνομα δεν είναι δυνατόν να
χρησιμοποιηθεί για απομακρυσμένες δικτυακές συνδέσεις (είναι alias για το τοπικό μηχάνημα, και δεν μπορεί να χρησιμοποιηθεί σαν δικτυακό όνομα με το παρόν
σύστημα [DNS](http://www.webopedia.com/TERM/D/DNS.html)), ο privoxy φαίνεται σαν να μην υπάρχει όταν κάποιος εξετάζει τις πόρτες μας από το δίκτυο (γι\'αυτό
χρησιμοποίησα την εξωτερική μου IP στο nmap - αν είχα χρησιμοποιήσει την 127.0.0.1 θα είχα διαφορετικά αποτελέσματα). Για τις χάρες του privoxy θα μιλήσουμε
στην επόμενη ενότητα. Όπως είδαμε, δεν φαίνεται καν να υπάρχει από το δίκτυο. Άρα δεν το θεωρώ ευάλωτο σημείο.
Σε μια default εγκατάσταση κάποιας μοντέρνας διανομής, δυστυχώς έχουμε μεγάλες πιθανότητες να δούμε μια ελαφρώς διαφορετική εικόνα:
[root@helios root]# lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
privoxy 14769 privoxy 3u IPv4 173542 TCP localhost.localdomain:6969
(LISTEN)
tcpserver 14781 root 3u IPv4 176623 TCP *:44444 (LISTEN)
tcpserver 14783 root 3u IPv4 176629 TCP *:2121 (LISTEN)
smbd 14793 root 9u IPv4 176648 TCP *:netbios-ssn (LISTEN)
xinetd 14814 root 5u IPv4 179758 UDP *:ntalk
httpd 14831 root 3u IPv4 185996 TCP *:http (LISTEN)
httpd 14886 apache 3u IPv4 185996 TCP *:http (LISTEN)
Όλα αυτά τα (LISTEN) δεν είναι καθόλου απαραίτητα, εκτός κι\'αν ξέρετε τι κάνετε. Αν δεν ξέρετε τι σημαίνει κάποια καταχώρηση (όπως πχ. netbios-ssn), μπορείτε
να την αναζητήσετε στο αρχείο /etc/services για περισσότερες πληροφορίες:
$ grep netbios-ssn /etc/services
netbios-ssn 139/tcp # NETBIOS session service
netbios-ssn 139/udp
Το μηχάνημα που δεν δείχνει τίποτα να ακούει (LISTENing), είναι σχεδόν αόρατο στο δίκτυο. Είναι εξαιρετικά δύσκολο για κάποιον επιτιθέμενο να το βρει και να του
επιτεθεί. Πώς ξεφορτωνόμαστε όλα αυτά τα LISTEN λοιπόν;
Ανάλογα με τη διανομή που χρησιμοποιούμε ( [Debian](http://www.debian.org), [Slackware](http://www.slackware.com), [Red Hat](http://www.redhat.com),
[Gentoo](http://www.gentoo.org) κτλ), υπάρχουν διαφορετικοί τρόποι ελέγχου των υπηρεσιών (services) που είναι ενεργές στον υπολογιστή μας. Οι περισσότερες
διανομές GNU/Linux χρησιμοποιούν System V init scripts, δηλαδή αποθηκεύουν τα scripts που ελέγχουν τις υπηρεσίες στους καταλόγους /etc/rcX.d, όπου Χ είναι μια
τιμή από 0 έως 6. Αυτή η τιμή αντιστοιχεί στο runlevel του συστήματος. Το runlevel στο οποίο λειτουργεί το σύστημα αμέσως μετά την εκκίνησή του (boot) το
βρίσκουμε με ένα
# grep default /etc/inittab
Στο δικό μου σύστημα αυτό δίνει:
# The default runlevel.
id:2:initdefault:
που σημαίνει ότι αν θέλω να κάνω κάποιες υπηρεσίες να μην ενεργοποιούνται σε κάθε επανεκκίνηση, πρέπει να τις απενεργοποιήσω από το φάκελο /etc/rc2.d .
Αν κάνουμε ένα
ls -l
μέσα σε αυτό το φάκελο, θα δούμε ότι υπάρχουν πολλά symbolic links με τα ονόματα όλων των διαθέσιμων υπηρεσιών. Αν θέλουμε να μην ξεκινάει σε κάθε εκκίνηση ο
http daemon (httpd) (που είναι συνήθως ο [Apache](http://www.apache.org)), απλά σβήνουμε το link SXXhttpd (όπου ΧΧ η προτεραιότητα με την οποία ενεργοποιείται
κατά την εκκίνηση αυτό το service).
Ωραία, ο web server δεν θα ξεκινάει σε κάθε εκκίνηση από δω και στο εξής. Πώς όμως τον σταματάμε εδώ και τώρα;
Αν προσέξατε, όλα τα symbolic links στον κατάλογο που είμαστε \"δείχνουν\" σε αρχεία του καταλόγου ../init.d (δηλαδή στο /etc/init.d). Για να σταματήσουμε ή να
ξεκινήσουμε μια υπηρεσία αμέσως, καλούμε το script που την ελέγχει με την παράμετρο stop ή start:
Αυτή η εντολή ενεργοποιεί άμεσα τον HTTP server:
# /etc/init.d/httpd start
Αυτή η εντολή τον σταματάει:
# /etc/init.d/httpd stop
Με αυτό τον τρόπο μπορούμε να ξεφορτωθούμε και οποιεσδήποτε άλλες υπηρεσίες που είναι ενεργές χωρίς λόγο. Υπενθύμιση: σε ένα home PC, η εντολή
# lsof -i
δεν πρέπει να δείχνει τίποτα που να \"ακούει\" (LISTEN) για συνδέσεις από το δίκτυο (\*:port\_number).
ΣΗΜΕΙΩΣΗ: Υπάρχουν μερικές ειδικές περιπτώσεις, όπως το port 6000 (X11), το οποίο είναι περιττό για το 99% των συστημάτων για αποκλειστικά προσωπική χρήση, και
έχει γνωστά προβλήματα ασφάλειας (οποιοσδήποτε στο δίκτυο μπορεί να δει τι πληκτρολογείτε). Οπότε είναι πολύ καλή ιδέα να το κλείσετε, καλώντας τα X με την
παράμετρο -nolisten tcp:
$ startx -- -nolisten tcp
### [2.3 Firewalls]{#ss2.3}
Tα firewalls είναι προγράμματα ή συσκευές που ελέγχουν τα δεδομένα που ταξιδεύουν σε ένα δίκτυο. Σε προσωπικό επίπεδο, μπορούμε να τα χρησιμοποιήσουμε για να
ελέγξουμε τις δικτυακές συνδέσεις του υπολογιστή μας και να δυναμώσουμε την άμυνά μας έναντι δικτυακών επιθέσεων. Στο GNU/Linux το
[firewalling](http://www.wikipedia.org/wiki/firewall) γίνεται από το σύστημα [netfilter](http://www.netfilter.org), που ελέγχεται από το πρόγραμμα iptables.
Σε όλες τις μοντέρνες διανομές το σύστημα netfilter είναι ενεργοποιημένο στον πυρήνα Linux και το πρόγραμμα netfilter υπάρχει προεγκατεστημένο. Συνεπώς το μόνο
που έχουμε να κάνουμε είναι να δώσουμε τους κανονισμούς σύμφωνα με τους οποίους θα διαχειρίζεται ο πυρήνας τα δικτυακά δεδομένα που έρχονται και φεύγουν από τον
υπολογιστή μας.
Δεν θα μπούμε σε λεπτομέρειες, επειδή το firewalling είναι αρκετά μεγάλο θέμα. Θα σας δείξω τα rules που χρησιμοποιώ στο laptop μου, με σχόλια που θα εξηγούν τι
κάνει το κάθε rule. Το παρόν ruleset έχει βασιστεί στο εξαιρετικό [tutorial του James C. Stephens.](http://www.sns.ias.edu/~jns/security/iptables/index.html)
----------------------------------------------------------------------------------------------------------------------------------------------------------------
#!/bin/bash
if [ -z $1 ]; then
# Δεν έχουμε command line argument, οπότε δεν αφήνουμε κανέναν να συνδεθεί με
SSH σε μας.
echo Disallowing SSH access...
NOSSH=1
else
# Έχουμε IP address στη γραμμή εντολών, που θέλουμε να συνδέεται σε μας με
SSH.
echo Allowing SSH access for $1...
fi
##############################
#### ΓΕΝΙΚΕΣ ΠΡΟΦΥΛΑΞΕΙΣ #####
##############################
## Μην απαντάς σε ping.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
## Μην απαντάς σε broadcasts.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
## Μη δέχεσαι source routed πακέτα.
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_source_route
## Μη κάνεις ICMP redirect.
/bin/echo "0" > /proc/sys/net/ipv4/conf/all/accept_redirects
## Προστασία έναντι περίεργων λαθών.
/bin/echo "1" > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
## Ενεργοποίησε το reverse path filtering.
for interface in /proc/sys/net/ipv4/conf/*/rp_filter; do
/bin/echo "1" > ${interface}
done
## Σημείωσε στα system logs (/var/log/messages by default) τα πακέτα που
φαίνεται να έχουν ψεύτικες διευθύνσεις ή γενικώς να είναι ύποπτα.
/bin/echo "1" > /proc/sys/net/ipv4/conf/all/log_martians
## Μην λειτουργείς σαν router (μην προωθείς πακέτα σε άλλες διευθύνσεις).
/bin/echo "0" > /proc/sys/net/ipv4/ip_forward
##################
#### FIREWALL ####
##################
## Φόρτωσε τα connection-tracking modules.
/sbin/modprobe ipt_state
/sbin/modprobe ip_conntrack
/sbin/modprobe ip_conntrack_ftp #ports=2121
#/sbin/modprobe ipt_owner
## Καθάρισε τυχόν ενεργά rules
/sbin/iptables -F
## Διέγραψε τυχόν custom tables
/sbin/iptables -X
## Μηδένισε όλους τους μετρητές πακέτων
/sbin/iptables -Z
## By default κάνουμε DROP (αγνοούμε) όλα τα πακέτα (ώστε να περνάνε μόνο αυτά
που έχουν λόγο να περνάνε)
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT DROP
#####################
#### ΕΙΣΕΡΧΟΜΕΝΑ ####
#####################
## Δεχόμαστε όλες τις τοπικές συνδέσεις
/sbin/iptables -A INPUT -s 127.0.0.1 -d 127.0.0.1 -i lo -j ACCEPT
## Δεχόμαστε πακέτα από όλες τις ήδη υπάρχουσες συνδέσεις (λόγω των υπολοίπων
rules, αναγκαστικά τις έχουμε ξεκινήσει εμείς οπότε υποθέτουμε ότι είναι
ασφαλείς)
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
if [ $NOSSH ]; then
#Καθόμαστε.
echo
else
## Επέτρεψε συνδέσεις SSH από τη διεύθυνση που παρέχουμε στη γραμμή εντολών
/sbin/iptables -A INPUT -p tcp -s $1 --sport 1024: --dport 22 -j ACCEPT
fi
######################
##### ΕΞΕΡΧΟΜΕΝΑ #####
######################
## Δεχόμαστε τοπικές συνδέσεις
/sbin/iptables -A OUTPUT -s 127.0.0.1 -d 127.0.0.1 -j ACCEPT
## SSH
/sbin/iptables -A OUTPUT -p tcp --dport 22 -j ACCEPT
## HTTP
/sbin/iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
## HTTPS
/sbin/iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT
## POP3
/sbin/iptables -A OUTPUT -p tcp --dport 110 -j ACCEPT
## SMTP
/sbin/iptables -A OUTPUT -p tcp --dport 25 -j ACCEPT
## DNS
/sbin/iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
## FTP (command)
/sbin/iptables -A OUTPUT -p tcp --dport 21 -m state --state NEW,ESTABLISHED -j
ACCEPT
## FTP (data::Active)
/sbin/iptables -A OUTPUT -p tcp --dport 20 -m state --state ESTABLISHED -j
ACCEPT
## FTP (data::Passive)
/sbin/iptables -A OUTPUT -p tcp --sport 1024: --dport 1024: -m state --state
ESTABLISHED,RELATED -j ACCEPT
if [ $NOSSH ]; then
echo
else
## Επιτρέπουμε στον SSH server μας να απαντήσει.
/sbin/iptables -A OUTPUT -p tcp --sport 22 --dport 1024: -m state --state
ESTABLISHED,RELATED -j ACCEPT
fi
## ICMP
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
## dict.org:2628
/sbin/iptables -A OUTPUT -p tcp -d 66.111.36.30 --dport 2628 -j ACCEPT
## Importing OpenPGP keys από pgp.mit.edu:11371
/sbin/iptables -A OUTPUT -p tcp -d 18.7.14.139 --dport 11371 -j ACCEPT
## JETDIRECT printing
/sbin/iptables -A OUTPUT -p tcp --dport 9100 -j ACCEPT
## Whois queries
/sbin/iptables -A OUTPUT -p tcp --dport 43 -j ACCEPT
## NTP updates
/sbin/iptables -A OUTPUT -p tcp -d 128.2.4.21/16 --dport 123 -j ACCEPT
/sbin/iptables -A OUTPUT -p udp --sport 123 -d 128.2.4.21/16 --dport 123 -j
ACCEPT
#################
#### LOGGING ####
#################
## Αυτά τα μηνύματα καταχωρούνται στο /var/log/messages
## Με ένα tail -f /var/log/messages σαν root τα παρακολουθούμε
## Log εισερχόμενα TCP πακέτα που απορρίφθηκαν.
/sbin/iptables -A INPUT -p tcp -j LOG --log-prefix "iptables:IN-TCP DROPPED:"
## Log εξερχόμενα TCP πακέτα που απορρίφθηκαν.
/sbin/iptables -A OUTPUT -p tcp -j LOG --log-prefix "iptables:OUT-TCP DROPPED:"
## Log οτιδήποτε άλλο που δεν πέρασε
#/sbin/iptables -A INPUT -j LOG --log-prefix "iptables:INCOMING DROPPED:"
/sbin/iptables -A OUTPUT -j LOG --log-prefix "iptables:OUTGOING DROPPED:"
## Τέλος του iptables script
----------------------------------------------------------------------------------------------------------------------------------------------------------------
Μπορείτε να κατεβάσετε αυτό το script και [σε ASCII μορφή](fw.rules) για πιο εύκολη χρήση. Το script πρέπει να ανήκει στον root και να είναι executable:
# chown root:root fw.rules
# chmod 770 fw.rules
\...και το εκτελείτε. Τα αποτελέσματα τα βλέπετε με ένα
# iptables -L
### [3. Privacy]{#s3}
Σε αυτή την ενότητα θα εξετάσουμε τα βήματα που μπορούμε να ακολουθήσουμε για να δυσκολέψουμε το έργο των απανταχού
[spammers](http://www.wikipedia.org/wiki/Spamming), διαφημιστών, και λοιπών κερδοσκοπικών ατόμων και εταιρειών, που έχουν σαν σκοπό να μετατρέψουν το Internet
σε ένα μεγάλο εμπορικό κέντρο. Μόνο και μόνο διαβάζοντας σελίδες και στέλνοντας emails οι κινήσεις μας παρακολουθούνται και καταγράφονται για σκοπούς marketing.
Τα προσωπικά μας δεδομένα πωλούνται σε όσους μπορούν να πληρώσουν, και καταντάμε έρμαια μαζικών διαφημίσεων στα προσωπικά μας mailbox. Σε κάθε σελίδα που
διαβάζουμε υπάρχουν 5-10 διαφημιστικά banners που αναβοσβήνουν, αστράφτουν, κουνιούνται, έχουν ήχο\... κάνουν τα πάντα για να αποσπάσουν την προσοχή μας από τον
σκοπό που είχαμε όταν πήγαμε στην σελίδα (να διαβάσουμε τις πληροφορίες που έχει εκεί), και να μας κάνουν να θυμηθούμε το οποιοδήποτε προϊόν όταν το δούμε
μπροστά μας. Προσωπικά βρίσκω τις διαφημίσεις αυτές εξαιρετικά ενοχλητικές και την πώληση των προσωπικών μου πληροφοριών σε εταιρείες ανήθικη. Να τι κάνω για να
προστατέψω τον εαυτό μου λοιπόν.
### [3.1 Διαφημίσεις (banner ads)]{#ss3.1}
Τα banners έχουν αρχίσει να γίνονται ιδιαίτερα ενοχλητικά. Δεν μπορεί κανείς να διαβάσει μια σελίδα στο Internet χωρίς να βομβαρδίζεται από ενοχλητικά
[animation, ήχους και χρώματα](/34/img/ads.png), όλα να υπόσχονται λεφτά και εκπτώσεις και ευκαιρίες. Εκτός από την ενόχληση αυτή, τα banners χρησιμοποιούνται από
τους διαφημιστές για να παρακολουθούν τους netizens και να δημιουργούν καταναλωτικά προφίλ για σκοπούς marketing (βλ. ενότητα για cookies παρακάτω). Ευτυχώς
είναι αρκετά εύκολο να [απαλλαγεί](/34/img/noads.png) κανείς από αυτά, χάρη στους proxy servers που υπάρχουν ελεύθερα διαθέσιμοι.
O [privoxy](http://www.privoxy.org) είναι ένας anonymizing proxy. Ένα πρόγραμμα, δηλαδή, που δέχεται αιτήσεις για νέες σελίδες από τον browser σας, και τις
φέρνει από το δίκτυο. Όταν τις σερβίρει στον browser για να τις δείξει στην οθόνη, διαβάζει τον κώδικα της σελίδας και [αντικαθιστά τις
διαφημίσεις](http://www.andrew.cmu.edu/~apapadop/linux/images/bloomberg_privoxy.png) με άσπρα κουτάκια (που δεν φαίνονται) είτε ένα σήμα που δείχνει στον χρήστη
ότι υπήρχε μια διαφήμιση εκεί, και τώρα δεν την βλέπει. Έτσι βλέπουμε μόνο αυτό που θέλουμε, και όχι διαφημίσεις που μας αποσπούν την προσοχή.
### [3.2 Cookies]{#ss3.2}
Τα cookies είναι μικρά αρχεία κειμένου που οποιοδήποτε site μπορεί να αποθηκεύσει στον υπολογιστή μας. Έχουν δημιουργηθεί για να ξεπεράσουν κάποια [προβλήματα
σχεδιασμού του πρωτοκόλλου HTTP](http://www.wikipedia.org/wiki/HTTP_cookie) που χρησιμοποιείται για web browsing. Επειδή το HTTP είναι stateless, δηλαδή δεν
μπορεί να καταλάβει αν κάποιο click που κάνουμε είναι συνδεμένο με προηγούμενες ενέργειές μας στην ίδια σελίδα ή όχι, εφευρέθηκαν τα cookies. Τώρα, όταν κάνω
login σε κάποιο δικτυακό χώρο που χρειάζεται να ελέγχει την πρόσβαση των χρηστών του (π.χ. online email service), το site μου δίνει ένα cookie που περιέχει
κωδικοποιημένες τις πληροφορίες του λογαριασμού μου. Έτσι, όταν ζητάω να δω το inbox μου, το εκάστοτε site ξέρει ότι είμαι ο νόμιμος χρήστης αυτού του
λογαριασμού, και μου δείχνει τα email μου. Αν δεν υπήρχε αυτός ο μηχανισμός για να παρακολουθεί πχ. το Yahoo! ποιος χρήστης ζητάει να δει τι, θα ήταν δυνατό να
διαβάζουν όλοι τα emails όλων των άλλων χρηστών.
Όλα καλά και άγια ως εδώ με τα cookies. Τα προβλήματα ξεκινούν όταν διάφοροι εξυπνάκηδες αρχίζουν να εκμεταλλεύονται αυτό το μηχανισμό για να μας παρακολουθούν
για διαφημιστικούς λόγους. Υπάρχουν εταιρείες όπως η απεχθής Doubleclick, που μοιράζουν άφθονα cookies σε κάθε ευκαιρία, και μετά παρακολουθούν το πού πάει ο
κάτοχός τους.
Ένα παράδειγμα. Είχα ένα λογαριασμό για free web email στο rocketmail.com και ήμουν πολύ ικανοποιημένος. Ούτε spam, ούτε διαφημίσεις, ούτε τίποτα. Όταν το
rocketmail.com αγοράστηκε από το Yahoo! άρχισαν τα προβλήματα. Κάθε φορά που χρησιμοποιώ το λογαριασμό μου, το Yahoo! προσπαθεί να μου δώσει ένα cookie εκ
μέρους της Doubleckick. Αν δεν προστάτευα τον εαυτό μου απορρίπτοντας το cookie, οποιαδήποτε άλλα sites είχαν διαφημίσεις της Doubleclick (και είναι λίγα που
**δεν** έχουν) θα μπορούσαν να μάθουν τη διεύθυνση email μου. Καθώς πήγαινα σε περισσότερα sites, με το cookie της Doubleckick στον υπολογιστή μου, οι συνήθειές
μου θα καταγράφονταν και θα συσχετιζόντουσαν για να δημιουργήσουν ένα καταναλωτικό προφίλ. Τι ενδιαφέρει αυτόn τον καταναλωτή; Σε τι δικτυακούς τόπους συχνάζει;
Πόσο χρόνο κάθεται σε τι είδους σελίδες; Αυτό το προφίλ είναι έτοιμο να πουληθεί σε οποιονδήποτε ενδιαφερόμενο κάνει direct marketing. Σε όλη αυτή τη διαδικασία
εγώ ουδέποτε έχω συμφωνήσει να φτιαχτεί τέτοιο προφίλ, να παρακολουθούνται οι κινήσεις μου, και να δέχομαι spam email από εταιρείες που δεν ξέρω καν. Και όμως,
δεχόμενος το cookie, έχω κάνει όλα τα παραπάνω.
Τα cookies είναι άχρηστα για την σωστή λειτουργία του δικτυακού τόπου στη συντριπτική πλειοψηφία των περιπτώσεων. Ο γενικός κανόνας είναι ότι αν δεν χρειάζεται
να κάνετε login κάπου (με username και password), τότε δεν χρειάζεστε και τα cookies από εκείνο το site.
Για να αμυνθούμε έναντι των cookies, πρέπει απλά να ρυθμίσουμε τον browser μας να μας ρωτάει τι να κάνει κάθε φορά που κάποιος προσπαθεί να μας δώσει cookie.
Και ο [Mozilla](/34/img/mozilla_cookie.png) και ο [Konqueror](/34/img/konqueror_cookie.png) έχουν πολύ ωραίο τρόπο αντιμετώπισης των cookies. Μπορούν να ρυθμιστούν να
θυμούνται την επιλογή του χρήστη (αποδοχή ή απόρριψη cookies από ένα συγκεκριμένο site), και να σβήνουν όλα τα cookies με το που κλείνουμε τον browser. Έτσι
κρατάμε τις χρήσιμες λειτουργίες των cookies επιλεκτικά, όπου τις χρειαζόμαστε, και σιγουρεύουμε ότι δεν μπορεί κανείς να μας παρακολουθήσει την επόμενη φορά
που θα ανοίξουμε τον browser μας.
### [3.3 Web bugs]{#ss3.3}
Τα web bugs είναι αόρατες εικόνες (1x1 pixel transparent GIFs, συνήθως) που στέλνονται σαν μέρος ενός HTML email, και πρέπει να φορτωθούν από το Internet όταν
το email ανοιχτεί. Τι σημασία έχει αυτό, σας ακούω να ρωτάτε.
Ας πούμε ότι είμαι ένας spammer. Τρέχω έναν web server και έναν mail server δικό μου. Στέλνω 10,000 email ένα πρωί, μη ξέροντας ποιες από αυτές τις διευθύνσεις
είναι πραγματικές και ποιες έχουν καταργηθεί. Επίσης θέλω να μετρήσω το πόσο γρήγορα φτάνουν στα θύματά μου (καταναλωτές) οι διαφημίσεις που στέλνω. Πώς θα το
κάνω αυτό;
Το email που στέλνω είναι σε HTML. Περιέχει στον κώδικα της σελίδας μια αόρατη εικόνα (transparent GIF), η πηγή του οποίου είναι ο web server μου. Συνεπώς μόλις
κάποιο θύμα ανοίξει αυτό το email, ο mail client του θα προσπαθήσει να του δείξει την εικόνα, άρα θα προσπαθήσει να την κατεβάσει από το Internet, και πιο
συγκεκριμένα από τον δικό μου web server. Αλλά οι web servers έχουν logs που δείχνουν ποια διεύθυνση (ΙΡ), ζήτησε ποιο αρχείο (το GIFάκι), ποιά ώρα. Συνεπώς
μαθαίνω ότι κάποιος στο domain 194.15.60.x (που μπορώ εύκολα να μάθω πως ανήκει σε subnet ενός συγκεκριμένου Internet Service Provider - ας πούμε της OTEnet)
άνοιξε το email μου στις 11:34 ακριβώς το πρωί.
Αμέσως ξέρω ότι κάποια από τις διευθύνσεις \@otenet.gr που έχω είναι πιθανότατα πραγματικό mailbox κάποιου θύματος, το οποίο διαβάζει τα mail του αρκετά συχνά.
Άρα αρχίζω να χτυπάω τις διευθύνσεις \@otenet.gr πιο πολύ με spam από δω και πέρα.
Η μόνη άμυνα για αυτή την παραβίαση του προσωπικού μας χώρου είναι η απαγόρευση των HTML email. Ο [Mozilla Mail](/34/img/moz_mail.png) και το [KMail](/34/img/kmail.png)
έχουν ρυθμίσεις για να σας βοηθήσουν να αντιμετωπίσετε τα web bugs, που είναι τελικά τελείως άχρηστα σε εμάς, και πολύ χρήσιμα στους spammers.
**Συμπέρασμα:**
Οι απειλές είναι πολλές, άλλα υπάρχουν και πολλά που μπορούμε να κάνουμε για να προστατευθούμε. Με λίγη προσοχή και τη δύναμη των εργαλείων του GNU/Linux,

357
content/articles/34/04_tips.md Κανονικό αρχείο

@ -0,0 +1,357 @@
+++
title = 'Tips για την γραμμή εντολής.'
date = '2003-08-01T00:00:00Z'
description = ''
author = 'Φανουργάκης Μανώλης(mailto:mfano@NOSPAMfreemail.gr)'
issue = ['Magaz 34']
issue_weight = 4
+++
----------------------------------------------------------------------------------------------------------------------------------------------------------------
*Μερικά tips που διευκολύνουν τη ζωή μας στη γραμμή εντολής*
----------------------------------------------------------------------------------------------------------------------------------------------------------------
**1. Aliases**
-------------------------------------
- [1.1 ls](#ss1.1)
- [1.2 less](#ss1.2)
- [1.3 pushd, popd, dirs](#ss1.3)
- [1.4 PATH](#ss1.4)
- [1.5 history](#ss1.5)
- [1.6 find](#ss1.6)
- [1.7 Συντόμευση για συνηθισμένα μακριά command lines.](#ss1.7)
- [1.8 Διάφορα](#ss1.8)
**2. Shell prompt**
------------------------------------------
**3. Vi (=very intelligent) editor**
-----------------------------------------------------------
**4. Screen**
------------------------------------
### [1. Aliases]{#s1}
Τα παρακάτω aliases μπορούν να μπουν στο \~/.bashrc. Αν όμως γίνουν πολλά, είναι καλύτερα για λόγους τάξης να μπουν σε ένα ξεχωριστό αρχείο, π.χ. στο \~/.alias
και να μπει στο \~/.bashrc η γραμμή:
test -s ~/.alias && . ~/.alias
### [1.1 ls]{#ss1.1}
alias l='ls -lA '
alias lh='l -h '
Ο διακόπτης -h της ls είναι αρκετά χρήσιμος γιατί μετατρέπει το μέγεθος αρχείων σε kB,MB,GB. Έτσι, με \'l \~/mbox\' θα πάρω το παρακάτω:
-rw------- 1 manolis users 135987 Ιούλ 28 22:33 /home/manolis/mbox
Ενώ με \'lh \~/mbox\' το παρακάτω:
-rw------- 1 manolis users 133k Ιούλ 28 22:33 /home/manolis/mbox
### [1.2 less]{#ss1.2}
alias m='$PAGER'
Όπου η μεταβλητή PAGER έχει τεθεί στο \~/.bashrc ως εξής:
export PAGER='less -rM '
Ή ό,τι άλλο χρησιμοποιείται ως pager τέλος πάντων. Εξαιρετικά βολικό, χρησιμοποιώ το less αμέτρητες φορές κάθε μέρα.
### [1.3 pushd, popd, dirs]{#ss1.3}
alias pd='pushd'
alias po='popd'
alias ds='dirs -v'
Χρήσιμα για τις \...περιπλανήσεις μας στη δομή αρχείων του linux.
Οι εντολές pushd, popd, dirs χειρίζονται μια στοίβα (stack) καταλόγων στους οποίους μετακινούμαστε.
- Με την εντολή \'pushd dir\' μεταφερόμαστε στον κατάλογο dir και τοποθετείται αυτός στην κορυφή της στοίβας.
- Με την εντολή popd αφαιρείται ο κατάλογος που βρίσκεται στην κορυφή της στοίβας και μεταφερόμαστε σ\' αυτόν που θα γίνει η νέα κορυφή.
- Με την εντολή dirs βλέπουμε τα περιεχόμενα της στοίβας.
Ένα παράδειγμα θα γίνει πιο εύκολα κατανοητό:
$ pd /tmp/
/tmp ~
Ξεκινώντας ένα νέο shell βρίσκομαι στο home directory. Κάνω push το /tmp. Παρατηρώ ότι η pushd μου αναφέρει και την κατάσταση της στοίβας: Στην κορφή βρίσκεται
το /tmp και μετά το home από όπου ξεκίνησα.
$ pd /usr/local/bin/
/usr/local/bin /tmp ~
Έκανα push και το /usr/local/bin. Η στοίβα τώρα έχει τρεις καταλόγους.
$ ds
0 /usr/local/bin
1 /tmp
2 ~
Ας υποθέσουμε τώρα ότι θέλω να εναλλάσομαι γρήγορα μεταξύ αυτών των καταλόγων. Με ένα pushd +n (όταν χρησιμοποιήσουμε την pushd χωρίς όρισμα, εννοείται +1) ο
κατάλογος που βρίσκεται στη θέση n πάει στην κορυφή.
$ pd +1
/tmp /usr/local/bin ~
Με ένα popd ξεφορτώνομαι τον κατάλογο που βρίσκεται στην κορυφή και μεταφέρομαι στον αμέσως επόμενο.
$ po
/usr/local/bin ~
Με τη σωστή χρήση των pushd, popd, dirs μπορούμε να κάνουμε πολύ γρήγορα πολύπλοκες δουλειές. Και μην ξεχνάτε ότι τα πλήρη ονόματα των καταλόγων μπορεί να
γίνουν πολύ μεγάλα (π.χ. /usr/X11R6/lib/X11/fonts/hellas/, \~/download/pictures/flags/greece/). Είναι πολύ βολικό να μπορεί κανείς με τρία χτυπήματα πλήκτρων να
εναλάσσεται μεταξύ τους.
Για περισσότερες πληροφορίες \'help pushd\', \'help popd\', \'help dirs\'.
Επίσης, ας μην ξεχνάμε και την εντολή \'cd -\' που μας τοποθετεί στον προηγούμενο κατάλογο (σ\' αυτόν που είμασταν πριν κάνουμε cd ή pushd/popd).
### [1.4 PATH]{#ss1.4}
alias pt='echo $PATH|tr : \\n '
addpath() { while test "$1" ; do PATH=${PATH}:"$1" ; shift ; done ; }
Το alias pt κάνει το εξής απλό και έξυπνο: Παίρνει τη μεταβλητή PATH και την περνάει στην εντολή tr (δώστε man tr) ώστε να μετατρέψει τις άνω και κάτω τελείες
που χωρίζουν τους καταλόγους του path σε αλλαγές γραμμών. Έτσι έχουμε το εξής ευανάγνωστο αποτέλεσμα:
$ pt
/usr/local/bin
/usr/bin
/usr/X11R6/bin
/bin
/usr/games/bin
/opt/gnome/bin
/opt/kde3/bin
.
Η συνάρτηση addpath προσθέτει τα ορίσματά της στο τέλος της μεταβλητής PATH. Οι συναρτήσεις (functions) του shell είναι σαν μικρά σκριπτάκια, έχουν πιο πολλές
δυνατότητες από τα απλά aliases. Εδώ όπως βλέπετε μπορούμε να χειριστούμε μία- μία όλες της παραμέτρους της addpath().
(Για περισσότερες πληροφορίες, man bash, section FUNCTIONS)
### []{#history} [1.5 history]{#ss1.5}
Το shell μας δίνει τη δυνατότητα να επαναλάβουμε μια προηγούμενη εντολή χωρίς να χρειάζεται να την πληκτρολογήσουμε ολόκληρη.
- Με τα βελάκια πάνω και κάτω μπορούμε να έχουμε γρήγορη πρόσβαση στις προηγούμενες εντολές.
- Δίνοντας \'!cmd\' επαναλαμβάνεται η τελευταία εντολή που αρχιζε με τους χαρακτήρες \'cmd\'.
- Δίνοντας \'history n\' (παρεμπιμπτόντως μην ξεχάσετε το alias h=\'history \' στο \~/.bashrc) μας εμφανίζονται οι τελευταίες n εντολές μαζί με τον αριθμό
τους. Στη συνέχεια με \'!n\', όπου n ο αριθμός της εντολής μπορούμε να επαναλάβουμε όποια θέλουμε.
- Με \'!-n\', όπου n αριθμός, εκτελείται η n-ιοστή προηγούμενη εντολή. Με \'!!\' εκτελείται η αμέσως προηγούμενη (συνώνυμο του \'!-1\').
(Για περισσότερες πληροφορίες, man bash, section HISTORY)
### [1.6 find]{#ss1.6}
export FIN='-printf %s\t%TY-%Tm-%Td-%TX\t%p\n'
Έχοντας αυτή τη γραμμή στο \~/.bashrc έχω πάντα στο shell μου μια μεταβλητή, την FIN. Το κείμενο της είναι μια εντολή μορφοποίησης για τα αποτελέσματα της find.
Δίνοντας λοιπόν \"find dir \$FIN\" παίρνω μια λίστα των αρχείων κάτω από τον κατάλογο dir στην εξής μορφή:
135987 2003-07-28-22:33:13 ./mbox
Στην πρώτη στήλη το μέγεθος του αρχείου, στη δεύτερη η ημερομηνία τροποποίησης και στην τρίτη το όνομα του αρχείου. Οι στήλες είναι χωρισμένες με tab.
Κατευθύνοντας τώρα την έξοδο της προηγούμενης εντολής στην sort μπορούμε να κάνουμε πολύ ενδιαφέροντα πράγματα:
% find $FIN |sort -rnk 1|head -n 4
5146003 2003-08-02-20:45:48 ./Mail/LGU
2457441 2003-08-01-11:00:07 ./Mail/saved
2029849 2003-02-04-20:32:24 ./tmp/lp/ss11
1603828 2003-07-28-22:22:08 ./downl/wg/glib-2.2.2.tar.bz2
Ο διακόπτης \'-k NUM\' της sort κάνει ταξινόμηση σύμφωνα με το NUM-οστό πεδίο. Εδώ βάλαμε το πρώτο, το μέγεθος δηλαδή. Το \'r\' είναι για φθίνουσα ταξινόμηση.
Το \'n\' είναι για να λάβει η sort υπόψη της ότι πρόκειται για αριθμούς (και να μη βάλει το 11111 πριν από το 11 στη φθίνουσα ταξινόμηση, για παράδειγμα).
Χρησιμοποίησα το φίλτρο head για να κρατήσω τις πρώτες 4 γραμμές μόνο (man head).
Τι κάναμε δηλαδή; Κάναμε μια αναζήτηση κάτω από τον τρέχοντα κατάλογο και βρήκαμε τα πιο μεγάλα σε μέγεθος αρχεία.
Άλλο:
% find $FIN |sort -rk 2|head -n 4
20480 2003-08-03-12:32:13 ./tmp/.tips.swp
7946 2003-08-03-12:32:13 ./tmp/tips
4096 2003-08-03-12:32:13 ./tmp
150606 2003-08-03-12:21:35 ./.bash_history
Κάναμε ταξινόμηση ως προς την ημερομηνία και ώρα τροποποίησης.
Παρατήρηση: Η find μας επιστρέφει και ονόματα καταλόγων (όπως το ./tmp που φαίνεται πιο πάνω). Για να μην το κάνει αυτό μπορούμε να προσθέσουμε στις παραμέτρους
της find το \'! -type d\'.
(man find για περισσότερες πληροφορίες).
### [1.7 Συντόμευση για συνηθισμένα μακριά command lines.]{#ss1.7}
Αυτό που κάναμε για την find μπορούμε να το κάνουμε και για άλλες εντολές όταν υπάρχει ένα αρκετά μακρύ command line που πληκτρολογούμε συχνά. Να μπαίνει δηλαδή
ένα κομμάτι της εντολής που είναι πάντα σταθερό σε μια μεταβλητή του shell ή αν είναι όλη η εντολή σταθερή να μπαίνει όλη σε ένα alias.
Για παράδειγμα, κάθε φορά που διαβάζω ένα ενδιαφέρον ρητό πάω και το προσθέτω σε ένα αρχείο των fortunes. Με τα παρακάτω γλυτώνω πολλή πληκτρολόγηση:
alias addfort='pushd /usr/local/share/games/fortunes;vi quotes;strfile quotes;popd'
Για το rip ενός dvd:
alias dvdrip='for i in `seq 1 $n` ; do mplayer -dvd $i -dumpstream -dumpfile ${i}.stream ; done'
Αφού πρώτα θέσουμε τον αριθμό τίτλων του dvd, τους κάνουμε όλους rip με μια εντολή:
% n=3;dvdrip
Το παραπάνω μπορούσε να γίνει πιο απλά με μια συνάρτηση:
dvdrip() { for i in `seq 1 $1` ; do mplayer -dvd $i -dumpstream -dumpfile ${i}.stream ; done ;}
οπότε θα χρειαζόταν απλά:
% dvdrip 3
### [1.8 Διάφορα]{#ss1.8}
alias h='history '
alias he='head '
alias t='tail '
alias j='jobs -l '
Γλυτώνουμε πληκτρολόγηση\...
alias ejclcd='eject /dev/cdrom;sleep 5s;eject -t /dev/cdrom'
Γιατί να πρέπει να κουραζόμαστε να πατάμε το κουμπί του cd όταν μπορεί να το κάνει το λινουξάκι για μας ;-) ejclcd, βγαίνει το πορτάκι, βάζουμε το δισκάκι,
κλείνει μόνο του.
ssdu() { ls -AQ|xargs du -sb|sort -rn|cut -f 2|awk '{print "\"" $0 "\""}'|xargs du -sh ; }
ssdus() { while test "$1";do du -sb "$1";shift;done|sort -rn|cut -f 2|awk '{print "\"" $0 "\""}'|xargs du -sh ; }
Να κάτι πιο εξεζητημένο: Η ssdu δείχνει, σε φθίνουσα σειρά, πόσο χώρο χρησιμοποιεί, σε kB/MB/GB, κάθε στοιχείο (αρχείο ή κατάλογος) του τρέχοντος καταλόγου. Και
αν θέλετε για συγκεκριμένα αρχεία/καταλόγους μονο, η ssdus παίρνει και ορίσματα.
Βασική ιδέα είναι να τρέξει πρώτα η du για να μας δώσει λίστα αρχείων και καταλόγων ταξινομημένων κατά μέγεθος. Στη συνέχεια για κάθε στοιχείο της λίστας,
παίρνουμε το όνομα και δείχνουμε μαζί και το μέγεθός του σε kB/MB/GB.
### [2. Shell prompt]{#s2}
Το command prompt του shell μπορεί να μας παρέχει σημαντικές πληροφορίες. Π.χ. βάζοντας στο \~/.bashrc τη γραμμή:
export PS1='\u \w (\#)% '
θα πάρουμε ένα prompt του τύπου:
manolis /usr/local/bin (15)%
που μας δείχνει το όνομα του χρήστη, τον τρέχοντα κατάλογο και τον αριθμό των εντολών που έχουμε πληκτρολογήσει. (Ο αριθμός αυτός είναι χρήσιμος για την εντολή
[history](04_tips-1.html#history)).
Το shell μας δίνει τη δυνατότητα να εμφανίσουμε στο prompt ένα σωρό χρήσιμα πράγματα, όπως το hostname (/h), τον αριθμό των εργασιών που τρέχουν στο υπόβαθρο
(/j), την ημερομηνία και ώρα (/d, /t). Φυσικά πρέπει να επιλέξει κανείς μόνο όσα πραγματικά είναι χρήσιμα γιατί ένα πολύ μακρύ prompt δυσχεραίνει τη χρήση του
τερματικού.
Μπορούμε να τρέξουμε ακόμα και ένα πρόγραμμα και να δείξουμε την έξοδό του στο prompt. Δώστε \"PS1=\'\`uptime\` % \'\" χωρίς τα εισαγωγικά. Δοκιμάστε επίσης
\"PS1=\'\\n\`fortune\`\\n \$ \'\" Κάπως περίεργο, αλλά έχει πλάκα. 8-)
Για περισσότερες πληροφορίες, man bash, section PROMPTING.
### [3. Vi (=very intelligent) editor]{#s3}
Κατ\' αρχάς διαβάστε τα tips που δίνονται στα τεύχη 22 και 27 του magaz.
Έχω βάλει στο \~/.vimrc μου τα εξής:
map <F1> :w<CR>
map <F2> j.
map <F5> :bp<CR>
map <F6> :bn<CR>
map <F7> :files<CR>
map <F8> :bdelete<CR>
Κάνουμε map:
- Στο f1 το σώσιμο του αρχείου. Έτσι θα είναι πιο εύκολο να το πατάμε όλη την ώρα! Ποτέ δεν ξέρεις πότε θα χτυπήσει ο δίσκος ή θα κοπεί το ρεύμα (όποιος έχει
καεί\...).
- Στο f2 την εντολή \'j.\' κάνει τα εξής: Κατεβαίνει μια γραμμή (j) και επαναλαμβάνει την προηγούμενη ενέργεια αλλαγής/διόρθωσης κειμένου (.). Αυτό είναι
χρήσιμο για να επαναλάβουμε σε πολλές γραμμές την ίδια αλλαγή με ελάχιστο κόπο.
- Στα f5 και f6: Μεταφορά στο προηγούμενο και στο επόμενο αρχείο που είναι φορτωμένο στον vi αντίστοιχα. (Θυμίζω ότι με \':e file\' μπορούμε να ανοίξουμε ένα
αρχείο μέσα από τον vi. Και μάλιστα, διαθέτει και autocomplete όπως το shell!)
- Στο f7: Λίστα με όλα τα αρχεία που είναι φορτωμένα
- Στο f8: κλείνουμε το τρέχον αρχείο.
Επίσης,
- με την εντολή \':set tw=n\' μπορούμε να θέσουμε το μήκος του κειμένου. Το κείμενο που θα πληκτρολογούμε στο εξής θα αναδιπλώνεται αυτόματα χωρίς να
ξεπερνάει το μήκος που ορίσαμε.
- Με την εντολή \'gqip\' ο vi αναλαμβάνει να μορφοποιήσει την τρέχουσα παράγραφο σύμφωνα με το μήκος κειμένου που έχουμε ορίσει.
Για περισσότερα για κάθε εντολή, \'help command\' μέσα στο περιβάλλον του vi.
### [4. Screen]{#s4}
Η screen είναι ένα πολύ χρήσιμο πρόγραμμα που μας δίνει τη δυνατότητα να έχουμε σε ένα τερματικό πολλές οθόνες.
Τρέχουμε τη screen και φαίνεται να μας ανοίγει ένα νέο shell. Πατώντας \'Ctrl-A w\' (Control και A μαζί και στη συνέχεια τα αφήνουμε και πατάμε w) φαίνονται οι
οθόνες που έχουμε. Στην προκειμένη είναι μόνο μία: η νούμερο 0 με τίτλο \'bash\'. Μπορούμε να διορθώσουμε τον τίτλο πατώντας \'Ctrl-A A\'.
Πατώντας \'Ctrl-A c\' φτιάχνουμε μια καινούρια οθόνη. Άλλος τρόπος έιναι δίνοντας screen (όταν βρισκόμαστε ήδη μέσα στη screen, φτιάχνει μια καινούρια οθόνη,
δεν τρέχει νέο στιγμιότυπο της screen). Μπορούμε με \'screen -t title\' να της δώσουμε και τίτλο.
Ο πιο απλός τρόπος να τερματίσουμε μια οθόνη είναι να κάνουμε logout από το shell της.
Με \'Ctrl-A n\' μεταφερόμαστε στην οθόνη με αριθμό n. Με \'Ctrl-A Ctrl-A\' εναλλασόμαστε μεταξύ της τρέχουσας και της προηγούμενης οθόνης.
Φτιάχνοντας ένα αρχείο \~/.screenrc και προσθέτοντας την παρακάτω γραμμή
caption always "[%n %t]%? (%W)%? (%D %d %M,%c) (%l)"
λέμε στη screen να μας δείχνει στο κάτω μέρος της οθόνης μας τις εξής πληροφορίες:
[0 main] (1 kernel-build) (Sun 03 Aug,13:44) (1.17 1.11 1.04)
- Τον αριθμό και τον τίτλο της τρέχουσας οθόνης σε αγκύλες.
- Τους αριθμούς και τους τίτλους των άλλων οθονών (αν υπάρχουν) σε παρενθέσεις.
- Την ημερομηνία και ώρα.
- Το system load
Με τη screen μπορούμε να το παίζουμε \... σε πολλά ταμπλώ έχοντας μόνο ένα τερματικό ανοιχτό.
Επίσης, άλλη πολύ ενδιαφέρουσα δυνατότητα της screen είναι ότι μπορεί να χωρίσει την οθόνη σε πολλά οριζόντια τμήματα. Σε κάθε ένα από αυτά θα αντιστοιχεί μια
οθόνη, με δυνατότητα ρύθμισης φυσικά του ύψους του καθενός.
- Ctrl-A S για χωρισμό της οθόνης
- Ctrl-A X για καταστροφή τρέχοντος τμήματος
- Ctrl-A Tab για μετάβαση στο επόμενο τμήμα
- Ctrl-A :resize n για αλλαγή του ύψους του τρέχοντος τμήματος σε n γραμμές, (παίρνει και +n,-n για αύξηση ή μείωση κατα n αντιστοίχως).
Τέλος, με τη screen έχουμε τη δυνατότητα να κάνουμε detach και reattach ένα session.
Με (Ctrl-A d) γίνεται το detach, οπότε κλείνει η screen. Το session μας όμως δεν χάθηκε. Δίνοντας screen -ls θα πάρουμε μια έξοδο της μορφής:
There are screens on:
781.pts-0.linux (Attached)
893.pts-3.linux (Attached)
2002.pts-7.linux (Detached)
3 Sockets in /tmp/uscreens/S-manolis.
Με \'screen -r 2002\' (το pid δεν χρειάζεται όταν υπάρχει μόνο ένα detached session) ξανακάνουμε attach το session στο τρέχον τερματικό συνεχίζοντας τη δουλειά
μας ακριβως απο εκεί που την αφήσαμε)
Αν το session δεν είναι detached και δεν έχουμε, για κάποιο λόγο, πρόσβαση σ\' αυτό μπορούμε να χρησιμοποιήσουμε την εντολή \'screen -d -r pid\' η οποία κάνει
πρώτα detach κι ύστερα attach στο τρέχον τερματικό.
Μια περίπτωση στην οποία αυτή η ιδιότητα είναι πολύ χρήσιμη είναι σε remote shells. Ας υποθέσουμε ότι συνδέόμαι με telnet σε ένα απομακρυσμένο unix box και
αρχίζω να κάνω μια δουλειά. Μπορώ ανά πάσα στιγμή να κάνώ detach και να τερματίσώ τη σύνδεση. Όταν αργότερα ξανασυνδεθώ, κάνω attach το προηγούμενο session και
συνεχίζω τη δουλειά μου από εκεί που την άφησα!

1631
content/articles/34/05_rce3.md Κανονικό αρχείο

Το diff αρχείου καταστέλλεται επειδή είναι πολύ μεγάλο Φόρτωση διαφορών