ΧΑΡΟΚΟΠΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ Τμημα Πληροφορικης και Τηλεματικης Τσάμη Παναγιώτα ΑΜ: 20833 ΚΑΤΑΝΕΜΗΜΕΝΑ ΣΥΣΤΗΜΑΤΑ Άσκηση 1 Αθήνα 13-12-2011
Αναφορά Ενότητα 1 A Δημιουργήστε στο φλοιό 3 εντολές (alias) που η καθεμιά θα κάνει τα εξής: Να εμφανίζει τα 5 παλαιότερα κρυφά αρχεία ενός καταλόγου. Να βρίσκει όλα τα αρχεία τα οποία έχουν μέγεθος πάνω από 20000Κ (δείτε την εντολή nd) Να συνδέεται στον water.dit.hua.gr Κώδικας alias lsold='ls -1tA grep '^\.' tail -5' alias nd20m='nd / -size +20000k' alias huaconnect='ssh it20833@water.dit.hua.gr' Περιγραφή Η εντολή alias αναθέτει την εντολή που βρίσκεται μετά το = στο όνομα που γράφουμε πριν το = φτιάχνοντας έτσι μια συντομογραφία της εντολής. Η εντολή ls μας δείχνει την λίστα των περιεχομένων του καταλόγου στον οποίο βρισκόμαστε. Χρησιμοποιούμε σαν παράμετρο στην ls το 1 (ls -1) το οποίο μας εξασφαλίζει την κατακόρυφη στοίχιση των περιεχομένων του καταλόγου. Μια άλλη παράμετρος που χρησιμοποιούμε είναι το t το οποίο μας ταξινομεί χρονικά τα περιεχόμενα του καταλόγου, βάζοντας το πιο πρόσφατο στην κορυφή. Με την παράμετρο Α εμφανίζουμε και τα κρυφά αρχεία του καταλόγου εκτός από τα. και τα.. που εμφανίζονται αν βάλουμε σαν παράμετρο το α. Το περνά σαν παράμετρο στην δεξιότερη εντολή αυτά που βρίσκονται αριστερά. Το grep ψάχνει ενώ το ^ είναι regular expression και δηλώνει στο grep να ψάξει τα αρχεία που ξεκινάνε με τελεία (.). Τέλος το tail σύμφωνα με την παράμετρο του (tail - 5) μετρά από το τέλος της λίστας 5 αρχεία. Η εντολή nd βρίσκει στον συγκεκριμένο κατάλογο που του δίνεις με παράμετρο το μέγεθος τα αρχεία που έχουν μέγεθος πάνω από 20000Κ (- size +20000k).
Το ssh είναι μια εντολή που μας εξασφαλίζει σύνδεση σε ένα ασφαλές κέλυφος. Συνεπώς αν την χρησιμοποιήσουμε και έπειτα γράψουμε το username μας (πχ. It20833) και @ μπροστά από το water.dit.hua.gr, τότε θα μπορέσουμε να συνδεθούμε σε ένα ασφαλές κέλυφος εκεί πληκτρολογώντας τον κωδικό μας. B Γράψτε ένα shell script που να δείχνει τις παρακάτω πληροφορίες τον συνδεδεμένο χρήστη αυτή τη στιγμή τον τρέχοντα φλοιό το home directory την τιμή της μεταβλητής PATH τον τρέχοντα κατάλογο εργασίας πόσοι χρήστες είναι συνδεδεμένοι αυτή τη στιγμή στο μηχάνημα και να τις αποθηκεύει σε αρχείο με όνομα userinfo-1-12-2011 (το οποίο θα συμπεριλαμβάνει την τρέχουσα ημερομηνία) Κώδικας #!/bin/sh echo "- You are `whoami` - Your shell is $SHELL - Your home directory is $HOME - Your PATH environment variable is $PATH - Working directory: $PWD - There are `who wc -l` user(s) currently logged in" > userinfo-`date +%d-%m- %Y` Περιγραφή Η εντολή echo τυπώνει ό,τι βρίσκεται μέσα στα αυτάκια της. Η εντολή whoami τυπώνει το όνομα του χρήστη που είναι συνδεδεμένος στο κέλυφος. Τα `` μέσα στα οποία βρίσκεται το whoami υπάρχουν για να δηλώνουν στην echo πως ό,τι βρίσκεται μέσα σ αυτά είναι μια εντολή που εκτελείται. Η μεταβλητή περιβάλλοντος $HOME όταν καλείται τυπώνει το home μας. Η μεταβλητή περιβάλλοντος $PATH δείχνει το μονοπάτι στο οποίο βρισκόμαστε. Η μεταβλητή περιβάλλοντος $PWD μας δείχνει τον τρέχοντα κατάλογο εργασίας. Τέλος, η εντολή who μας δείχνει ποιοι χρήστες βρίσκονται συνδεδεμένοι στον συγκεκριμένο υπολογιστή, το περνά σαν παράμετρο στην
δεξιότερη εντολή αυτά που βρίσκονται αριστερά\, το wc μετρά λέξεις και το l σαν παράμετρο μετρά σειρές και το > κάνει redirect το αποτέλεσμα μιας εντολής σε ένα αρχείο με όνομα userinfo-τρέχουσα ημερομηνία την οποία παίρνει με το format -`date +%d-%m-%y`. Ενότητα 2 Δημιουργήστε ένα shell script με όνομα even_odd το οποίο να παίρνει σαν όρισμα ένα όνομα αρχείου και να δημιουργεί 2 ξεχωριστά αρχεία, τα even και odd, στα οποία θα γράφει στο πρώτο τις ζυγές γραμμές του αρχικού αρχείου και στο δεύτερο τις μονές. Θα πρέπει να κάνετε όλους τους απαραίτητους ελέγχους. Κώδικας #!/bin/sh le=$1 # Check if the le is a valid le if [ -z $le ]; then echo "Error: No input le given" exit 1 if [! -f $le ]; then echo "Error: $le is not a le" exit 2 if [! -r $le ]; then echo "Error: $le is not readable" exit 3 # Delete from $le all even lines (every 2 lines starting from 0th line) # And write the result to odd sed '0~2d' $le > odd # Delete from $le all odd lines (every 2 lines starting from 1st line) # And write the result to even sed '1~2d' $le > even echo "`cat odd wc -l` lines were written to 'odd'. `cat even wc -l` lines were written to 'even'."
Περιγραφή Αρχικά εκχωρούμε την μεταβλητή $1 στο le. Έπειτα ελέγχουμε αν το αρχείο αυτό είναι έγκυρο ανοίγοντας μια if στην οποία με την παράμετρο z βλέπουμε αν το αρχείο υπάρχει, αλλιώς τυπώνει σχετικό error. Μετά ελέγχουμε αν δεν είναι αρχείο αυτό που μας έχει δώσει ο χρήστης με την παράμετρο f και πετάμε σχετικό error. Στη συνέχεια ελέγχουμε αν το αρχείο αυτό δεν είναι αναγνώσιμο με την παράμετρο r και τυπώνει σχετικό error. Με την εντολή sed κάνουμε μετατροπή και φιλτράρισμα του κειμένου ενώ το d σβήνει τη γραμμή στην οποία βρίσκεται κάθε φορά. Το 0~2 και το 1~2 μας λέει πως η εντολή sed σβήνει κάθε σειρά του κειμένου ξεκινώντας από την σειρά 0 με βήμα 2 και ξεκινώντας από τη σειρά 1 με βήμα 2 κρατώντας τις μονές και τις ζυγές σειρές του αρχείου αντίστοιχα και τα περνάει στον φάκελο odd και even σύμφωνα με τα παραπάνω. Τέλος, τυπώνουμε το πλήθος των μονών και των ζυγών σειρών που βρέθηκαν χρησιμοποιώντας την εντολή cat με την οποία βλέπουμε το περιεχόμενο ενός αρχείου και μετρώντας τις σειρές που βρέθηκαν σε κάθε αρχείο με την εντολή wc με παράμετρο το l. Ενότητα 3 Nα δημιουργήσετε ένα shell script με ονομα synchronize, το οποίο θα συγχρονίζει με τη χρήση της εντολής rsync τα αρχεία σας από εναν υπολογιστή στον τοπικό υπολογιστή ή και το αντίστροφο. Το script θα ζητάει από το χρήστη τα εξής ορίσματα : Τον κατάλογο πηγή Τον κατάλογο στόχο Η μεταφορά απαιτεί οι δύο υπολογιστές να έχουν εγκατεστημένο το ssh και στον υπολογιστή που θα εκτελείται το script να υπάρχει η εντολή rsync. Για να καθορίσετε τον φάκελο πηγή, όταν δίνετε τα ορίσματα θα προηγείται το -from και για να καθορίσετε τον φάκελο στόχο θα προηγείται το -to. Για να καθορίσετε τον απομακρυσμένο υπολογιστή θα δίνετε είτε την IP (π.χ. 83.212.240.195) διεύθυνση είτε το hostname (π.χ. water.dit.hua.gr). Δώστε τις κατάλληλες παραμέτρους της εντολής rsync (π.χ. να εμφανίζει τη λίστα των αρχείων που συγχρονίζονται). Παράδειγμα: syncronize -from water.dit.hua.gr:/home/it20900/desktop -to /home/user/desktop θα συγχρονίζει τον φάκελο /home/it20900/desktop του απομακρυσμένου μηχανήματος με το φάκελο /home/user/desktop του τοπικού. Τέλος, θα κρατείται ένα log με τις μεταφορές που έγιναν, το οποίο θα αποθηκεύεται στο home directory του χρήστη με όνομα syncronize_log. Οι εγγραφές του log θα είναι της μορφής: Thu Dec 1 13:54:48 EET 2011 : syncronization from water.dit.hua.gr:/home/it20900/desktop to /home/user/desktop Φροντίστε να κάνετε ελέγχους και να ενημερώνετε το χρήστη σε περιπτώσεις σφάλματος.
Κώδικας #!/bin/sh while [ -n "$1" ] do if [ $1 = "-from" ]; then shift from=$1 elif [ $1 = "-to" ]; then shift to=$1 shift done if [ -z $to ] [ -z $from ]; then echo "Error: You must provide both -from and -to values" exit 1 rsync -arv $from $to echo "`date` : syncronization from $from to $to" >> ~/synchronize_log Περιγραφή Χρησιμοποιούμε μια while και λέμε πως όσο η πρώτη μεταβλητή $1 δεν είναι κενή τότε να ελέγχουμε: 1. αν η μεταβλητή έχει σαν παράμετρο το from τότε με το shift πηγαίνουμε μια θέση δεξιά στις μεταβλητές (ορίζοντας έτσι ως $1 την επόμενη μεταβλητή) και την αναθέτουμε στο from. 2. αν η μεταβλητή έχει σαν παράμετρο το to τότε με το shift πηγαίνουμε μια θέση δεξιά στις μεταβλητές (ορίζοντας έτσι ως $1 την επόμενη μεταβλητή) και την αναθέτουμε στο to. Έπειτα ελέγχουμε αν οι μεταβλητές που ανατέθηκαν στο from και στο to είναι μηδέν και πετάμε σχετικό error. Τέλος, χρησιμοπούμε την εντολή rsync η οποία συγχχρονίζει αρχεία με τις εξής μεταβλητές: 1. την a η οποία διατηρεί όλα τα δικαιώματα που υπήρχαν στα αρχεία τα οποία συγχρονίστηκαν. 2. την r η οποία συγχρονίζει και όλους τους υποκαταλόγους καθώς και τα αρχεία τους. 3. την v η οποία εμφανίζει τη λίστα των αρχείων που συγχρονίζονται.
και με την echo τυπώνουμε την ημερομηνία και τα ονόματα των φακέλων που συγχρονίστηκαν και τα προσθέτουμε με τα >> στον φάκελο synchronize_log.