actions logging και undo στο bash ?

Giorgos Keramidas keramida at ceid.upatras.gr
Mon Feb 20 12:21:42 EET 2006


On 2006-02-20 11:20, Nick Demou <ndemou at gmail.com> wrote:
> Τον τελευταίο καιρό έκανα πολλές επεμβάσεις (εγκαταστάσεις και
> ρυθμίσεις) σε έναν linux server. Ήμουν τυχερός και έκανα μόνο
> ένα λάθος που διορθώθηκε εύκολα. Συνειδητοποίησα όμως πως,
> ειδικά όταν πρέπει να κάνεις πολλές αλλαγές, είναι πολύ εύκολο
> να χαλάσεις κάτι και να μην θυμάσαι τι μπορεί να φταίει.
>
> Το history μου φάνηκε πολύ χρήσιμο αλλά κατάλαβα ότι δεν θα
> είναι πάντα αρκετό. Έψαξα στο google για κάτι πιο πλήρες και
> βρήκα την εντολή script η οποία όμως αν ανοίξεις ένα
> vi/emacs/pico/less/... κτλ γεμίζει σκουπίδια και γίνεται πολύ
> άβολη. Τελικά διαβάζοντας το bash manual page σκαρφίστικά ένα
> κόλπο[1] που σου επιτρέπει να κάνεις ένα history χωρίς πρακτικό
> όριο βάθους χρόνου στο οποίο εκτός από την εντολή καταγράφεται
> και η ώρα εκτέλεσης[2] αλλά και το current directory[2] μέσα
> στο οποίο εκτελέστηκε η εντολή (πολύ σημαντικό όταν βλέπεις
> εντολές του τύπου rm *):
>
> time stamp      command   pwd
> -----------------------------------------------------
> 11/12 09:40     rm afile         /home/user
> ....

Αυτό μοιάζει πολύ με ``BSD process accounting''.  Υπάρχει σαν
επιλογή σε όλα τα λειτουργικά πλέον.  Π.χ. σε Solaris 10 εδώ
πέρα...

    root at orion:/root# lastcomm root
    lastcomm    root     pts/2          0.01 secs Mon Feb 20 12:00
    man         root     pts/2          0.01 secs Mon Feb 20 12:00
    sh          root     pts/2          0.00 secs Mon Feb 20 12:00
    more        root     pts/2          0.00 secs Mon Feb 20 12:00
    sh          root     pts/2          0.00 secs Mon Feb 20 12:00
    mv          root     pts/2          0.00 secs Mon Feb 20 12:00
    [...]

> έτσι έλυσα το πρόβλημα του να ξέρω "πότε έκανα τι". Μου μένουν όμως
> ακόμα δύο πράγματα για να κοιμάμαι πιο ήσυχος:
>
> 1) η rm αντί να σβήνει τα αρχεία να τα κρατάει backup σε κάποιο
> άλλο φάκελο

Αυτό έχει συζητηθεί περίπου 1,234,567,890 φορές σε UNIXολίστες.

Δεν είναι καλή ιδέα, για περίπου 30 διαφορετικούς λόγους! :)

> 2) όλα τα αρχεία κειμένου που ανοίγω με τον text editor (pico)
> να γίνονται backup με timestamp σε έναν άλλο φάκελο

Αυτό γίνεται μόνο στα filesystems που είναι versioned, βλέπε VMS.

Μην παίζεις με aliases & άλλα τέτοια custom hacks, αλλά στήσε ένα
κανονικό version control & revision management σύστημα
(π.χ. Subversion) και κράτα τα αρχεία που θες να έχεις ιστορικό
εκεί.

>  * Υπάρχει κάποιος άλλος στη λίστα με τους ίδιους προβληματισμούς?  Τι
> λύση εφαρμόζει?

Εγώ συνήθως χρησιμοποιώ το RCS όταν υπάρχει.  Η υποστήριξη που
έχει το Emacs για RCS μου δίνει τη δυνατότητα να ανοίγω read-only
configuration files, να πατάω `CTRL-c v v' για να κάνω 'checkout'
ένα read-write αντίγραφο, να κάνω αλλαγές και commit πατώντας
απλά `CTRL-c v v' πάλι.

    $ rlog TODO
    RCS file: RCS/TODO,v
    Working file: TODO
    head: 1.4
    branch:
    locks: strict
    access list:
    symbolic names:
    keyword substitution: kv
    total revisions: 4;     selected revisions: 4
    description:
    ----------------------------
    revision 1.4
    date: 2006/02/18 00:31:40;  author: keramida;  state: Exp;  lines: +4 -3
    Move bug #11473 closer to where the other thirdparty software
    tasks are.
    [...]

>  * Ιδέες για logging χωρίς τα drawbacks της δικιάς μου μεθόδου (βλέπε [2])
>  * Για τα 1), 2) ξέρετε κάτι έτοιμο ή πρέπει να γράψω τα δυο σχετικά
> scripts (μου έκανε εντύπωση που δεν βρήκα κάτι στο πρώτο googling
> around αλλά μπορεί να ήμουν και πολύ νυσταγμένος :-) )?

Πρέπει να φτιάξεις δικά σου scripts.  Τα οποία δε θα παίζουν στο
δίπλα μηχάνημα.  Ή θα ξεχάσεις να τα κάνεις update μετά από ένα
μήνα.  Ή θα τα κάνεις υpdate, αλλά θα ξεχάσεις να τα
ξανα-ενεργοποιήσεις στα default aliases του root.  Ή θα αρχίσεις
να επαναπαύεσαι ότι σου δίνουν ασφάλεια και θα τρέξεις κατά λάθος
ένα πρόγραμμα που πειράζει απευθείας τα configuration files, και
θα αναρωτιέσαι γιατί δεν έχεις ιστορικό για κάποια αλλαγή.  Η θα
τρέξεις το Foobar utility που δεν τρέχει "/bin/sh rm" αλλά κάνει
unlink απευθείας ένα αρχείο και θα αναρωτιέσαι γιατί έσβησε χωρίς
να σε ρωτήσει ή να κρατήσει backup.

Τώρα πλέον έχουν αρχίσει και υλοποιούνται σιγά σιγά λύσεις για
accounting & auditing, αλλά δεν ξέρω σε τι επίπεδο βρίσκεται η
υποστήριξη σε Linux και σίγουρα δεν ξέρω κάτι που να υποστηρίζει
με Σωστό Τρόπο(ΤΜ) file revisions σε οποιοδήποτε UNIX filesystem.

> [1] αρκεί να έχεις αυτό το one-liner στο .bashrc  (και ενεργοποιημένο
> το history με depth τουλάχιστον 1):
> PROMPT_COMMAND='echo -ne $(date +%d-%m_%H:%M)"\t" >> /${HOME}/.hist;
> echo -ne $(history 1 | sed "s/^ *[0123456789]* *//")"\t" >>
> /${HOME}/.hist; pwd >> /${HOME}/.hist'
>
> (η παραπάνω εντολή εκτελείται ΠΡΙΝ από κάθε άλλη εντολή που εισάγουμε
> στο bash και δημιουργεί τις γραμμές του αρχείου ~/.hist)

Και δεν παίζει αν κάποιος έχει tcsh για default shell.

> [2] για την ακρίβεια ή ώρα και το current dir αφορούν στην στιγμή που
> εκτελέστηκε η αμέσως επόμενη εντολή από το bash. Επίσης δεν
> καταγράφεται η τελευταία εντολή κάθε session.

Ακριβώς :)

Και δεν καταγράφεται ποτέ η εντολή:

    $ exec rm -fr ~/.bash_history ~/.hist

Ο λόγος για τον οποίο αυτή η εντολή δεν καταγράφεται, εκτός κι αν
καταφύγεις σε read-only ή append-only file attributes, αφήνεται
ως άσκηση στον αναγνώστη.




More information about the Linux-greek-users mailing list