ΧΑΡΟΚΟΠΕΙΟ ΠΑΝΕΠΙΣΤΗΜΙΟ ΤΜΗΜΑ ΠΛΗΡΟΦΟΡΙΚΗΣ & ΤΗΛΕΜΑΤΙΚΗΣ Αβδέλαρου Κωνσταντίνα 1 η Εργασία στο μάθημα Λειτουργικά Συστήματα Ταύρος, 9 Δεκεμβρίου 2014
Άσκηση 1.1 Το shell script που δημιουργήθηκε είναι: #!/bin/bash select CHOOSE in "Name & Command" "Size" "Disk Usage & Free Space" "Full Path" "Files Modified Last Hour or Day" "Exit" do case $CHOOSE in "Name & Command") echo "Give a filename or path: " read filename echo "Give command: " read command find. -name $filename xargs $command "Size") echo "Give size (MB): " read size ((size=size*1048576)) size=$size+c find. -size +$size -exec ls -lh {} \; more "Disk Usage & Free Space") echo "Disk Usage: " du -s -h -a ~ who -m grep "10.100.51.*" > vpn a=`wc vpn awk '{print $1}'` if [ "$a" -eq 0 ]; then echo "You are not in lab" else echo "You are in lab" x=`du -s -k -a awk '{print $1}'` if [ $x \< 1048576 ]; then ((x=$x/1024)) ((o=$x\*100)) ((e=$o/5))
((e=$e/1000)) ((r=100-$e)) echo "Used Space: $e % and Free Space: $r %" else ((x=$x\*100)) ((e=$x/5)) ((e=$e/1000000)) ((r=100-$e)) echo "Used Space: $e % and Free Space: $r %" fi fi "Full Path") ls -d -1 $PWD/* more "Files Modified Last Hour or Day") echo "For last day choose 1 or For last hour choose 2" read choice day=`date awk '{print $3}'` month=`date awk '{print $2}'` hour=`date +%H` min=`date +%M` var=`tz=gmt-1 date +%H` if [ "$choice" -eq 1 ]; then ls -ltr grep " $day " grep $month grep ":" more elif [ "$choice" -eq 2 ]; then ls -ltr grep " $day " grep $month grep "$hour:" more ls -ltr grep " $day " grep $month grep "$var:" more fi "Exit") break *) echo "ERROR: Invalid selection" esac done
Σχόλια/Παρατηρήσεις 1. Αρχικα χρησιμοποιουμε την εντολη select για να δημιουργησουμε το απαιτουμενο μενου ενεργειων και οριζουμε τις αντιστοιχες επιλογες που χρειαζομαστε. Με τη χρηση της case οριζουμε καθε μια επιλογη να αντιστοιχει σε ενα συνολο ενεργειων. 2. Στη πρωτη επιλογη ζητουμενο ειναι να εφαρμουζουμε μια εντολη στα αρχεια του τρεχοντος καταλαγου και στου υποκαταλογους, ζηταμε επομενως απο το χρηστη να μας δωσει ενα ονομα αρχειου ή ενα path, και την αντιστοιχη εντολη που θελει να εκτελεσουμε στο αρχειο ή το path. Επειτα, αφου διαβασουμε τα στοιχεια που μας δινει ο χρηστης, με τη βοηθεια της find, ελεχουμε τον τρεχοντα καταλογο και τους υποκαταλογους του (find.) και αναζηταμε το ονομα του αρχειου που μας δοθηκε (find. name $filename). Με τη βοηθεια της xargs τρεχουμε την αντιστοιχη εντολη που μας εχει ζητηθει (xargs $command). 3. Στο δευτερο υποερωτημα της ασκησης και αντιστοιχα στη δευτερη επιλογη του μενου ενεργειων, ζητειται να βρισκουμε για τον τρεχοντα χρηστη αρχεια τα οποια εχουν μεγεθος μεγαλυτερο απο μια τιμη. Επομενως, ζηταμε απο το χρηστη να μας δωσει το μεγεθος που θελει σε MB και επειτα μετατρεπουμε τα MB σε byte (size=size*1048576), και προσθετουμε σε αυτον τον αριθμο το c. Με τη χρηση της find ψαχνουμε στους καταλογους και μολις βρουμε το size που θελουμε (find. size $size) εκτελουμε την ls ( exec ls lh {} \; ), οπου απο lh {} \; το l χρησιμοποιειται διοτι θελουμε να εμφανισουμε ολοκληρο το ονομα, τα δικαιωματα, τον τυπο, τον ιδιοκτητη, το μεγεθος, τις μερες τροποποιησης και το ονομα του αρχειου, το h χρησιμοποιειται για να εμφανιστουν τα μεγεθη σε μορφη ευαναγνωστη (K,M,G etc). Τελος, για να λειτουργησει σωστα η εντολη, επειτα απο ερευνα βρηκα οτι χρειαζεται να προσθεσω και το {} \; που βοηθαει στο να εντοπισει τα σωστα αρχεια. 4. Στο τριτο ερωτημα μας ζητειται να εμφανισουμε το χωρο που χρησιμοποιειτε και το ποσοστο χρησης του. Για να βρουμε το χωρο που χρησιμοποιουμε στο δισκο εκτελουμε την εντολη (du s h a ~) οπου η du εμφανιζει καθε αρχειο που εχουμε στον υπολογιστη και τον χωρο που κατεχει στο δισκο και στο τελος το τελικο αθροισμα που εχουν τα αρχεια σε bytes. Το s μας εμφανιζει μονο το τελικο αθροισμα χωρις να μας εμφανισει τη λιστα με ολα τα αρχεια. To h μας εμφανιζει το αθροισμα σε τροπο πιο ευαναγνωστο (K,M,G etc) και το a περιλαμβανει ολα τα αρχεια. Το ~ χρησιμοποιειται για να δηλωσουμε διπλα απο το χωρο που χρησιμοποιουμε, σε ποιο path βρισκομαστε. Επιπροσθετα, με την εντολη (who m grep 10.100.51.* >vpn) ελεγχουμε αν ειμαστε συνδεδεμενοι και απο που ειμαστε συνδεδεμενοι στο εργαστηριο, αν το ip μας ειναι της μορφης 10.100.51.* τοτε κανουμε ανακατευθυνση στο αρχειο vpn την συνδεση μας, δηλαδη το αρχειο θα περιεχει μεσα οτι συνδεθηκαμε απο το εργαστηριο. Επομενως, αν το αρχειο μας θα περιεχει κατι διαφορετικο απο το 0, αυτο σημαινει οτι θα ειμαστε
συνδεδεμενοι απο το εργαστηριο. Με το (a=`wc vpn awk {print $1} `) παιρνουμε την πρωτη στηλη της wc που ειναι ποσες γραμμες εχει μεσα το αρχειο vpn και τον αριθμο αυτον τον μεταβιβαζουμε στην μεταβλητη a. Αν η a ειναι ιση με 0 τοτε δεν βρισκομαστε στο εργαστηριο, ενω αν ειμαστε τοτε βρισκομαστε οποτε συνεχιζουμε την διαδικασια για να βρουμε το ποσοστο.οποτε χρησιμοποιουμε την εντολη (x=`du s k a awk '{print $1}'`) προκειμενου να παρουμε αρχικα το αθροισμα του χωρου σε kilobytes (du s k a) και επειτα, επειδη το αποτελεσμα ειναι σε δυο στηλες, χρησιμοποιουμε την (awk '{print $1}') για να κρατησουμε στη μεταβλητη x μονο την πρωτη στηλη, δηλαδη μονο τον αριθμο των kilobytes. Τωρα θα πρεπει να ελεγξουμε αν τα kilobytes αυτα αντιστοιχουν σε MB ή σε GB κανοντας εναν απλο ελεγχο για να ειναι το x μικροτερα του 1048576=1GΒ. Αν ειναι μικροτερο τοτε αναφερομαστε σε Mb οποτε διαιρουμε τν αριθμο με το 1024 για να τον μετατρεψουμε σε gb και επειτα με την μεθοδο των τριων, πολλαπλασιαζουμε τν αριθμο με το 100, τον διαιρουμε με το 5 (συνολικος χωρος) και το αποτελεσμα το διαιρουμε με το 1000 για να βρουμε ποσοστο. Επειτα απο το 100 αφαιρουμε αυτο που βρηκαμε για να βρουμε τον ελευθερο χωρο και εμφανιζουμε τα αντιστοιχα αποτελεσματα. Αν τωρα εχουμε GB αντι για MB τοτε απλα πολλαπλασιαζουμε τα Gb με το 100, τα διαιρουμε με το 5 και επειτα διαιρουμε με το 1000000. Στη συνεχεια κανουμε παλι την αφαιρεση για τον ελευθερο χωρο και εμφανιζουμε τα αποτελεσματα. 5. Στο τεταρτο ερωτημα πρεπει να τυπωσουμε τα αρχεια του τρεχοντος καταλογου με full path. Με την εντολη (ls d 1 $PWD/* more) επιτυχανεται το απαιτουμενο αποτελεσμα. Η ls μας δειχνει τα αρχεια του καταλογου, το d διλωνει οτι ειναι directory, το $PWD δηλωνει που βρισκομαστε, το /* εμφανιζει μονο τα αρχεια του τρεχοντος καταλογου πχ. /home/it21301, αν θελαμε και τα αρχεια των υποκαταλογων θα γραφαμε ( ls d 1 $PWD/**/* more). 6. Στο πεμπτο ερωτημα πρεπει να τυπωνουμε τα αρχεια που εχουν τροποποιηθει την τελευταια ωρα και μερα. Αφου διαβασουμε την αποφαση του χρηστη (1 ή 2) αναθετουμε τιμες. Η εντολη date μας εμφανιζει ολη την ημερομηνια. Με την εντολη (day=`date awk '{print $3}'`) αναθετουμε στην μεταβλητη day μονο την ημερα(1 30), με την (month=`date awk '{print $2}'`) αναθετουμε στην μεταβλητη month μονο τον μηνα (Jan Dec), με την (hour=`date +%H`) αναθετουμε στην μεταβλητη hour μονο την ωρα(0 24), με την (min=`date +%M`) αναθετουμε στην μεταβλητη min μονο τα λεπτα (0 59) και με την (var=`tz=gmt 1 date +%H`) αναθετουμε στην μεταβλητη var την ωρα 1, δηλαδη μια ωρα πισω. Αν ο χρηστης εχει επιλεξει να δει τα αρχεια για την τελευταια μερα τοτε χρησιμοποιειται η εντολη (ls ltr grep " $day " grep $month grep ":" more) οπου μας εμφανιζονται τα αρχεια της ls που εχουν την αντιστοιχη μερα και μηνα, ομως επειδη ειναι πιθανο να εμφανιστουν και τα αρχεια του αντιστοιχου μηνα των προηγουμενων ετων κανουμε ελεγχο να εχουμε και : ωστε να ξερουμε οτι το αρχειο ειναι φετινο. Αν επιλεξουμε να δουμε τα αρχεια της τελευταιας ωρας χρησιμοποιουμε τις εντολες (ls ltr grep " $day " grep $month grep "$hour:" more) και (ls ltr grep " $day " grep $month grep "$var:" more) οπου ειναι παρομοιες μονο που στο τελευταιο grep της πρωτης ελεγχουμε ωστε η ωρα να ειναι αυτη που εχουμε τωρα και της δευτερης να ειναι η προηγουμενη. 7. Χρησιμοποιουμε και μια εκτη εντολη για να τερματισουμε το μενου και την ασκηση
8. Εχουμε χρησιμοποιησει και μια εβδομη εντολη οπου αν ο χρηστης δεν δωσει μια απο τις απαιτουμενες εντολες 1 6 να εμφανισει μηνυμα λαθους. Με δυσκόλεψε / δεν υλοποίησα ΔΥΣΚΟΛΙΑ 1. Αρχικα το να βρω το size στο δευτερο ερωτημα με δυσκολεψε αρκετα, γι αυτο και ζηταω απο το χρηστη να μου δινει το size μονο σε MB, διοτι δεν γνωριζω πως αλλιως να υλοποιησω την ασκηση αν μου δωσει GB, ή KB. 2. Παρομοιο προβλημα αντιμετωπισα και για το ποσοστο του τριτου ερωτηματος διοτι επρεπε με καποιο τροπο να διωξω την καταληξη απο την εντολη du s h, και αφου καταφερα να βρω εναν τροπο να προσπερασω αυτο το εμποδιο, επειτα επρεπε να σκεφτω την περιπτωση των MB και GB και αναλογα να κανω τις πραξεις, οι οποιες πραξεις ηταν αυτο που στην ουσια με δυσκολεψε περισσοτερο γιατι τα αποτελεσματα ειναι δυσκολο να βρεθουν βαση μαθηματικων. Επισης, ειχα μεγαλο μπερδεμα με το ποσοστο που εμφανιζοταν με την df για το capacity. 3. Επισης μεγαλο προβλημα ειχα οταν επρεπε να βρω τα αρχεια της τελευταιας ωρας. Ειδικα για τα λεπτα τα οποια δεν μπορουσα να τα βαλω στην αναζητηση. ΥΛΟΠΟΙΗΣΗ Καταφερα να τα υλοποιησω ολα τα ερωτηματα, το μονο που δεν καταφερα να ολοκληρωσω ηταν το δευτερο μισο του πεμπτου ερωτηματος που αφορα την ωρα. Άσκηση 1.2 Το shell script που δημιουργήθηκε είναι: #!/bin/bash echo "Give command" read command type -P $command &>/dev/null
OUT=$? if [ $OUT -eq 0 ];then echo "Command found" $command else echo "Command not found" (find / -name "$command" 2>/dev/null) > u chmod +x u while read line; do type -P $line OUT1=$? if [ $OUT1 -eq 0 ];then var=`dirname $line` export PATH=$PATH:$var echo "PATH=$PATH" >.profile date >> log dirname $var >> log $command fi done < u fi Σχόλια/Παρατηρήσεις 1. Στην ασκηση 2, ζηταμε απο το χρηστη να μας δωσει μια εντολη και επειτα ψαχνουμε αν αυτη η εντολη υπαρχει στο συστημα, δηλαδη αν εκτελειται. Αυτο επιτυγχανεται μεσα απο τη χρηση της (type P $command &>/dev/null ). Το type p $command διαβαζει την εντολη και ελεγχει αν τρεχει, και το >/dev/null κανει ανακατευθυνση τα λαθη σε ενα αλλο αρχειο. Το αποτελεσμα για το αν εκτελειται η οχι η εντολη ($?) δηλαδη αν το $? ειναι 0 (εκτελειται) ή οχι, το μεταβιβαζουμε σε μια μεταβλητη OUT. Αν η OUT ειναι ιση με το μηδεν τοτε θα εμφανισουμε μηνυμα οτι η εντολη υπαρχει ηδη και θα τρεξουμε την εντολη, ενω αν δεν υπαρχει θα εμφανισουμε το αντιστοιχο μηνυμα, και επειτα θα προσπαθησουμε να την εντοπισουμε και συνεχισουμε τις εντολες για την προσθηκη της εντολης στο PATH. 2. Με τη χρηση της find /, θα ψαξουμε σε ολους τους καταλογους να βρουμε την εντολη
ομως επειδη δεν θελουμε ο χρηστης να βλεπει αν σε καποιον καταλογο δεν εχουμε προσβαση, δικαιωματα ή καποιο λαθος, τα λαθη τα ανακατευθηνουμε σε ενα αλλο αρχειο με τη χρηση της 2>/dev/null. Οτι τωρα περισσευει δηλαδη οι εντολες που χρειαζομαστε, αποθηκευονται σε ενα αρχειο ονοματι u. 3. Κανουμε το αρχειο u εκτελεσιμο και επειτα διαβαζουμε γραμμη γραμμη να δουμε αν καθε εντολη μεσα σε αυτο τρεχει. 4. Με τη (type P $line) εκτελουμε καθε γραμμη και το αποτελεσμα της, δηλαδη αν εκτελειται η οχι το αποθηκευουμε στην μεταβλητη OUT1. Αν εκτελειται τοτε το OUT1 θα ειναι ισο με 0 οποτε θα μπει στο if και θα προσθεσουμε την εντολη στο PATH. 5. Στην εντολη var βαζουμε το αποτελεσμα της dirname $line, δηλαδη περνουμε το κομματι που θελουμε απο καθε σειρα. 6. Επειτα κανουμε (export PATH) και αναθετουμε στη PATH την PATH που εχουμε τωρα συν το var που περιεχει το PATH του καταλογου που θελουμε. 7. Επειτα διαβαζουμε το καινουργιο PATH και το αποθηκευουμε καθε φορα στο αρχειο.profile. 8. Στη συνεχεια κραταμε σε ενα αρχειο log την ημερομηνια (date >> log) και τον καταλογο που προσθεσαμε στο PATH (dirname $ var>> log) και επειτα τρεχουμε την εντολη που βρηκαμε. 9. Το while read line τερματιζει οταν το διαβασουμε ολο το αρχειο. Με δυσκόλεψε / δεν υλοποίησα ΔΥΣΚΟΛΙΑ Γενικα αυτη η ασκηση με δυσκολεψε αρκετα, διοτι ειδικα στην αρχη δεν καταλαβαινα τη διατυπωση. Επιπροσθετα, χρειαστηκε να την μελετησω ιδιαιτερα και να κοιταξω ποικιλους διαφορετικους τροπους για να καταληξω σε αυτο το αποτελεσμα. Επισης ειχα μεγαλο θεμα με το PATH και την προσθηκη καθε γραμμης που εκτελειται στο PATH. ΥΛΟΠΟΙΗΣΗ Δεν ξερω αν το προγραμμα ειναι σωστο, διοτι εμενα πολλες φορες τρεχει και δεν μου βαζει το καταλογο που θελω στο PATH, ενω αλλες φορες το βγαζει. Οστοσο φαινεται να τρεχει σωστα
για εντολες οπως nano, netbeans, ls. Άσκηση 1.3 Το cronjob που δημιουργήθηκε είναι: 36 13 * * 0 /home/it21301/script1_3 >> /home/it21301/leitourgika1/apotelesmatakia.txt Το shell script που δημιουργήθηκε είναι: #!/bin/bash x=`date awk '{print $2}'` y=`date awk '{print $6}'` echo $x $y last it21301 grep $x wc -l Σχόλια/Παρατηρήσεις 1. Στην ασκηση 3, δημιουργησα ενα cron job το οποιο τρεχει καθε κυριακη στη μια και τριαντα εξι το μεσημερι. 2. Το cron job τρεχει το script1_3 που εχω δημιουργησει και τα αποτελεσματα του τα αποθηκευει σε ενα αρχειο.txt ονοματι apotelesmatakia μεσα στο φακελο LEITOURGIKA1. 3. Επισης η ανακατευθυνση γινεται >> που σημαινει οτι τα προηγουμενα δεδομενα δεν διαγραφονται, απλα συνεχως προστιθονται καινουργια. 4. Στο αντιστοιχο shell script ανεθεσα στην μεταβλητη x τον τρεχοντα μηνα (x=`date awk '{print $2}'`) και στην μεταβλητη y τον τρεχοντα χρονο (y=`date awk '{print $6}'`)
επειτα εμφανιζω το μηνα και το χρονο πχ Dec 2014. 5. Τελος με τη βοηθεια της last εμφανιζω για το it213 μου τις τελευταιες μου συνδεσεις,ομως επειδη η ασκηση μου ζηταει για το τρεχοντα μηνα, με τη βοηθεια της grep αναζητω στις συνδεσεις μου τον τρεχοντα μηνα και εμφανιζω τον αντιστοιχο αριθμο γραμμων, αρα συνδεσεων με την (wc l). Με δυσκόλεψε / δεν υλοποίησα ΔΥΣΚΟΛΙΑ Η μονη δυσκολια εμφανιστηκε οταν προσπαθησα να ελεγξω αν οι συνδεσεις που φαινονται στη last ειναι μονο φετινες. Η last δεν εμφανιζει χρονολογια οποτε μου ηταν δυσκολο να ελεγξω αν ολες οι συνδεσεις εγιναν φετος, γι αυτο και κατεληξα να χρησιμοποιω μονο το μηνα για την ευρεση των φορων που συνδεθηκα. ΥΛΟΠΟΙΗΣΗ Πιστευω πως αυτη η ασκηση εχει υλοποιηθει σωστα.