Επεξεργασία δικαιωμάτων αρχείων με χρήση Bash/C  Στα πλαίσια του μαθήματος αλλά και εκτός θα χρειαστεί να τροποποίησετε τα δικαιώματα πρόσβασης ενός αρχείου λίγες έως πολλές φορές.  BASH: Αυτό μπορεί εύκολα να επιτευχθεί στη bash με την εντολή chmod. H σύνταξη της chmod έχει ως εξής:  chmod options permissions filename Options: -R: Εκτελεί την εντολή αναδρομικά σε πολλά αρχεία. (Παραδείγματα παρακάτω) -f: Εκτελεί την εντολή σε σιωπηλή λειτουργία, κρύβει τα περισσότερα error messages. -v: Εμφανίζει λεπτομερές output για κάθε αρχείο στο οποίο εκτελείται η εντολή. --reference=RefFile: Αγνοεί τα δοσμένα permissions και θέτει στο αρχείο τα ίδια permissions με το RefFile. --help: Επιστρέφει ένα "συνοπτικό" μήνυμα με βοήθεια για την σύνταξη και εκτέλεση της εντολής (εναλλακτικά χρησιμοποιήστε την εντολή "man chmod" για περισσότερες πληροφορίες) Permissions: Υπάρχουν δυο τρόποι σύνταξης των permissions. Θα χρησιμοποιήσουμε τον ακόλουθο chmod 750 test.c όπου τα permissions εκφράζονται από τον αριθμό 750. Υπάρχουν τρεις κατηγορίες χρηστών. User: Ο χρήστης που εκτελεί την εντολή. Group: Οι χρήστες που ανήκουν στην ίδια ομάδα (ή ομάδες) που ανήκει και ο χρήστης που εκτελεί την εντολή (αν ανήκει σε κάποια). Other: Οι υπόλοιποι χρήστες. Υπάρχουν τρεις κατηγορίες δικαιωμάτων: Read: Ο χρήστης έχει δικαίωμα να διαβάσει το αρχείο. Write: Ο χρήστης έχει δικαίωμα να τροποποιήσει το αρχείο. Execution: Ο χρήστης έχει δικαίωμα να εκτελέσει το αρχείο. Ο παραπάνω αριθμός 750 αποτελείται από τρία ψηφία. Το καθένα από αυτά αντιστοιχεί σε μια από τις παραπάνω κατηγορίες χρηστών. Το πρώτο ψηφίο αντιστοιχεί στον User, το δεύτερο στο Group και το τρίτο στους υπόλοιπους (Other). Καθένα από αυτά τα ψηφία μπορεί να εκφραστεί με 3 bit. Το 7 για παράδειγμα μπορεί να εκφραστεί ως 111 Από τα παραπάνω τρία bit το πρώτο bit αντιστοιχεί στο δικαίωμα read, το δεύτερο στο δικαίωμα write και το τελευταίο στο δικαίωμα εκτέλεσης. Επειδή και τα τρίτο bit έχουν την τιμή 1 σημαίνει ότι ο χρήστης έχει δικαίωμα και διαβάσματος και τροποποίησης και εκτέλεσης. Στην περίπτωση του αριθμού 5 εκφράζεται με τα bits 101, πράγμα που σημαίνει ότι οι χρήστες των group (εξηγήθηκε παραπάνω) έχουν δικαιώματα διαβάσματος και εκτέλεσης αλλά όχι τροποποίησης. Το 0 αντιστοιχεί στον δυαδικό αριθμό με μέγεθος τρία bit 000. Συνεπώς οι υπόλοιποι χρήστες δεν έχουν κανένα από τα παραπάνω δικαιώματα. Παραδείγματα: chmod -R 775 /users/folder/ Θέτει τους user και group να έχουν δικαιώματα read, write και execution και τους υπόλοιπους χρήστες να έχουν μόνο δικαιώματα read και execution. Η εντολή εκτελείται για κάθε αρχείο μέσα στον φάκελο folder. chmod 700 myfile.c Μόνο ο user έχει δικαιώματα r, w και x. chmod --reference=myfile.c anotherfile.c Το anotherfile.c θα αποκτήσει ότι permissions είχε και το myfile.c Επιπλέον σύνδεσμοι: https://en.wikipedia.org/wiki/Chmod http://ss64.com/bash/chmod.html https://linux.die.net/man/1/chmod C: Υπάρχουν δυο κύριες περιπτώσεις όπου ένα πρόγραμμα C θα χρειαστεί να θέσει/αλλάξει permissions. - Κατά την δημιουργία ενός αρχείου. Όταν δημιουργείτε ένα αρχείο στη C, δεν είναι σίγουρο ότι τα permissions Θα είναι επιθυμητά. Αυτό εύκολα μπορεί να εγγυηθεί όμως με την προσθήκη ενός επιπλέον ορίσματος στην συνάρτηση fopen. Παράδειγμα: open(filename, O_RDWR|O_CREAT, 0742) Η τελευταία παράμετρος (0742) δουλεύει με τον ίδιο τρόπο που δούλευε και στην bash. Υπάρχει όμως μια διαφορά, στην C βάζουμε και ένα μηδενικό στην αρχή. Ο λόγος είναι απλός, αφού κάθε ψηφιό αποτελείται από 3 bits και συνεπώς παίρνει τιμές από 0 έως 7, συμβολίζει έναν οκταδικό αριθμό, ΌΧΙ δεκαδικό. Γενικά ισχύει 0742 = 482. - Τροποποίηση αρχείου που έχει ήδη δημιουργηθεί Σε αυτό χρησιμεύει η chmod της C που βρίσκεται στην βιβλιοθήκη sys/stat.h. #include int chmod(const char *pathname, mode_t mode) Το mode δουλεύει με τον ίδιο τρόπο αλλά μπορούμε και να χρησιμοποιήσουμε και έτοιμα masks που μας παρέχονται με την βιβλιοθήκη. chmod(filename, 0754) και chmod(filename, S_IRWXU|S_IRGRP|S_IXGRP|S_IROTH) είναι το ίδιο πράγμα. S_IRWXU = Read, write, execute για τον χρήστη. S_IRGRP = Read για το group S_IXGRP = Execute για group S_IROTH = Read για τους υπόλοιπους Εφαρμόζοντας τον bitwise OR operator στις παραπάνω μάσκες μπορούμε να τις συνδιάσουμε στα τελικά permissions. Επιπλέον σύνδεσμοι: http://man7.org/linux/man-pages/man3/fopen.3.html https://linux.die.net/man/3/chmod https://www.cs.umd.edu/class/sum2003/cmsc311/Notes/BitOp/hexoctal.html