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