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