uni

University stuff
git clone git://git.margiolis.net/uni.git
Log | Files | Refs | README | LICENSE

ex1.txt (41655B)


      1 # Eργαστήριο ΛΣ 1 / Άσκηση 1 / 2020-21
      2 # Ονοματεπώνυμο: Χρήστος Μαργιώλης
      3 # ΑΜ: [REDACTED]
      4 # ====================================
      5 # 
      6 # Ερώτηση 1:
      7 # ----------
      8 # Δημιουργήστε στον τρέχοντα κατάλογο το αρχείο 'ask1.txt' με τα ακόλουθα
      9 # περιεχόμενα(όνομα, επώνυμο, username, ΤΚ, περιοχή, τηλ.), και εμφανίστε
     10 # το στησυνέχεια στην οθόνη, με αριθμημένες τις γραμμές του.
     11 # 
     12 # Απάντηση:
     13 # Προκειμένου να δημιουργήσουμε ένα αρχείο χρησιμοποιούμε την εντολή 'touch [FILE...]',
     14 # όπου FILE είναι το όνομα του αρχείου και ... ότι μπορούμε να δώσουμε όσα ορίσματα
     15 # θελουμε. Στην προκειμένη περίπτωση
     16          
     17 touch ask1.txt
     18  
     19 # Αν και θα μπορούσαμε να γράψουμε τα δεδομένα του αρχείο σε έναν 
     20 # κειμενογράφο, χρησιμοποιώντας την 'echo' (και οποιαδηποτε παρόμοια εντολή,
     21 # όπως την 'printf'), μπορούμε να ανακατευθύνουμε την έξοδο της στο αρχείο που θέλουμε,
     22 # οπότε μπορούμε με τις παρακάτω εντολές να έχουμε το ίδιο αποτέλεσμα.
     23 # Για χάρην απλότητας στο διάβασμα επέλεξα να καλέσω αρκετές φορές την 'echo' αντί να
     24 # ενώσω τα πάντα με newlines. Από την δεύτερη κλήση της και μετά το >> σημαίνει 
     25 # ότι θέλουμε να γράψουμε στο τέλος του αρχείο, όχι να γράψουμε το αρχείο από την αρχή.
     26  
     27 echo "George Pappas george2 12136 Peristeri-------" > ask1.txt
     28 echo "Nick Nikolaoy nick23 12232 Aigaleo 5314555" >> ask1.txt
     29 echo "George Georgioy george583 11132 Athens-------" >> ask1.txt
     30 echo "Helen Georgioy helen3 12136 Peristeri 5748456" >> ask1.txt
     31 echo "Nick Pappas nick4 11223 Aigaleo 5324123" >> ask1.txt
     32 echo "Helen Ioannoy helen367 13222 Athens" ------- >> ask1.txt
     33 echo "Helen Thanoy helen36 11132 Peristeri9718345" >> ask1.txt
     34 echo "Vasilis Mamalis vas32 12345 Dafni 9738383" >> ask1.txt
     35  
     36 # Για να εμφανίσουμε τα περιεχόμενα του αρχείου με αριθμημένες σειρές,
     37 # θα χρησιμοποιηθεί η εντολή 'nl', η οποία αριθμεί σειρές, δέχοντας ως
     38 # input το αρχείο με τα περιεχόμενα.
     39  
     40 nl ask1.txt
     41  
     42 # Αποτέλεσμα εκτέλεσης εντολής:
     43 # 
     44 #         1  George Pappas george2 12136 Peristeri-------
     45 #         2  Nick Nikolaoy nick23 12232 Aigaleo 5314555
     46 #         3  George Georgioy george583 11132 Athens-------
     47 #         4  Helen Georgioy helen3 12136 Peristeri 5748456
     48 #         5  Nick Pappas nick4 11223 Aigaleo 5324123
     49 #         6  Helen Ioannoy helen367 13222 Athens -------
     50 #         7  Helen Thanoy helen36 11132 Peristeri9718345
     51 #         8  Vasilis Mamalis vas32 12345 Dafni 9738383
     52 # 
     53 # Ερώτηση 2:
     54 # ----------
     55 # Τρέξτε την εντολή cal -3 > calfile.txt και εξηγείστε τι ακριβώς κάνει.
     56 # 
     57 # Απάντηση:
     58 # Η εντολή 'cal' αρχικά εμφανίζει ημερολόγιο του τρέχοντος μήνα. Με την
     59 # εντολή
     60  
     61 cal -3 > calfile.txt
     62  
     63 # Θα εμφανιστεί ο προηγούμενος, τρέχων και επόμενος μήνας, και στην συνέχεια
     64 # το output της εντολής θα γραφτεί στο αρχείο calfile.txt
     65 # 
     66 # Ερώτηση 3:
     67 # ----------
     68 # Συνενώστε τα αρχεία calfile.txt και ask1.txt σε ένα αρχείο με όνομα full.txt
     69 # 
     70 # Απάντηση:
     71 # Για την συνένωση των δύο παραπάνω αρχείων - και γενικότερα δύο ή παραπάνω
     72 # αρχειών - χρησιμοποιούμε την εντολή 'cat', οπότε
     73          
     74 cat calfile.txt ask1.txt > full.txt
     75  
     76 # Ερώτηση 4:
     77 # ----------
     78 # Εμφανίστε στην οθόνη τα πέντε πιο πρόσφατα τροποποιημένα αρχεία του καταλόγου σας. 
     79 # 
     80 # Απάντηση:
     81 # Για να εμφανίσουμε τα αρχεία του καταλόγου χρησιμοποιούμε την εντολή 'ls'.
     82 # Προκειμένου να εμφανιστούν κατά ημερομηνία τροποποίησης ενεργοποιούμε την
     83 # επιλογή -t. Έπειτα θα κάνουμε pipe το output του 'ls' στην εντολή 'head' για να
     84 # εμφανίσουμε μόνο τα 5 πρώτα αρχεία.
     85          
     86 ls -t | head -6
     87  
     88 # Ερώτηση 5:
     89 # ----------
     90 # Δημιουργήστε έναν κατάλογο με όνομα 'mydir1'. Μεταβείτε σε αυτόν και στη
     91 # συνέχεια αντιγράψτε εκεί (χωρίς να αλλάξετε κατάλογο) το αρχείο 'full.txt'
     92 # (από το γονικό κατάλογο). Μετονομάστε το εν συνεχεία σε 'new.txt'. 
     93 # Επιστρέψτε στο γονικό κατάλογο. Διαγράψτε τον κατάλογο 'mydir1' και τα
     94 # περιεχόμενά του.
     95 # 
     96 # Απάντηση:
     97 # Οι εντολές που θα χρειαστούμε είναι οι εξής:
     98 # mkdir   Δημιουργεί κατάλογο
     99 # cd      Αλλάζει κατάλογο
    100 # cp      Αντιγράφει αρχεία και καταλόγους
    101 # rm -rf  Διαγράφει αναδρομικά έναν κατάλογο (εφόσον υπάρχει το -rf)
    102 # 
    103 # Στην πρώτη σειρά, το && σημαίνει ότι η επόμενη εντολή θα εκτελεστεί
    104 # μόνο αν η προηγούμενη εντολή εκτελεστεί επιτυχώς. Στην δεύτερη σειρά
    105 # το '.' δηλώνει τον κατάλογο που βρισκόμαστε - το '..' δηλώνει
    106 # τον γονικό κατάλογο.
    107  
    108 mkdir mydir1 && cd mydir1
    109 cp ../full.txt .
    110 cd ..
    111 rm -rf mydir1
    112  
    113 # Ερώτηση 6:
    114 # ----------
    115 # Δώστε τις εντολές που θα εμφανίσουν:
    116 # (α) όλα τα αρχεία του καταλόγου /usr με πληροφορίες για το inode τους και
    117 # το μέγεθος τους σε blocks.
    118 # (β) όλα τα περιεχόμενα του δέντρου καταλόγων και υποκαταλόγων (αναδρομικά)
    119 # που βρίσκονται κάτω από τον κατάλογο /usr, με πλήρεις πληροφορίες για
    120 # κάθε ένα από αυτά και εμφανιζόμενα σταδιακά, σελίδα προς σελίδα.
    121 # 
    122 # Απάντηση:
    123 # Και στα δύο υποερωτήματα θα χρησιμοποιηθεί η εντολή 'ls'
    124 # (α) Η επιλογή -i εμφανίζει το inode και η επιλογή
    125 # -s το μέγεθος σε blocks, οπότε
    126          
    127 ls -lsi /usr
    128  
    129 # (β) Η επιλογή -R εμφανίζει αναδρομικά όλα τα περιεχόμενα ενός
    130 # καταλόγου, οπότε
    131  
    132 ls -lR /usr
    133  
    134 # Ερώτηση 7:
    135 # ----------
    136 # Δημιουργήστε έναν κατάλογο με όνομα 'testdir1'. Μεταβείτε σε αυτόν
    137 # και φτιάξτε εκεί ένα hard link (με το όνομα 'ask1link') προς το αρχείο
    138 # 'ask1.txt' του γονικού καταλόγου. Βεβαιωθείτε (δίνοντας την κατάλληλη
    139 # εντολή και εξηγώντας τι βλέπετε) ότι έχει δημιουργηθεί και ότι δεν είναι
    140 # symbolic (soft) link.
    141 # 
    142 # Απάντηση:
    143 # Για να φτιάξουμε hard link θα χρησιμοποιήσουμε την εντολή 'ln'.
    144  
    145 mkdir testdir1 && cd testdir1
    146 ln ../ask1.txt ask1link
    147  
    148 # Αν εκτελέσουμε την εντολή 'ls -li' στον κατάλογο testdir1 θα δούμε
    149 # ότι σε αντίθεση με το soft link, στο hard link δεν εμφανίζεται
    150 # το -> το οποίο δηλώνει ότι είναι symbolic link.
    151 # 
    152 #         11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1link
    153 # 
    154 # Επίσης παρατηρούμε ότι και το ask1link αλλά και το ask1.txt έχουν το ίδιο inode.
    155 # 
    156 #         11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1.txt
    157 #         11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1link
    158 # 
    159 # Ερώτηση 8:
    160 # ----------
    161 # Μπείτε στο αρχείο 'ask1link' και διαγράψτε την τελευταία του γραμμή.
    162 # Βεβαιωθείτε στη συνέχεια ότι η αλλαγή αυτή έχει γίνει και στο αρχείο 'ask1.txt'.
    163 # 
    164 # Απάντηση:
    165 # Εφόσον το ask1link ειναι hardlink στο 'ask1.txt', δηλαδή είναι reference
    166 # στο 'ask1.txt', ό,τι αλλαγή γίνει στο ένα αρχείο, θα γίνει και στο άλλο,
    167 # οπότε αν διαγράψουμε την τελευταία γραμμή από το 'ask1link', η αλλαγή
    168 # πράγματι θα έχει γίνει και στο 'ask1.txt'. Ανοίγουμε το 'ask1link' στο
    169 # Vim και εκτελούμε τις εξής εντολές ώστε να σβήσουμε την τελευταία γραμμή
    170 
    171 # vim ask1link
    172  
    173 # G       πάει στην τελευταία γραμμή
    174 # dd      την σβήνει
    175 # ZZ      βγαίνουμε από το Vim
    176 # 
    177 # Τώρα κάνοντας
    178          
    179 cd ..
    180 diff ask1.txt testdir1/ask1link
    181  
    182 # βλέπουμε ότι εντολή δεν βγάζει output, το οποίο σημαίνει ότι τα αρχεία
    183 # είναι ίδια, οπότε η αλλαγή που κάναμε στο ένα αρχείο ίσχυσε και στο άλλο.
    184 # 
    185 # Ερώτηση 9:
    186 # ----------
    187 # Δημιουργήστε ένα κατάλογο kat1 και μέσα σε αυτόν δύο αρχεία, file1 και file2,
    188 # με περιεχόμενο τη λέξη 'one' το ένα και τη λέξη 'two' το άλλο.
    189 # Τρέξτε (μέσα στον κατάλογο kat1) την εντολή 'cp *' και εξηγήστε το αποτέλεσμα. 
    190 # Στη συνέχεια τρέξτε την εντολή 'mv *' και εξηγήστε το αποτέλεσμα.
    191 # 
    192 # Απάντηση:
    193 # Αρχικά πρέπει να γράψουμε τα περιέχομενα στα κατάλληλα αρχεία.
    194          
    195 mkdir kat1 && cd kat1
    196 echo "one" > file1
    197 echo "two" > file2
    198  
    199 # Αφού τρέξουμε την εντολή 'cp *' στον kat1 θα παρατηρήσουμε ότι και τα
    200 # δύο αρχεία τώρα έχουν την λέξη "one".
    201 
    202 cp * 
    203 cat file1 file2
    204  
    205 #       one
    206 #       one
    207 # 
    208 # Αυτό γίνεται επειδή γράφοντας 'cp *', επιλέγουμε όλα τα αρχεία του
    209 # καταλόγου. Επειδή όμως έχουμε δύο αρχεία η εντολή θα αναπτυχθεί σε
    210 # 
    211 #       cp file1 file2
    212 # 
    213 # και αυτό που θα γίνει τελικά είναι να αντιγραφεί το file1 στο file2.
    214 # Όταν τρέξουμε την εντολή 'mv *' θα δούμε ότι διαγράφεται το file1,
    215 # επειδή, όπως και με την 'cp *', η εντολή θα αναπτυχθεί σε
    216  
    217 mv file1 file2
    218 ls
    219 cd ..
    220  
    221 # οπότε το file1 θα μετονομαστεί σε file2, και έτσι θα χαθεί.
    222 # 
    223 # Ερώτηση 10:
    224 # -----------
    225 # Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες τελειώνουν
    226 # με ένα ή περισσότερα συνεχόμενα ψηφία. 
    227 # 
    228 # Απάντηση:
    229 # Η εντολή 'grep' δέχεται ένα regular expression (regex) και επιστρέφει
    230 # τις γραμμές στο αρχείο στις οποίες βρίσκεται το regex.
    231 # Το regex που θα ψάξουμε θα αποτελείται από τα εξής μέρη:
    232 # 
    233 # 1. [0-9]        οποιδήποτε ψηφίο από το 0 εώς το 9
    234 # 2. \+           μία ή παραπάνω επαναλήψεις του προηγούμενου
    235 # 3. $            τέλος γραμμής
    236 # 
    237 # Οπότε η τελική εντολή θα είναι
    238  
    239 grep "[0-9]\+$" ask1.txt
    240  
    241 # Ερώτηση 11:
    242 # -----------
    243 # Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες περιέχουν μεν 
    244 # το πρότυπο 'Pap' αλλά δεν περιέχουν το πρότυπο 'Aig'.
    245 # 
    246 # Απάντηση:
    247 # Στην εντολή 'grep' η επιλογή -v αποκλείει το δοθέν regex. Προκειμένου
    248 # πρώτα να πάρουμε τις γραμμές που περιέχουν το πρότυπο 'Pap' αλλα όχι
    249 # το πρότυπο 'Aig', θα εκτελέσουμε το 'grep' 2 φορές, ώστε πρώτα να πάρουμε
    250 # όλες τις γραμμές που περιέχουν το 'Pap' και μετά να αποκλείσουμε το 'Aig'.
    251  
    252 grep "Pap" ask1.txt | grep -v "Aig"
    253  
    254 # Ερώτηση 12:
    255 # -----------
    256 # Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες δεν αρχίζουν
    257 # με 'G' ή 'N' και περιέχουν εν συνεχεία (κάπου στα περιεχόμενά τους)
    258 # τα πρότυπα 'Geo' και 'Per' με αυτή τη σειρά.'
    259 # 
    260 # Aπάντηση:
    261 # Όπως και στην ερώτηση 11, θα μπορούσαμε να χρησιμοποιήσουμε την επιλογή
    262 # -v για την εντολή 'grep', αλλα θα χρησιμοποιήσουμε μία διαφορετική σύνταξη.
    263 # Αυτή τη φορά τα regex που θα ψάξουμε είναι τα εξής
    264 # 
    265 # Για την πρώτη κλήση:
    266 # 1. ^            ξεκινάει με
    267 # 2. ^[GN]        πρεπει να ξεκινάει με G ή N
    268 # 3. ^[^GN]       ΔΕΝ πρέπει να ξεκινάει με G ή N
    269 # 
    270 # Για την δεύτερη κλήση:
    271 # 1. Geo          περιέχει την λέξη 'Geo'
    272 # 2. .*           οποιοσδήποτε αριθμός οποιουδήποτε χαρακτήρα
    273 # 3. Per          περιέχει την λέξη 'Per'
    274 # 
    275 # Οπότε η τελική εντολή είναι (το | ειναι separator)
    276  
    277 grep "^[^GN]" ask1.txt | grep "Geo.*Per"
    278  
    279 # Αποτέλεσμα εκτέλεσης εντολής:
    280 # 
    281 #         Helen Georgioy helen3 12136 Peristeri 5748456
    282 # 
    283 # Ερώτηση 13:
    284 # -----------
    285 # Πόσοι χρήστες που το username τους δεν αρχίζει από 'ls1' είναι
    286 # συνδεδεμένοι στο σύστημα;
    287 # 
    288 # Απάντηση:
    289 # Η εντολή 'who' μπορεί να μας επιστρέψει μια λίστα με τους χρήστες 
    290 # που είναι συνδεδεμένοι. Ο λόγος που χρησιμοποίησα την 'who' αντί 
    291 # για την 'w' που κάνει περίπου το ίδιο πράγμα είναι επειδή η 'w'
    292 # έχει και μια γραμμή header στην αρχή, οπότε 'wc -l' θα την μέτραγε.
    293 # Με την χρήση της εντολής 'wc' μπορούμε να μετρήσουμε λέξεις, γραμμές
    294 # και χαρακτήρες. Αν στην εντολή 'wc' δώσουμε την επιλογή -l τότε θα
    295 # μετρήσει μόνο πόσες γραμμές έχει το input που της δώθηκε.
    296  
    297 who | grep -v "^ls1" | wc -l
    298  
    299 # Ερώτηση 14:
    300 # -----------
    301 # Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή
    302 # τη στιγμή στο σύστημα.
    303 # 
    304 # Απάντηση:
    305 # Η εντολή 'ps' (process status) εμφανίζει τις τρέχουσες διεργασίες που
    306 # εκτελεί το σύστημα. Επιπλέον θα χρειαστούμε τις επιλογές a και u, οι οποίες
    307 # εμφανίζουν τις διεργασίες που εκτελούνται από όλους τους συνδεδεμένους χρήστες
    308 # αυτή τη στιγμη. Στην εντολή 'ps' χρησιμοποιήσα την BSD σύνταξη.
    309  
    310 ps -au
    311  
    312 # Αποτέλεσμα εκτέλεσης της εντολής:
    313 # 
    314 #         USER      PID %CPU %MEM   VSZ   RSS TT  STAT STARTED    TIME COMMAND
    315 #         christos 5200  0.1  0.1 18048  7084  2  Ss   21:44   0:09.04 /usr/local/bin/zsh
    316 #         christos 1160  0.0  0.1 15072  6016 v0  I    12:19   0:00.07 -zsh (zsh)
    317 #         christos 1175  0.0  0.0 11828  3044 v0  I+   12:19   0:00.00 /bin/sh /usr/local/bin/startx
    318 #         christos 1188  0.0  0.0 13164  3240 v0  I+   12:19   0:00.00 xinit /home/christos/.xinitrc
    319 #         christos 1192  0.0  0.1 22152 11360 v0  S    12:19   0:19.69 dwm
    320 #         christos 1218  0.0  0.1 17136  8000  0- S    12:20   0:16.20 slstatus
    321 #         christos 5005  0.0  0.1 18004  7000  1  Is   21:15   0:00.31 /usr/local/bin/zsh
    322 #         christos 5193  0.0  0.2 28028 16288  1  S+   21:44   0:07.88 nvim ex1.txt
    323 #         christos 6849  0.0  0.0 11860  3080  2  R+   00:22   0:00.00 ps -u
    324 #         root     1158  0.0  0.0 10880  2304 v1  Is+  13:14   0:00.00 /usr/libexec/getty Pc ttyv1
    325 #         root     1159  0.0  0.0 10880  2304 v2  Is+  13:14   0:00.00 /usr/libexec/getty Pc ttyv2
    326 #         root     1160  0.0  0.0 10880  2304 v3  Is+  13:14   0:00.00 /usr/libexec/getty Pc ttyv3
    327 # 
    328 # Ερώτηση 15:
    329 # -----------
    330 # Πόσες διεργασίες χρηστών (αλλ/σης) τρέχουν στο σύστημα και τελειώνει
    331 # το όνομά τους με 'sh' ?
    332 # 
    333 # Απάντηση:
    334 # Τρέχοντας την εντολή της ερώτησης 14 (ps -ux) και φιλτράροντας
    335 # το ouput ώστε να πάρουμε μόνο τις γραμμές που τελειώνουν σε
    336 # 'sh', έχω 3 διεργασίες που το όνομα τους τελειώνει σε 'sh'
    337  
    338 ps -au | grep "sh$" | wc -l
    339  
    340 # Συνολικά έχουμε 3 διεργασίες που τελειώνουν σε sh.
    341 # 
    342 # Ερώτηση 16:
    343 # -----------
    344 # Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή τη στιγμή στο σύστημα.
    345 # 
    346 # Απάντηση:
    347 # Αυτή τη φορά στην εντολή 'ps', πέρα από την επιλογή u, θα δώσουμε και την επιλογή
    348 # x, η οποία εμφναίζει πληροφορίες ακόμα και για διεργασίες που δεν ελέγχουν κάποιο terminal
    349  
    350 ps -aux
    351  
    352 # Το output της εντολής είναι πολύ μεγάλο για να το συμπεριλάβω εδώ.
    353 # 
    354 # Ερώτηση 17:
    355 # -----------
    356 # Πόσα αρχεία του τρέχοντος καταλόγου σας (μόνο του τρέχοντος -όχι και
    357 # των υποκαταλόγων του) έχουν permissions 'rw' από τους πάντες και 'x' 
    358 # από κανέναν;
    359 # 
    360 # Απάντηση:
    361 # Η 'ls -l' στην αρχή κάθε σειράς εμφανίζει το permission string και με την
    362 # 'grep' μπορούμε να εμφανίσουμε μόνο τις γραμμές που περιέχουν το permission
    363 # που ζητάει η εκφώνηση. Τέλος διοχετεύουμε την έξοδο στην 'wc -l'.
    364  
    365 ls -l | grep "^-rw-rw-rw-" | wc -l
    366  
    367 # Ερώτηση 18:
    368 # -----------
    369 # Βρείτε τους καταλόγους του συστήματος που το όνομά τους αρχίζει από 'b'.
    370 # 
    371 # Απάντηση:
    372 # Η εντολή 'find' είναι μια πιο ανεπτυγμένη μορφή της 'ls' στην οποία μπορούμε
    373 # να δώσουμε πολλές παραπάνω επιλογές. Οι επιλογές που έχουν δωθεί στην παρακάτω εντολή
    374 # σημαίνουν τα εξής:
    375 # /* - η αναζήτηση ξεκινάει από την ρίζα του συστήματος (root directory)
    376 # -type d - αναζήτηση μόνο για directories
    377 # -name "b*" - το όνομα τους πρέπει να ξεκινάει από 'b'
    378  
    379 find /* -type d -name "b*"
    380  
    381 # Ερώτηση 19:
    382 # -----------
    383 # Να βρείτε και να παρουσιάσετε στην οθόνη με πλήρεις πληροφορίες
    384 # όλα τα αρχεία με όνομα που αρχίζει από tty και βρίσκονται στον κατάλογο /dev.
    385 # 
    386 # Απάντηση:
    387 # Η εντολή stat επιστρέφει πλήρεις πληροφορίες για ένα αρχείο.
    388 # Με την εντολή 'grep', όπως έχει ειπωθεί και σε παραπάνω ερωτήσεις, μπορούμε
    389 # να πάρουμε τις γραμμές στις οποίες γίνεται match ένα regular
    390 # expression - έτσι κατά την εμφάνιση των αρχείων του /dev μπορούμε
    391 # να εξάγουμε μόνο όσες γραμμές περιέχουν την λέξη 'tty'.
    392  
    393 stat /dev/* | grep "tty"
    394  
    395 # Ερώτηση 20:
    396 # -----------
    397 # Ταξινομήστε τα περιεχόμενα του αρχείου 'ask1.txt' ως προς το
    398 # username σε φθίνουσα σειρά.
    399 # 
    400 # Απάντηση:
    401 # Θα ταξινομίσουμε το αρχείο με την χρήση της εντολής 'sort'.
    402 # Στην εντολή αυτή μπορούμε να της δώσουμε κατα ποιά στήλη θέλουμε
    403 # να ταξινομηθεί το αρχείο με την επιλογή -k. Εφόσον username
    404 # βρίσκεται στην 3η στήλη, θα δώσουμε την 3η στήλη ως μέσο
    405 # σύγκρισης για ταξινόμηση. Επίσης, προκειμένου να είναι κατα
    406 # φθήνουσα σειρά η ταξινόμηση, θα χρησιμοποιήσουμε την επιλογή -r
    407 
    408 sort -rk 3 ask1.txt
    409  
    410 # Σε περίπτωση που θέλουμε οι αλλαγές να γραφτούν στο αρχείο, μπορούμε
    411 # να γράψουμε την εντολή ως
    412 # 
    413 #       sort -rk 3 ask1.txt -o ask1.txt
    414 # 
    415 # Ερώτηση 21:
    416 # -----------
    417 # Ταξινομήστε τα '.c' αρχεία του καταλόγου στον οποίον δουλεύετε ως
    418 # προς το μέγεθός τους.
    419 # 
    420 # Απάντηση:
    421 # Στην εντολή 'ls' η επιλογή -S ταξινομεί τα αρχεία ανάλογα με το
    422 # μέγεθός του κατα φθήνουσα σειρά (μεγαλύτερο πρώτα), οπότε
    423  
    424 ls -S *.c
    425  
    426 # Ερώτηση 22:
    427 # -----------
    428 # Ταξινομήστε τα αρχεία του λογαριασμού σας με permissions 644
    429 # ως προς το μέγεθός τους.
    430 # 
    431 # Απάντηση:
    432 # Μπορούμε να εμφανίσουμε αρχεία που έχουν συγκεκριμένα permissions
    433 # με την εντολή 'find' και την επιλογή -perm [PERMISSION] όπου
    434 # το PERMISSION πρέπει να δωθεί σε οκταδικό. Επίσης μέσα στην 'find'
    435 # μπορούμε να εκτελέσουμε και επιπλέον shell commands στο output της με
    436 # την επιλογή -exec [COMMAND] - θα χρησιμοποιήσουμε την 'ls -alS' ώστε
    437 # να ταξινομήσει το output κατα μέγεθος. Η τελική εντολή θα εκτελεστεί
    438 # στον κατάλογο '/usr/home/christos', ο οποίος είναι ο κατάλογος του λογαριασμού
    439 # μου. Το {} \; στο τέλος της εντολής δηλώνει ότι η 'ls -alS' θα εκτελεστεί
    440 # σε κάθε αρχείο που βρίσκεται από την 'find'.
    441  
    442 find /home/christos -perm 644 -exec ls -alS {} \;
    443  
    444 # Ερώτηση 23:
    445 # -----------
    446 # Ταξινομήστε όλα τα περιεχόμενα του καταλόγου /dev κατά πρώτον ως προς
    447 # τον owner και κατά δεύτερον ως προς το group και αποθηκεύστε το
    448 # output στο αρχείο 'binfiles.txt'.
    449 # 
    450 # Аπάντηση:
    451 # Παίρνοντας πληροφορίες για τον owner και το group των αρχείων με την
    452 # 'ls -l /dev' μπορούμε να ταξινομήσουμε τις κατάλληλες στήλες (3 για owner
    453 # και 4 για group).
    454          
    455 ls -l /dev | sort -k 3,4 > binfiles.txt
    456  
    457 # Ερώτηση 24:
    458 # -----------
    459 # Φτιάξτε ένα αρχείο που θα περιέχει πληροφορίες μόνο για τους συνδεδεμένους
    460 # χρήστες που το username τους αρχίζει από 'ls1', ταξινομημένο ως προς
    461 # την ημερομηνία και ώρα σύνδεσή τους.
    462 # 
    463 # Απάντηση:
    464 # ΑΦού φιλτραριστεί το ouput της 'who' ώστε να πάρουμε μόνο τους
    465 # χρήστες που το όνομά τους ξεκινάει από ls1, θα ταξινομήσουμε
    466 # κατά 3η και 4η στήλη επειδή αυτές δείχνουν την ημερομηνία
    467 # και ώρα σύνδεσης.
    468  
    469 who | grep "^ls1" | sort -k 3,4 > userinfo.txt
    470  
    471 # Ερώτηση 25:
    472 # -----------
    473 # Αλλάξτε στο αρχείο 'ask1.txt' το όνομα 'Nick' (όπου συναντάται) σε 'Nickolaos'.
    474 # 
    475 # Απάντηση:
    476 # Με την χρήση της εντολής 'sed' (stream editor) μπορούμε να αλλάξουμε ένα
    477 # pattern κάθε φορά που συναντάται με την παρακάτω σύνταξη
    478 # 
    479 #         sed "s/PATTERN/NEWPATTERN/g" file
    480 # 
    481 # Τo g στο τέλος σημαίνει ότι αυτή η αλλαγή πρέπει να γίνει σε όλο το αρχείο,
    482 # και όχι μόνο την πρώτη φορά που θα συναντήσει το PATTERN.
    483 # Οπότε, στην προκειμένη περίπτωση η εντολή που θα εκτελεστεί είναι
    484  
    485 sed "s/Nick/Nickolaos/g" ask1.txt
    486  
    487 # Εάν θέλουμε οι αλλαγές να αποθηκευτούν στο αρχείο κατευθείαν, μπορούμε
    488 # να εκτελέσουμε την εντολή με την επιλογή -i.
    489  
    490 sed -i "s/Nick/Nickolaos/g" ask1.txt
    491  
    492 # Ερώτηση 26:
    493 # -----------
    494 # Έστω τα ακόλουθα items του filesystem με protection strings:
    495 # (α) '-rwxr-x--x',
    496 # (β) 'drwxr-x---' και 
    497 # (γ) 'drwx--x--x. 
    498 # Εξηγείστε τι είδους items είναι και ποια τα δικαιώματα πρόσβασης user, 
    499 # group και others σε αυτά.
    500 # 
    501 # Απάντηση:
    502 # (α) Το είδος item είναι απλό αρχείο εφόσον το πρώτο πεδίο του protection string
    503 # είναι κενό. Όσο αφορά τα δικαίωματα του, δικαίωμα εγγραφής έχει μόνο ο ιδιοκτήτης
    504 # του αρχείο, διαβάσματος ο ιδιοκτήτης του αρχείου, και όσοι είναι στο ίδιο group με αυτόν. 
    505 # Επίσης όλοι οι χρήστες μπορούνε να το εκτελέσουν. 
    506 # 
    507 # (β) Το είδος είναι directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα εγγραφής
    508 # έχει μόνο ο ιδιοκτήτης, διαβάσματος και εκτέλεσης ο ιδιοκτήτης και τα μέλη του group -
    509 # οι υπόλοιποι χρήστες δεν έχουν δικαιώματα για το συγκεκριμένο directory.
    510 # 
    511 # (γ) Το είδος είναι επίσης directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα
    512 # εγγραφής και διαβάσματος έχει μόνο ο ιδιοκτήτης και εκτέλεσης όλοι οι χρήστες.
    513 # 
    514 # Ερώτηση 27:
    515 # -----------
    516 # Αλλάξτε τα permissions όλων των αρχείων του καταλόγου 'testdir1'
    517 # έτσι ώστε να έχουν δικαίωμα εκτέλεσης και εγγραφής μόνο ο ιδιοκτήτης, 
    518 # ενώ δικαίωμα ανάγνωσης να έχουν όλοι.
    519 # 
    520 # Απάντηση:
    521 # Η εντολή 'chmod' μπορεί να αλλάξει permissions. Με την επιλογή 'R' δηλώνουμε
    522 # ότι αυτό θέλουμε να γίνει αναδρομικά εφόσον θέλουμε να αλλάξουμε τα permissions
    523 # όλων των αρχείων του καταλόγου 'testdir1'. Τα υπόλοιπα πεδία σημαίνουν τα εξής:
    524 # a=r - όλοι οι χρήστες έχουν δικαίωμα ανάγνωσης
    525 # u+wx - προσθέτουμε στον ιδιοκτήτη του αρχείου και τα δικαιώματα εγγραφής και εκτέλεσης
    526  
    527 sudo chmod -R a=r,u+wx testdir1
    528  
    529 # Ερώτηση 28:
    530 # -----------
    531 # Αλλάξτε τα permissions του καταλόγου 'testdir1' έτσι ώστε να έχουν δικαίωμα 
    532 # πρόσβασης μόνο ο ιδιοκτήτης και οι χρήστες του ιδίου με αυτόν group, 
    533 # ενώ οι υπόλοιποι χρήστες να μην έχουν (θεωρείστε ότι τα τρέχοντα 
    534 # permissions του καταλόγου είναι 755).
    535 # 
    536 # Απάντηση:
    537 # Χρησιμοποιώντας πάλι την εντολή 'chmod' μπορούμε να αλλάξουμε και τα permissions
    538 # ενός καταλόγου. Τα πεδία τώρα σημαίνουν τα εξής:
    539 # ug+r - ο ιδιοκτήτης και τα μέλη του group έχουν δικαίωμα διαβάσματος
    540 # o-r - οι υπόλοιποι χρήστες δεν έχουν δικαίωμα διαβάσματος
    541  
    542 sudo chmod ug+r,o-r testdir1
    543  
    544 # Ερώτηση 29:
    545 # -----------
    546 # Δημιουργήστε έναν νέο χρήστη στο σύστημά σας με username 'myfriend'.
    547 # Αλλάξτε στη συνέχεια τον ιδιοκτήτη του αρχείου 'ask1.txt' σε 'myfriend' και
    548 # μετακινήστε το στο working directory του. Περιορίστε τέλος το διαθέσιμο
    549 # χώρο αποθήκευσης στο δίσκο για το συγκεκριμένο χρήστη στα 10MB.
    550 # 
    551 # Απάντηση:
    552 # Για να φτιάξουμε έναν user χρησιμοποιούμε την εντολή 'useradd'. Σε BSD
    553 # συστήματα η εντολή είναι η 'adduser'. Για να αλλάξουμε ιδιοκτήτη αρχείου
    554 # χρησιμοποιούμε την εντολή 'chown'. Τέλος, για να περιορίσουμε τον χώρο
    555 # αποθηκεύσης στον δίσκο για έναν χρήστη χρησιμοποιούμε την εντολή 'edquota'.
    556  
    557 useradd -m -d /home/myfriend myfriend
    558 chown myfriend ask1.txt
    559 mv ask1.txt /home/myfriend
    560 edquota myfriend
    561  
    562 # Η εντολή 'edquota' θα μάς ανοίξει στον default editor μας ένα αρχείο
    563 # στο οποίο μπορούμε να τροποποιήσουμε τον αποθηκευτικό χώρο για τον χρήστη
    564 # myfriend. Θα πρέπει να δούμε κάτι σαν
    565 # 
    566 #         Disk quotas for user ice19390133 (uid 1022):
    567 #           Filesystem    blocks       soft       hard     inodes     soft     hard
    568 #           /dev/vda1         36      10240      13312         11        0        0
    569 # 
    570 # Το 'soft' το θέτουμε σε 10240 (kilobyte), δηλαδή 10MB.
    571 # 
    572 # Ερώτηση 30:
    573 # -----------
    574 # Έστω τα παρακάτω:
    575 # user1@localhost:~$ w
    576 # USER  TTY   FROM    LOGIN@ IDLE   JCPU  PCPU  WHAT
    577 # user1 pts/0 1.2.3.4 03:34  0.00s  0.38s 0.01s w
    578 # user2 pts/1 5.6.7.8 03:45  0.00s  0.38s 0.01s ls
    579 # user3 pts/2 9.7.5.3 03:57  0.00s  0.38s 0.01s ps
    580 # 
    581 # user1@localhost:~$ ls -al /dev/pts/*
    582 # crw--w----  1 user1 tty136, 0 Oct 25 04:04 /dev/pts/0
    583 # crw--w--w-  1 user2 tty136, 1 Oct 25 04:04 /dev/pts/1
    584 # crw--w--w-  1 user3 tty136, 2 Oct 25 04:04 /dev/pts/2
    585 # 
    586 # Εξηγήστε τι είδους items του file system είναι τα παραπάνω,
    587 # καθώς και τι θα κάνουν οι παρακάτω εντολές:
    588 # user1@localhost:~$ cat > /dev/pts/1
    589 # user1@localhost:~$ wall "test"
    590 # 
    591 # Απάντηση:
    592 # Σε ένα permission string, το 'c' δηλώνει ότι αυτό το item
    593 # ειναι 'character device', το οποίο πρακτικά σημαίνει συσκευές
    594 # οι οποίες μεταφέρουν δεδομένα σε μορφή κειμένου (bytes). Τέτοιες
    595 # συσκευές είναι για παράδειγμα τα ηχεία. Στην προκειμένη περίπτωση
    596 # το item ειναι 'tty' (από το teletype), δηλαδή είναι terminals. Τα
    597 # συγκεκριμένα terminals ειναι συνδεδεμένα με το πληκτρολόγιο.
    598 # 
    599 # Η εντολή 'cat > /dev/pts/1' θα εμφανίζει στο πρώτο terminal που
    600 # ανοίχτηκε οτίδηποτε γράψουμε στο stdin. Στον κατάλογο /dev/pts/
    601 # εμφανίζονται τα ανοιχτά terminals που τρέχουν αυτή τη στιγμή.
    602  
    603 cat > /dev/pts/1
    604  
    605 #         hello world
    606 #         hello world
    607 # 
    608 # Η εντολή 'wall "test"' θα στείλει το μήνυμα "test" σε όλους τους
    609 # συνδεδεμένους χρήστες.
    610  
    611 wall "test"
    612  
    613 #         Broadcast message from christos@freebsd (pts/1) (Wed Nov 14 23:26:58 2020):
    614 # 
    615 #         test
    616 # 
    617 # 
    618 # Ερώτηση 31:
    619 # -----------
    620 # Δημιουργείστε τα αρχεία f1, f2, f3, f4, f5, f6 ,f7 με τα εξής δικαιώματα:
    621 # f1, 757
    622 # f2, 313
    623 # f3, 010
    624 # f4, 642
    625 # f5, 551
    626 # f6, 133
    627 # f7, 111
    628 # Με χρήση της εντολής ls –l και διοχετεύοντας τα αποτελέσματά της στην εντολή
    629 # egrep να βρείτε τα αρχεία όπου:
    630 # a. To group έχει δικαιώματα r-x.
    631 # b. Ο user και οι others έχουν ακριβώς τα ίδια δικαιώματα
    632 # c. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write
    633 # d. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write και execute
    634 # e. To group και οι others έχουν τα ίδια δικαιώματα για read και execute
    635 # 
    636 # Απάντηση:
    637 # Αρχικά θα δημιουργήσουμε τα αρχεία με τα κατάλληλα permissions
    638 
    639 touch f1 && chmod 757 f1
    640 touch f2 && chmod 313 f2
    641 touch f3 && chmod 010 f3
    642 touch f4 && chmod 642 f4
    643 touch f5 && chmod 551 f5
    644 touch f6 && chmod 133 f6
    645 touch f7 && chmod 111 f7
    646 
    647 # a) Το pattern που θα αναζητήσουμε είναι στο permission string να περιέχονται
    648 # οποιοιδήποτε χαρακτήρες σε όλα τα πεδία αλλά πρέπει οπωσδήποτε τα permissions
    649 # του group να είναι r-x. Το - στην αρχή το βάζουμε για να ψάξουμε μόνο αρχεία και όχι
    650 # τυχόν directories.
    651  
    652 ls -l | egrep "^-...r-x..."
    653  
    654 # Αποτέλεσμα εκτέλεσης της εντολής:
    655 # 
    656 #         -rwxr-xrwx  1 christos  christos  0 Nov 14 22:16 f1
    657 #         -r-xr-x--x  1 christos  christos  0 Nov 14 22:16 f5
    658 # 
    659 # b) Θα φτιάξουμε ένα capture group στα πεδια που βρισκονται τα permissions
    660 # του user ώστε να ψάξουμε ό,τι αποθηκεύτηκε στην μεταβλητή 1
    661 # στο πεδίο που βρίσκονται τα permissions των others. Ένα capture group φτιάχνουμε
    662 # βάζοντας () και γράφοντας μέσα το pattern που θέλουμε.
    663  
    664 ls -l | egrep "^-(...)...\1"
    665  
    666 # Πιο αναλυτικά συμβαίνει το εξής:
    667 # 1. Θέλουμε το pattern να ξεκινάει με - ώστε να είναι αρχείο.
    668 # 2. Αποθηκεύουμε τους 3 επόμενους χαρακτήρες στη μεταβλητή 1.
    669 # 3. Έχουμε φτάσει στο πεδίο του group, οπότε ψάχνουμε για οποιονδήποτε
    670 # χαρακτήρα επειδή δεν μας νοιάζει σε αυτό το παράδειγμα τι permissions έχει το group.
    671 # 4. Тώρα είμαστε στο πεδίο των others. Εμφανίζουμε τη μεταβλητή 1 η οποία έχει κρατήσει
    672 # τα permissions του user.
    673 # 
    674 # Αποτέλεσμα εκτέλεσης της εντολής:
    675 # 
    676 #         -rwxr-xrwx  1 christos  christos  0 Nov 14 22:16 f1
    677 #         --wx--x-wx  1 christos  christos  0 Nov 14 22:16 f2
    678 #         ------x---  1 christos  christos  0 Nov 14 22:16 f3
    679 #         ---x--x--x  1 christos  christos  0 Nov 14 22:16 f7
    680 # 
    681 # c) Με την ίδια λογική όπως στο ερώτημα b, απλώς αυτή τη φορά δεν θα κρατήσουμε όλα τα
    682 # permissions του user, αλλά μόνο τα permissions για write.
    683  
    684 ls -l | egrep "^-.(.)..\1..\1."
    685  
    686 # Αποτέλεσμα εκτέλεσης της εντολής:
    687 # 
    688 #         ------x---  1 christos  christos  0 Nov 14 22:16 f3
    689 #         -r-xr-x--x  1 christos  christos  0 Nov 14 22:16 f5
    690 #         ---x--x--x  1 christos  christos  0 Nov 14 22:16 f7
    691 # 
    692 # d) Ξανά με την ίδια λογική, αλλά κρατήσουμε τα πεδία για write και execute.
    693  
    694 ls -l | egrep "^-.(..).\1.\1"
    695  
    696 # Αποτέλεσμα εκτέλεσης της εντολής:
    697 # 
    698 #         -r-xr-x--x  1 christos  christos  0 Nov 14 22:16 f5
    699 #         ---x--x--x  1 christos  christos  0 Nov 14 22:16 f7
    700 # 
    701 # e) Αυτή τη φορά θα κρατήσουμε στις μεταβλητές τα permissions από το group, και όχι
    702 # από τον user.
    703  
    704 ls -l | egrep "^-...(.).(.)\1.\2"
    705  
    706 # Αποτέλεσμα εκτέλεσης της εντολής:
    707 # 
    708 #         -rwxr-xrwx  1 christos  christos  0 Nov 14 22:16 f1
    709 #         --wx--x-wx  1 christos  christos  0 Nov 14 22:16 f2
    710 #         ---x-wx-wx  1 christos  christos  0 Nov 14 22:16 f6
    711 #         ---x--x--x  1 christos  christos  0 Nov 14 22:16 f7
    712 # 
    713 # Ερώτηση 32:
    714 # -----------
    715 # Υποθέστε πως οι γραμμές στο αρχείο /etc/passwd είναι όμοιες με την παρακάτω:
    716 # 
    717 # spouneri:x:2107:1067:Pouneridis Sokratis:/home/student/e2021/spouneri:/bin/bash
    718 # 
    719 # Στο πέμπτο πεδίο θα υπάρχει πάντα πρώτο το επίθετο και μετά το όνομα του χρήστη.
    720 # Μόνο ένα επίθετο και μόνο ένα όνομα, γραμμένα με λατινικούς χαρακτήρες κεφαλαίους
    721 # ή/και πεζούς.
    722 # 
    723 # Τα υπόλοιπα πεδία θα είναι γραμμένα πάντα με πεζούς λατινικούς
    724 # χαρακτήρες.
    725 # 
    726 # Ελέγχοντας το αρχείο /etc/passwd και κάνοντας χρήση της εντολής egrep
    727 # βρείτε όλους τους (υποθετικούς) χρήστες του συστήματος όπου:
    728 # 
    729 # a. Χρησιμοποιούν για κέλυφος το bash
    730 # b. To HOME DIRECTORY τους βρίσκεται στον κατάλογο /home
    731 # c. To UID τους είναι ίδιο μετο GID τους
    732 # d. Τουλάχιστον τα 5 πρώτα γράμματα του επιθέτου τους αποτελούν μέρος και του username τους
    733 # e. Τουλάχιστον τα 3 πρώτα γράμματα του επιθέτου τους και τα 3 πρώτα γράμματα του
    734 # ονόματός τους αποτελούν μέρος και του username τους.
    735 # 
    736 # Απάντηση:
    737 # 
    738 # a. Εφόσον το shell βρίσκεται πάντα στο τέλος της γραμμής, μπορούμε να κάνουμε
    739  
    740 egrep "/bin/bash$" /etc/passwd
    741  
    742 # b. Αφού φτάσουμε στο πεδίο όπου βρίσκεται το Home directory, θα φροντίσουμε
    743 # να εμφανιστούνε μόνο οι γραμμές που ξεκινάνε με '/home'.
    744          
    745 egrep "^[a-z]+:.+:[0-9]+:[0-9]+:.+:/home/*" /etc/passwd
    746  
    747 # c. Θα χρησιμοποιήσουμε την ίδια τεχνική με τα capture groups που χρησιμοποίησα
    748 # και στην άσκηση 31.
    749  
    750 egrep "^[a-z]+:.+:([0-9]+):\1" /etc/passwd