uni

University stuff
git clone git://git.christosmarg.xyz/uni-assignments.git
Log | Files | Refs | README | LICENSE

commit 16cbb42e669a02c33571b67b76a9670a4c1264a9
parent ebb00d7482cf828ed8bd122c2afc07b0fe901831
Author: Christos Margiolis <christos@margiolis.net>
Date:   Wed,  2 Dec 2020 21:44:36 +0200

new mips assignments

Diffstat:
Mc-parallel-computing/ex1/doc.pdf | 0
Mc-parallel-computing/ex1/doc.tex | 8++++----
Mc-parallel-computing/ex1/ex1.c | 3+--
Mmips-architecture/lab3_ex1.asm | 44+++++++++++++++++++++++++++++++++-----------
Mmips-architecture/lab3_ex2.asm | 54++++++++++++++++++++++++++++++++++++++----------------
Amips-architecture/lab4_ex1.asm | 31+++++++++++++++++++++++++++++++
Amips-architecture/lab4_ex2.asm | 35+++++++++++++++++++++++++++++++++++
Amips-architecture/lab4_ex3.asm | 28++++++++++++++++++++++++++++
Amips-architecture/lab4_ex4.asm | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Amips-architecture/lab4_ex5.asm | 42++++++++++++++++++++++++++++++++++++++++++
Amips-architecture/lab4_ex6.asm | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Msh-os1/ex1/ex1.txt | 1459+++++++++++++++++++++++++++++++++++++++++--------------------------------------
Ash-os1/ex2/createpvs | 32++++++++++++++++++++++++++++++++
Msh-os1/ex2/searching | 2+-
Msh-os1/ex2/teldb | 6++++--
15 files changed, 1127 insertions(+), 745 deletions(-)

diff --git a/c-parallel-computing/ex1/doc.pdf b/c-parallel-computing/ex1/doc.pdf Binary files differ. diff --git a/c-parallel-computing/ex1/doc.tex b/c-parallel-computing/ex1/doc.tex @@ -139,11 +139,11 @@ AND είναι γιατί αν έστω και μία από τις \lstinline{s Τα παρακάτω τρεξίματα έγιναν σε Arch Linux, εξ'ού και τα newlines που ανέφερα στα προβλήματα και χαλάνε την εμφάνιση του πρόγραμματος. -\includegraphics[width=\textwidth]{exmpl1.png} -\includegraphics[width=\textwidth]{exmpl2.png} -\includegraphics[width=\textwidth]{exmpl3.png} +\includegraphics[width=\textwidth]{res/exmpl1.png} +\includegraphics[width=\textwidth]{res/exmpl2.png} +\includegraphics[width=\textwidth]{res/exmpl3.png} -\includegraphics[width=\textwidth]{exmpl4.png} +\includegraphics[width=\textwidth]{res/exmpl4.png} Σε αυτό το τρέξιμο έδωσα την λίστα που έφερα ως παράδειγμα πιο πάνω και ανέφερα ότι αν δεν ο κάθε επεξεργαστής δεν ξέρει ποιο είναι το προηγούμενο από αυτόν στοιχείο, δεν μπορούμε να έχουμε σωστό αποτέλεσμα. diff --git a/c-parallel-computing/ex1/ex1.c b/c-parallel-computing/ex1/ex1.c @@ -8,8 +8,7 @@ #define TAG_MENU 4 #define TAG_SORTED 5 #define TAG_VAL 6 -#define TAG_POS 7 -#define TAG_PREV 8 +#define TAG_PREV 7 int main(int argc, char *argv[]) diff --git a/mips-architecture/lab3_ex1.asm b/mips-architecture/lab3_ex1.asm @@ -1,25 +1,43 @@ +.eqv SYS_PRINT_WORD 1 +.eqv SYS_PRINT_STRING 4 +.eqv SYS_READ_WORD 5 +.eqv SYS_READ_STRING 8 +.eqv SYS_EXIT 10 +.eqv SYS_PRINT_CHAR 11 +.eqv SYS_READ_CHAR 12 + +.macro endl() + li $v0, SYS_PRINT_CHAR + li $a0, 0xa + syscall +.end_macro + .data str1: .asciiz "Hello\n" str2: .asciiz "TEI\n" name: .space 64 .text -.globl main +.globl _main -main: +_main: # 1. print a character - li $v0, 11 - la $a0, 'C' + li $v0, SYS_PRINT_CHAR + li $a0, 'C' syscall + endl() + # 2. print characters 'a' and 'd' li $a0, 'a' syscall li $a0, 'd' syscall + endl() + # 3. print 'Hello' - li $v0, 4 + li $v0, SYS_PRINT_STRING la $a0, str1 syscall @@ -30,25 +48,29 @@ main: syscall # 5. print 5 - li $v0, 1 + li $v0, SYS_PRINT_WORD li $a0, 5 syscall + endl() + # 6. read a word and print it - li $v0, 5 + li $v0, SYS_READ_WORD syscall move $t0, $v0 - li $v0, 1 + li $v0, SYS_PRINT_WORD la $a0, 0($t0) syscall + endl() + # 7. read name, store in mem and print it - li $v0, 8 + li $v0, SYS_READ_STRING la $a0, name li $a1, 64 syscall - li $v0, 4 + li $v0, SYS_PRINT_STRING syscall - li $v0, 10 + li $v0, SYS_EXIT syscall diff --git a/mips-architecture/lab3_ex2.asm b/mips-architecture/lab3_ex2.asm @@ -1,6 +1,20 @@ +.eqv SYS_PRINT_WORD 1 +.eqv SYS_PRINT_STRING 4 +.eqv SYS_READ_WORD 5 +.eqv SYS_READ_STRING 8 +.eqv SYS_EXIT 10 +.eqv SYS_PRINT_CHAR 11 +.eqv SYS_READ_CHAR 12 + +.macro endl() + li $v0, SYS_PRINT_CHAR + li $a0, 0xa + syscall +.end_macro + .data - str1: .ascii "hello" - str2: .space 64 + str: .asciiz "hello\n" + name: .space 64 x: .word 0 a: .word 20 b: .word 30 @@ -9,30 +23,36 @@ .text .globl main -main: +main: # 1. print 1st and 2nd character in string - li $v0, 11 - lb $a0, str1 + li $v0, SYS_PRINT_CHAR + lb $a0, str syscall - lb $a0, str1 + 1 + lb $a0, str + 1 syscall + endl() + # 2. read x and print str[x] - li $v0, 5 + li $v0, SYS_READ_WORD syscall - lb $a0, str1 + 0($v0) - li $v0, 11 + lb $a0, str($v0) + li $v0, SYS_PRINT_CHAR syscall + endl() + # 3. read a string and print its 2nd char - li $v0, 8 - la $a0, str2 + li $v0, SYS_READ_STRING + la $a0, name la $a1, 64 syscall - lb $a0, str2 + 1 - li $v0, 11 + lb $a0, name + 1 + li $v0, SYS_PRINT_CHAR syscall + endl() + # 4. int x, a = 20, b = 30, c = 15; # x = (a + b) - (c + 10); lw $t0, x @@ -43,9 +63,11 @@ main: addi $t5, $t3, 10 sub $t0, $t4, $t5 - li $v0, 1 + li $v0, SYS_PRINT_WORD la $a0, 0($t0) - syscall + syscall + + endl() - li $v0, 10 + li $v0, SYS_EXIT syscall diff --git a/mips-architecture/lab4_ex1.asm b/mips-architecture/lab4_ex1.asm @@ -0,0 +1,31 @@ +.eqv SYS_PRINT_STRING 4 +.eqv SYS_READ_WORD 5 +.eqv SYS_EXIT 10 + +.data + zstr: .asciiz "Zero\n" + nzstr: .asciiz "Non Zero\n" + +.text +.globl main + +main: + li $v0, SYS_READ_WORD + syscall + + bne $v0, $zero, nonzero + li $v0, SYS_PRINT_STRING + la $a0, zstr + syscall + + j exit + +nonzero: + li $v0, SYS_PRINT_STRING + la $a0, nzstr + syscall + j exit + +exit: + li $v0, SYS_EXIT + syscall diff --git a/mips-architecture/lab4_ex2.asm b/mips-architecture/lab4_ex2.asm @@ -0,0 +1,35 @@ +.eqv SYS_PRINT_STRING 4 +.eqv SYS_READ_WORD 5 +.eqv SYS_EXIT 10 + +.data + posstr: .asciiz "Positive\n" + nonposstr: .asciiz "Non Positive\n" + +.text +.globl main + +main: + li $v0, SYS_READ_WORD + syscall + + # t0 = 1 if v0 == 0 + slt $t0, $v0, $zero + beq $t0, $zero, pos + + li $v0, SYS_PRINT_STRING + la $a0, nonposstr + syscall + + j exit + +pos: + li $v0, SYS_PRINT_STRING + la $a0, posstr + syscall + + j exit + +exit: + li $v0, SYS_EXIT + syscall diff --git a/mips-architecture/lab4_ex3.asm b/mips-architecture/lab4_ex3.asm @@ -0,0 +1,28 @@ +.eqv SYS_EXIT 10 +.eqv SYS_PRINT_CHAR 11 +.eqv LOOP_ITER 5 + +.text +.globl main + +main: + # init loop counter + li $t0, 0 + +loop: + # exit if t0 == 5 + beq $t0, LOOP_ITER, exit + addi $t0, $t0, 1 + + li $v0, SYS_PRINT_CHAR + li $a0, '*' + syscall + + j loop + + li $a0, 0xa + syscall + +exit: + li $v0, SYS_EXIT + syscall diff --git a/mips-architecture/lab4_ex4.asm b/mips-architecture/lab4_ex4.asm @@ -0,0 +1,51 @@ +.eqv SYS_PRINT_STRING 4 +.eqv SYS_READ_WORD 5 +.eqv SYS_EXIT 10 +.eqv SYS_PRINT_CHAR 11 + +.data + msg: .asciiz "Number: " + errstr: .asciiz "Give a positive number.\n" + +.text +.globl main + +main: + li $v0, SYS_PRINT_STRING + la $a0, msg + syscall + + li $v0, SYS_READ_WORD + syscall + move $t0, $v0 + + # exit if t0 <= 0 + beq $t0, $zero, err + slt $t1, $t0, $zero + bne $t1, $zero, err + + # init loop counter + li $t2, 0 + +loop: + beq $t2, $t0, exit + addi $t2, $t2, 1 + + li $v0, SYS_PRINT_CHAR + li $a0, '*' + syscall + + j loop + + li $v0, SYS_PRINT_CHAR + li $a0, 0xa + syscall + +err: + li $v0, SYS_PRINT_STRING + la $a0, errstr + syscall + +exit: + li $v0, SYS_EXIT + syscall diff --git a/mips-architecture/lab4_ex5.asm b/mips-architecture/lab4_ex5.asm @@ -0,0 +1,42 @@ +.eqv SYS_EXIT 10 +.eqv SYS_PRINT_CHAR 11 +.eqv OUTLOOP_ITER 5 +.eqv INLOOP_ITER 4 + +.text +.globl main + +main: + # init outer loop counter + li $t0, 0 + +outloop: + # exit if t0 == 5 + beq $t0, OUTLOOP_ITER, exit + addi $t0, $t0, 1 + + # init inner loop counter + li $t1, 0 + + # print newline + li $v0, SYS_PRINT_CHAR + li $a0, 0xa + syscall + j inloop + + j outloop + +inloop: + # break inner loop if t1 == 4 + beq $t1, INLOOP_ITER, outloop + addi $t1, $t1, 1 + + li $v0, SYS_PRINT_CHAR + li $a0, '*' + syscall + + j inloop + +exit: + li $v0, SYS_EXIT + syscall diff --git a/mips-architecture/lab4_ex6.asm b/mips-architecture/lab4_ex6.asm @@ -0,0 +1,77 @@ +.eqv SYS_PRINT_STRING 4 +.eqv SYS_READ_WORD 5 +.eqv SYS_EXIT 10 +.eqv SYS_PRINT_CHAR 11 + +.macro input(%msg) + li $v0, SYS_PRINT_STRING + la $a0, %msg + syscall + + li $v0, SYS_READ_WORD + syscall +.end_macro + +.macro ispositive(%val) + # exit if t0 or $t1 <= 0 + beq %val, $zero, err + slt $t2, %val, $zero + bne $t2, $zero, err +.end_macro + +.data + msg1: .asciiz "Lines: " + msg2: .asciiz "Chars: " + errstr: .asciiz "Give positive numbers only.\n" + +.text +.globl main + +main: + input(msg1) + move $t0, $v0 + + input(msg2) + move $t1, $v0 + + ispositive($t0) + ispositive($t1) + + # init outer loop counter + li $t3, 0 + +outloop: + # exit if t3 == x + beq $t3, $t0, exit + addi $t3, $t3, 1 + + # init inner loop counter + li $t4, 0 + + # print newline + li $v0, SYS_PRINT_CHAR + li $a0, 0xa + syscall + j inloop + + j outloop + +inloop: + # break inner loop if t4 == y + beq $t4, $t1, outloop + addi $t4, $t4, 1 + + li $v0, SYS_PRINT_CHAR + li $a0, '*' + syscall + + j inloop + +err: + li $v0, SYS_PRINT_STRING + la $a0, errstr + syscall + +exit: + li $v0, SYS_EXIT + syscall diff --git a/sh-os1/ex1/ex1.txt b/sh-os1/ex1/ex1.txt @@ -1,709 +1,750 @@ -Eργαστήριο ΛΣ 1 / Άσκηση 1 / 2020-21 -Ονοματεπώνυμο: Χρήστος Μαργιώλης -ΑΜ: [REDACTED] -==================================== - -Ερώτηση 1: ----------- -Δημιουργήστε στον τρέχοντα κατάλογο το αρχείο 'ask1.txt' με τα ακόλουθα -περιεχόμενα(όνομα, επώνυμο, username, ΤΚ, περιοχή, τηλ.), και εμφανίστε -το στησυνέχεια στην οθόνη, με αριθμημένες τις γραμμές του. - -Απάντηση: -Προκειμένου να δημιουργήσουμε ένα αρχείο χρησιμοποιούμε την εντολή 'touch [FILE...]', -όπου FILE είναι το όνομα του αρχείου και ... ότι μπορούμε να δώσουμε όσα ορίσματα -θελουμε. Στην προκειμένη περίπτωση - - touch ask1.txt - -Αν και θα μπορούσαμε να γράψουμε τα δεδομένα του αρχείο σε έναν -κειμενογράφο, χρησιμοποιώντας την 'echo' (και οποιαδηποτε παρόμοια εντολή, -όπως την 'printf'), μπορούμε να ανακατευθύνουμε την έξοδο της στο αρχείο που θέλουμε, -οπότε μπορούμε με τις παρακάτω εντολές να έχουμε το ίδιο αποτέλεσμα. -Για χάρην απλότητας στο διάβασμα επέλεξα να καλέσω αρκετές φορές την 'echo' αντί να -ενώσω τα πάντα με newlines. Από την δεύτερη κλήση της και μετά το >> σημαίνει -ότι θέλουμε να γράψουμε στο τέλος του αρχείο, όχι να γράψουμε το αρχείο από την αρχή. - - echo "George Pappas george2 12136 Peristeri-------" > ask1.txt - echo "Nick Nikolaoy nick23 12232 Aigaleo 5314555" >> ask1.txt - echo "George Georgioy george583 11132 Athens-------" >> ask1.txt - echo "Helen Georgioy helen3 12136 Peristeri 5748456" >> ask1.txt - echo "Nick Pappas nick4 11223 Aigaleo 5324123" >> ask1.txt - echo "Helen Ioannoy helen367 13222 Athens ------- >> ask1.txt - echo "Helen Thanoy helen36 11132 Peristeri9718345 >> ask1.txt - echo "Vasilis Mamalis vas32 12345 Dafni 9738383 >> ask1.txt - -Για να εμφανίσουμε τα περιεχόμενα του αρχείου με αριθμημένες σειρές, -θα χρησιμοποιηθεί η εντολή 'nl', η οποία αριθμεί σειρές, δέχοντας ως -input το αρχείο με τα περιεχόμενα. - - nl ask1.txt - -Αποτέλεσμα εκτέλεσης εντολής: - - 1 George Pappas george2 12136 Peristeri------- - 2 Nick Nikolaoy nick23 12232 Aigaleo 5314555 - 3 George Georgioy george583 11132 Athens------- - 4 Helen Georgioy helen3 12136 Peristeri 5748456 - 5 Nick Pappas nick4 11223 Aigaleo 5324123 - 6 Helen Ioannoy helen367 13222 Athens ------- - 7 Helen Thanoy helen36 11132 Peristeri9718345 - 8 Vasilis Mamalis vas32 12345 Dafni 9738383 - -Ερώτηση 2: ----------- -Τρέξτε την εντολή cal -3 > calfile.txt και εξηγείστε τι ακριβώς κάνει. - -Απάντηση: -Η εντολή 'cal' αρχικά εμφανίζει ημερολόγιο του τρέχοντος μήνα. Με την -εντολή - - cal -3 > calfile.txt - -Θα εμφανιστεί ο προηγούμενος, τρέχων και επόμενος μήνας, και στην συνέχεια -το output της εντολής θα γραφτεί στο αρχείο calfile.txt - -Ερώτηση 3: ----------- -Συνενώστε τα αρχεία calfile.txt και ask1.txt σε ένα αρχείο με όνομα full.txt - -Απάντηση: -Για την συνένωση των δύο παραπάνω αρχείων - και γενικότερα δύο ή παραπάνω -αρχειών - χρησιμοποιούμε την εντολή 'cat', οπότε - - cat calfile.txt ask1.txt > full.txt - -Ερώτηση 4: ----------- -Εμφανίστε στην οθόνη τα πέντε πιο πρόσφατα τροποποιημένα αρχεία του καταλόγου σας. - -Απάντηση: -Για να εμφανίσουμε τα αρχεία του καταλόγου χρησιμοποιούμε την εντολή 'ls'. -Προκειμένου να εμφανιστούν κατά ημερομηνία τροποποίησης ενεργοποιούμε την -επιλογή -t. Έπειτα θα κάνουμε pipe το output του 'ls' στην εντολή 'head' για να -εμφανίσουμε μόνο τα 5 πρώτα αρχεία. - - ls -t | head -6 - -Ερώτηση 5: ----------- -Δημιουργήστε έναν κατάλογο με όνομα 'mydir1'. Μεταβείτε σε αυτόν και στη -συνέχεια αντιγράψτε εκεί (χωρίς να αλλάξετε κατάλογο) το αρχείο 'full.txt' -(από το γονικό κατάλογο). Μετονομάστε το εν συνεχεία σε 'new.txt'. -Επιστρέψτε στο γονικό κατάλογο. Διαγράψτε τον κατάλογο 'mydir1' και τα -περιεχόμενά του. - -Απάντηση: -Οι εντολές που θα χρειαστούμε είναι οι εξής: -mkdir: Δημιουργεί κατάλογο -cd: Αλλάζει κατάλογο -cp: Αντιγράφει αρχεία και καταλόγους -rm -rf: Διαγράφει αναδρομικά έναν κατάλογο (εφόσον υπάρχει το -rf) - -Στην πρώτη σειρά, το && σημαίνει ότι η επόμενη εντολή θα εκτελεστεί -μόνο αν η προηγούμενη εντολή εκτελεστεί επιτυχώς. Στην δεύτερη σειρά -το '.' δηλώνει τον κατάλογο που βρισκόμαστε - το '..' δηλώνει -τον γονικό κατάλογο. - - mkdir mydir1 && cd mydir1 - cp ../full.txt . - cd .. - rm -rf mydir1 - -Ερώτηση 6: ----------- -Δώστε τις εντολές που θα εμφανίσουν: -(α) όλα τα αρχεία του καταλόγου /usr με πληροφορίες για το inode τους και -το μέγεθος τους σε blocks. -(β) όλα τα περιεχόμενα του δέντρου καταλόγων και υποκαταλόγων (αναδρομικά) -που βρίσκονται κάτω από τον κατάλογο /usr, με πλήρεις πληροφορίες για -κάθε ένα από αυτά και εμφανιζόμενα σταδιακά, σελίδα προς σελίδα. - -Απάντηση: -Και στα δύο υποερωτήματα θα χρησιμοποιηθεί η εντολή 'ls' -(α) Η επιλογή -i εμφανίζει το inode και η επιλογή --s το μέγεθος σε blocks, οπότε - - ls -lsi /usr - -(β) Η επιλογή -R εμφανίζει αναδρομικά όλα τα περιεχόμενα ενός -καταλόγου, οπότε - - ls -lR /usr - -Ερώτηση 7: ----------- -Δημιουργήστε έναν κατάλογο με όνομα 'testdir1'. Μεταβείτε σε αυτόν -και φτιάξτε εκεί ένα hard link (με το όνομα 'ask1link') προς το αρχείο -'ask1.txt' του γονικού καταλόγου. Βεβαιωθείτε (δίνοντας την κατάλληλη -εντολή και εξηγώντας τι βλέπετε) ότι έχει δημιουργηθεί και ότι δεν είναι -symbolic (soft) link. - -Απάντηση: -Για να φτιάξουμε hard link θα χρησιμοποιήσουμε την εντολή 'ln'. - - mkdir testdir1 && cd testdir1 - ln ../ask1.txt ask1link - -Αν εκτελέσουμε την εντολή 'ls -li' στον κατάλογο testdir1 θα δούμε -ότι σε αντίθεση με το soft link, στο hard link δεν εμφανίζεται -το -> το οποίο δηλώνει ότι είναι symbolic link. Επίσης -παρατηρούμε ότι και το ask1link αλλά και το ask1.txt έχουν το ίδιο -inode. - -Ερώτηση 8: ----------- -Μπείτε στο αρχείο 'ask1link' και διαγράψτε την τελευταία του γραμμή. -Βεβαιωθείτε στη συνέχεια ότι η αλλαγή αυτή έχει γίνει και στο αρχείο 'ask1.txt'. - -Απάντηση: -Εφόσον το ask1link ειναι hardlink στο ask1.txt, δηλαδή είναι reference -στο ask1.txt, ό,τι αλλαγή γίνει στο ένα αρχείο, θα γίνει και στο άλλο, -οπότε αν διαγράψουμε την τελευταία γραμμή από το ask1link, η αλλαγή -πράγματι θα έχει γίνει και στο ask1.txt. - -Ερώτηση 9: ----------- -Δημιουργήστε ένα κατάλογο kat1 και μέσα σε αυτόν δύο αρχεία, file1 και file2, -με περιεχόμενο τη λέξη 'one' το ένα και τη λέξη 'two' το άλλο. -Τρέξτε (μέσα στον κατάλογο kat1) την εντολή 'cp *' και εξηγήστε το αποτέλεσμα. -Στη συνέχεια τρέξτε την εντολή 'mv *' και εξηγήστε το αποτέλεσμα. - -Απάντηση: -Αρχικά πρέπει να γράψουμε τα περιέχομενα στα κατάλληλα αρχεία. - - echo "one" > file1 - echo "two" > file2 - -Αφού τρέξουμε την εντολή 'cp *' στον kat1 θα παρατηρήσουμε ότι και τα -δύο αρχεία τώρα έχουν την λέξη "one". - - $ cat file1 file2 - - one - one - -Αυτό γίνεται επειδή γράφοντας 'cp *', επιλέγουμε όλα τα αρχεία του -καταλόγου. Επειδή όμως έχουμε δύο αρχεία η εντολή θα αναπτυχθεί σε - - cp file1 file2 - -και αυτό που θα γίνει τελικά είναι να αντιγραφεί το file1 στο file2. -Όταν τρέξουμε την εντολή 'mv *' θα δούμε ότι διαγράφεται το file1, -επειδή, όπως και με την 'cp *', η εντολή θα αναπτυχθεί σε - - mv file1 file2 - -οπότε το file1 θα μετονομαστεί σε file2, και έτσι θα χαθεί. - -Ερώτηση 10: ------------ -Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες τελειώνουν -με ένα ή περισσότερα συνεχόμενα ψηφία. - -Απάντηση: -Η εντολή 'grep' δέχεται ένα regular expression (regex) και επιστρέφει -τις γραμμές στο αρχείο στις οποίες βρίσκεται το regex. -Το regex που θα ψάξουμε θα αποτελείται από τα εξής μέρη: - -1. [0-9] - οποιδήποτε ψηφίο από το 0 εώς το 9 -2. \+ - μία ή παραπάνω επαναλήψεις του προηγούμενου -3. $ - τέλος γραμμής - -Οπότε η τελική εντολή θα είναι - - grep "[0-9]\+$" ask1.txt - -Ερώτηση 11: ------------ -Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες περιέχουν μεν -το πρότυπο 'Pap' αλλά δεν περιέχουν το πρότυπο 'Aig'. - -Απάντηση: -Στην εντολή 'grep' η επιλογή -v αποκλείει το δοθέν regex. Προκειμένου -πρώτα να πάρουμε τις γραμμές που περιέχουν το πρότυπο 'Pap' αλλα όχι -το πρότυπο 'Aig', θα εκτελέσουμε το 'grep' 2 φορές, ώστε πρώτα να πάρουμε -όλες τις γραμμές που περιέχουν το 'Pap' και μετά να αποκλείσουμε το 'Aig'. - - grep 'Pap' ask1.txt | grep -v 'Aig' - -Ερώτηση 12: ------------ -Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες δεν αρχίζουν -με 'G' ή 'N' και περιέχουν εν συνεχεία (κάπου στα περιεχόμενά τους) -τα πρότυπα 'Geo' και 'Per' με αυτή τη σειρά.' - -Aπάντηση: -Όπως και στην ερώτηση 11, θα μπορούσαμε να χρησιμοποιήσουμε την επιλογή --v για την εντολή 'grep', αλλα θα χρησιμοποιήσουμε μία διαφορετική σύνταξη. -Αυτή τη φορά τα regex που θα ψάξουμε είναι τα εξής - -Για την πρώτη κλήση: -1. ^ - ξεκινάει με -2. ^[GN] - πρεπει να ξεκινάει με G ή N -3. ^[^GN] - ΔΕΝ πρέπει να ξεκινάει με G ή N - -Για την δεύτερη κλήση: -1. Geo - περιέχει την λέξη 'Geo' -2. .* - οποιοσδήποτε αριθμός οποιουδήποτε χαρακτήρα -3. Per - περιέχει την λέξη 'Per' - -Οπότε η τελική εντολή είναι (το | ειναι separator) - - grep "^[^GN]" ask1.txt | grep "Geo.*Per" - -Αποτέλεσμα εκτέλεσης εντολής: - - Helen Georgioy helen3 12136 Peristeri 5748456 - -Ερώτηση 13: ------------ -Πόσοι χρήστες που το username τους δεν αρχίζει από 'ls1' είναι -συνδεδεμένοι στο σύστημα; - -Απάντηση: -Η εντολή 'who' μπορεί να μας επιστρέψει μια λίστα με τους χρήστες -που είναι συνδεδεμένοι. Ο λόγος που χρησιμοποίησα την 'who' αντί -για την 'w' που κάνει περίπου το ίδιο πράγμα είναι επειδή η 'w' -έχει και μια γραμμή header στην αρχή, οπότε 'wc -l' θα την μέτραγε. -Με την χρήση της εντολής 'wc' μπορούμε να μετρήσουμε λέξεις, γραμμές -και χαρακτήρες. Αν στην εντολή 'wc' δώσουμε την επιλογή -l τότε θα -μετρήσει μόνο πόσες γραμμές έχει το input που της δώθηκε. - - who | grep -v "^ls1" | wc -l - -Ερώτηση 14: ------------ -Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή -τη στιγμή στο σύστημα. - -Απάντηση: -Η εντολή 'ps' (process status) εμφανίζει τις τρέχουσες διεργασίες που -εκτελεί το σύστημα. Επιπλέον θα χρειαστούμε τις επιλογές a και u, οι οποίες -εμφανίζουν τις διεργασίες που εκτελούνται από όλους τους συνδεδεμένους χρήστες -αυτή τη στιγμη. Στην εντολή 'ps' χρησιμοποιήσα την BSD σύνταξη. - - ps -au - -Αποτέλεσμα εκτέλεσης της εντολής: - - USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND - christos 5200 0.1 0.1 18048 7084 2 Ss 21:44 0:09.04 /usr/local/bin/zsh - christos 1160 0.0 0.1 15072 6016 v0 I 12:19 0:00.07 -zsh (zsh) - christos 1175 0.0 0.0 11828 3044 v0 I+ 12:19 0:00.00 /bin/sh /usr/local/bin/startx - christos 1188 0.0 0.0 13164 3240 v0 I+ 12:19 0:00.00 xinit /home/christos/.xinitrc - christos 1192 0.0 0.1 22152 11360 v0 S 12:19 0:19.69 dwm - christos 1218 0.0 0.1 17136 8000 0- S 12:20 0:16.20 slstatus - christos 5005 0.0 0.1 18004 7000 1 Is 21:15 0:00.31 /usr/local/bin/zsh - christos 5193 0.0 0.2 28028 16288 1 S+ 21:44 0:07.88 nvim ex1.txt - christos 6849 0.0 0.0 11860 3080 2 R+ 00:22 0:00.00 ps -u - root 1158 0.0 0.0 10880 2304 v1 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv1 - root 1159 0.0 0.0 10880 2304 v2 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv2 - root 1160 0.0 0.0 10880 2304 v3 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv3 - -Ερώτηση 15: ------------ -Πόσες διεργασίες χρηστών (αλλ/σης) τρέχουν στο σύστημα και τελειώνει -το όνομά τους με 'sh' ? - -Απάντηση: -Τρέχοντας την εντολή της ερώτησης 14 (ps -ux) και φιλτράροντας -το ouput ώστε να πάρουμε μόνο τις γραμμές που τελειώνουν σε -'sh', έχω 3 διεργασίες που το όνομα τους τελειώνει σε 'sh' - - ps -au | grep "sh$" | wc -l - -Συνολικά έχουμε 3 διεργασίες που τελειώνουν σε sh. - -Ερώτηση 16: ------------ -Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή τη στιγμή στο σύστημα. - -Απάντηση: -Αυτή τη φορά στην εντολή 'ps', πέρα από την επιλογή u, θα δώσουμε και την επιλογή -x, η οποία εμφναίζει πληροφορίες ακόμα και για διεργασίες που δεν ελέγχουν κάποιο terminal - - ps -aux - -Το output της εντολής είναι πολύ μεγάλο για να το συμπεριλάβω εδώ. - -Ερώτηση 17: ------------ -Πόσα αρχεία του τρέχοντος καταλόγου σας (μόνο του τρέχοντος -όχι και -των υποκαταλόγων του) έχουν permissions 'rw' από τους πάντες και 'x' -από κανέναν; - -Απάντηση: -Η 'ls -l' στην αρχή κάθε σειράς εμφανίζει το permission string και με την -'grep' μπορούμε να εμφανίσουμε μόνο τις γραμμές που περιέχουν το permission -που ζητάει η εκφώνηση. Τέλος διοχετεύουμε την έξοδο στην 'wc -l'. - - ls -l | grep "^-rw-rw-rw-" | wc -l - -Ερώτηση 18: ------------ -Βρείτε τους καταλόγους του συστήματος που το όνομά τους αρχίζει από 'b'. - -Απάντηση: -Η εντολή 'find' είναι μια πιο ανεπτυγμένη μορφή της 'ls' στην οποία μπορούμε -να δώσουμε πολλές παραπάνω επιλογές. Οι επιλογές που έχουν δωθεί στην παρακάτω εντολή -σημαίνουν τα εξής: -/* - η αναζήτηση ξεκινάει από την ρίζα του συστήματος (root directory) --type d - αναζήτηση μόνο για directories --name "b*" - το όνομα τους πρέπει να ξεκινάει από 'b' - - find /* -type d -name "b*" - -Ερώτηση 19: ------------ -Να βρείτε και να παρουσιάσετε στην οθόνη με πλήρεις πληροφορίες -όλα τα αρχεία με όνομα που αρχίζει από tty και βρίσκονται στον κατάλογο /dev. - -Απάντηση: -Η εντολή stat επιστρέφει πλήρεις πληροφορίες για ένα αρχείο. -Με την εντολή 'grep', όπως έχει ειπωθεί και σε παραπάνω ερωτήσεις, μπορούμε -να πάρουμε τις γραμμές στις οποίες γίνεται match ένα regular -expression - έτσι κατά την εμφάνιση των αρχείων του /dev μπορούμε -να εξάγουμε μόνο όσες γραμμές περιέχουν την λέξη 'tty'. - - stat /dev/* | grep "tty" - -Ερώτηση 20: ------------ -Ταξινομήστε τα περιεχόμενα του αρχείου 'ask1.txt' ως προς το -username σε φθίνουσα σειρά. - -Απάντηση: -Θα ταξινομίσουμε το αρχείο με την χρήση της εντολής 'sort'. -Στην εντολή αυτή μπορούμε να της δώσουμε κατα ποιά στήλη θέλουμε -να ταξινομηθεί το αρχείο με την επιλογή -k. Εφόσον username -βρίσκεται στην 3η στήλη, θα δώσουμε την 3η στήλη ως μέσο -σύγκρισης για ταξινόμηση. Επίσης, προκειμένου να είναι κατα -φθήνουσα σειρά η ταξινόμηση, θα χρησιμοποιήσουμε την επιλογή -r - - sort -rk 3 ask1.txt - -Σε περίπτωση που θέλουμε οι αλλαγές να γραφτούν στο αρχείο, μπορούμε -να γράψουμε την εντολή ως - - sort -rk 3 ask1.txt -o ask1.txt - -Ερώτηση 21: ------------ -Ταξινομήστε τα '.c' αρχεία του καταλόγου στον οποίον δουλεύετε ως -προς το μέγεθός τους. - -Απάντηση: -Στην εντολή 'ls' η επιλογή -S ταξινομεί τα αρχεία ανάλογα με το -μέγεθός του κατα φθήνουσα σειρά (μεγαλύτερο πρώτα), οπότε - - ls -S *.c - -Ερώτηση 22: ------------ -Ταξινομήστε τα αρχεία του λογαριασμού σας με permissions 644 -ως προς το μέγεθός τους. - -Απάντηση: -Μπορούμε να εμφανίσουμε αρχεία που έχουν συγκεκριμένα permissions -με την εντολή 'find' και την επιλογή -perm [PERMISSION] όπου -το PERMISSION πρέπει να δωθεί σε οκταδικό. Επίσης μέσα στην 'find' -μπορούμε να εκτελέσουμε και επιπλέον shell commands στο output της με -την επιλογή -exec [COMMAND] - θα χρησιμοποιήσουμε την 'ls -lS' ώστε -να ταξινομήσει το output κατα μέγεθος. Η τελική εντολή θα εκτελεστεί -στον κατάλογο '/usr/home/christos', ο οποίος είναι ο κατάλογος του λογαριασμού -μου. Το {} \; στο τέλος της εντολής δηλώνει ότι η 'ls -lS' θα εκτελεστεί -σε κάθε αρχείο που βρίσκεται από την 'find'. - - find /usr/home/christos -perm 644 -exec ls -lS {} \; - - -Ερώτηση 23: ------------ -Ταξινομήστε όλα τα περιεχόμενα του καταλόγου /dev κατά πρώτον ως προς -τον owner και κατά δεύτερον ως προς το group και αποθηκεύστε το -output στο αρχείο 'binfiles.txt'. - -Аπάντηση: -Παίρνοντας πληροφορίες για τον owner και το group των αρχείων με την -'ls -l' μπορούμε να ταξινομήσουμε τις κατάλληλες στήλες (3 για owner -και 4 για group). - - ls -l | sort -k 3,4 > binfiles.txt - -Ερώτηση 24: ------------ -Φτιάξτε ένα αρχείο που θα περιέχει πληροφορίες μόνο για τους συνδεδεμένους -χρήστες που το username τους αρχίζει από 'ls1', ταξινομημένο ως προς -την ημερομηνία και ώρα σύνδεσή τους. - -Απάντηση: -ΑΦού φιλτραριστεί το ouput της 'w' ώστε να πάρουμε μόνο τους -χρήστες που το όνομά τους ξεκινάει από ls1, θα ταξινομήσουμε -κατά 2η και 3η στείλει επειδή αυτές δείχνουν την ημερομηνία -και ώρα σύνδεσης. - - w | grep "^ls1" | sort -k 2,3 > userinfo.txt - -Ερώτηση 25: ------------ -Αλλάξτεστο αρχείο 'ask1.txt' το όνομα 'Nick' (όπου συναντάται) σε 'Nickolaos'. - -Απάντηση: -Με την χρήση της εντολής 'sed' (stream editor) μπορούμε να αλλάξουμε ένα -pattern κάθε φορά που συναντάται με την παρακάτω σύνταξη - - sed "s/PATTERN/NEWPATTERN/g" file - -Τo g στο τέλος σημαίνει ότι αυτή η αλλαγή πρέπει να γίνει σε όλο το αρχείο, -και όχι μόνο την πρώτη φορά που θα συναντήσει το PATTERN. -Οπότε, στην προκειμένη περίπτωση η εντολή που θα εκτελεστεί είναι - - sed "s/Nick/Nickolaos/g" ask1.txt - -Εάν θέλουμε οι αλλαγές να αποθηκευτούν στο αρχείο κατευθείαν, μπορούμε -να εκτελέσουμε την εντολή με την επιλογή -i. - - sed -i "s/Nick/Nickolaos/g" ask1.txt - -Ερώτηση 26: ------------ -Έστω τα ακόλουθα items του filesystem με protection strings: -(α) '-rwxr-x--x', -(β) 'drwxr-x---' και -(γ) 'drwx--x--x. -Εξηγείστε τι είδους items είναι και ποια τα δικαιώματα πρόσβασης user, -group και others σε αυτά. - -Απάντηση: -(α) Το είδος item είναι απλό αρχείο εφόσον το πρώτο πεδίο του protection string -είναι κενό. Όσο αφορά τα δικαίωματα του, δικαίωμα εγγραφής έχει μόνο ο ιδιοκτήτης -του αρχείο, διαβάσματος ο ιδιοκτήτης του αρχείου, και όσοι είναι στο ίδιο group με αυτόν. -Επίσης όλοι οι χρήστες μπορούνε να το εκτελέσουν. - -(β) Το είδος είναι directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα εγγραφής -έχει μόνο ο ιδιοκτήτης, διαβάσματος και εκτέλεσης ο ιδιοκτήτης και τα μέλη του group - -οι υπόλοιποι χρήστες δεν έχουν δικαιώματα για το συγκεκριμένο directory. - -(γ) Το είδος είναι επίσης directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα -εγγραφής και διαβάσματος έχει μόνο ο ιδιοκτήτης και εκτέλεσης όλοι οι χρήστες. - -Ερώτηση 27: ------------ -Αλλάξτε τα permissions όλων των αρχείων του καταλόγου 'testdir1' -έτσι ώστε να έχουν δικαίωμα εκτέλεσης και εγγραφής μόνο ο ιδιοκτήτης, -ενώ δικαίωμα ανάγνωσης να έχουν όλοι. - -Απάντηση: -Η εντολή 'chmod' μπορεί να αλλάξει permissions. Με την επιλογή 'R' δηλώνουμε -ότι αυτό θέλουμε να γίνει αναδρομικά εφόσον θέλουμε να αλλάξουμε τα permissions -όλων των αρχείων του καταλόγου 'testdir1'. Τα υπόλοιπα πεδία σημαίνουν τα εξής: -u=wx - μόνο ο ιδιοκτήτης του αρχείου έχει δικαίωμα εγγραφής και εκτέλεσης -o=r - οι υπόλοιποι χρήστες έχουν δικαίωμα ανάγνωσης - - chmod -R u=wx,o=r testdir - -Ερώτηση 28: ------------ -Αλλάξτε τα permissions του καταλόγου 'testdir1' έτσι ώστε να έχουν δικαίωμα -πρόσβασης μόνοο ιδιοκτήτης και οι χρήστες του ιδίου με αυτόν group, -ενώ οι υπόλοιποι χρήστες να μην έχουν (θεωρείστε ότι τα τρέχοντα -permissions του καταλόγου είναι 755). - -Απάντηση: -Χρησιμοποιώντας πάλι την εντολή 'chmod' μπορούμε να αλλάξουμε και τα permissions -ενός καταλόγου. Τα πεδία τώρα σημαίνουν τα εξής: -ug=r - ο ιδιοκτήτης και τα μέλη του group έχουν δικαίωμα διαβάσματος -o-r - οι υπόλοιποι χρήστες δεν έχουν δικαίωμα διαβάσματος - - chmod ug=r,o-r testdir - -Ερώτηση 29: ------------ -Δημιουργήστε έναν νέο χρήστη στο σύστημά σας με username 'myfriend'. -Αλλάξτε στη συνέχεια τον ιδιοκτήτη του αρχείου 'ask1.txt' σε 'myfriend' και -μετακινήστε το στο working directory του. Περιορίστε τέλος το διαθέσιμο -χώρο αποθήκευσης στο δίσκο για το συγκεκριμένο χρήστη στα 10MB. - -Απάντηση: -Για να φτιάξουμε έναν user χρησιμοποιούμε την εντολή 'useradd'. Σε BSD -συστήματα η εντολή είναι η 'adduser'. Για να αλλάξουμε ιδιοκτήτη αρχείου -χρησιμοποιούμε την εντολή 'chown'. Τέλος, για να περιορίσουμε τον χώρο -αποθηκεύσης στον δίσκο για έναν χρήστη χρησιμοποιούμε την εντολή 'edquota'. - - useradd -m -d /home/myfriend myfriend - chown myfriend ask1.txt - mv ask1.txt /home/myfriend - edquota myfriend - -Η εντολή 'edquota' θα μάς ανοίξει στον default editor μας ένα αρχείο -στο οποίο μπορούμε να τροποποιήσουμε τον αποθηκευτικό χώρο για τον χρήστη -myfriend. Θα πρέπει να δούμε κάτι σαν - - Disk quotas for user ice19390133 (uid 1022): - Filesystem blocks soft hard inodes soft hard - /dev/vda1 36 10240 13312 11 0 0 - -Το 'soft' το θέτουμε σε 10240 (kilobyte), δηλαδή 10MB. - -Ερώτηση 30: ------------ -Έστω τα παρακάτω: -user1@localhost:~$ w -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -user1 pts/0 1.2.3.4 03:34 0.00s 0.38s 0.01s w -user2 pts/1 5.6.7.8 03:45 0.00s 0.38s 0.01s ls -user3 pts/2 9.7.5.3 03:57 0.00s 0.38s 0.01s ps - -user1@localhost:~$ ls -al /dev/pts/* -crw--w---- 1 user1 tty136, 0 Oct 25 04:04 /dev/pts/0 -crw--w--w- 1 user2 tty136, 1 Oct 25 04:04 /dev/pts/1 -crw--w--w- 1 user3 tty136, 2 Oct 25 04:04 /dev/pts/2 - -Εξηγήστε τι είδους items του file system είναι τα παραπάνω, -καθώς και τι θα κάνουν οι παρακάτω εντολές: -user1@localhost:~$ cat > /dev/pts/1 -user1@localhost:~$ wall "test" - -Απάντηση: -Σε ένα permission string, το 'c' δηλώνει ότι αυτό το item -ειναι 'character device', το οποίο πρακτικά σημαίνει συσκευές -οι οποίες μεταφέρουν δεδομένα σε μορφή κειμένου (bytes). Τέτοιες -συσκευές είναι για παράδειγμα τα ηχεία. Στην προκειμένη περίπτωση -το item ειναι 'tty' (από το teletype), δηλαδή είναι terminals. Τα -συγκεκριμένα terminals ειναι συνδεδεμένα με το πληκτρολόγιο. - -Η εντολή 'cat > /dev/pts/1' θα εμφανίζει στο πρώτο terminal που -ανοίχτηκε οτίδηποτε γράψουμε στο stdin. Στον κατάλογο /dev/pts/ -εμφανίζονται τα ανοιχτά terminals που τρέχουν αυτή τη στιγμή. - - $ cat > /dev/pts/1 - - hello world - hello world - -Η εντολή 'wall "test"' θα στείλει το μήνυμα "test" σε όλους τους -συνδεδεμένους χρήστες. - - $ wall "test" - - Broadcast message from christos@freebsd (pts/1) (Wed Nov 14 23:26:58 2020): - - test - - -Ερώτηση 31: ------------ -Δημιουργείστε τα αρχεία f1, f2, f3, f4, f5, f6 ,f7 με τα εξής δικαιώματα: -f1, 757 -f2, 313 -f3, 010 -f4, 642 -f5, 551 -f6, 133 -f7, 111 -Με χρήση της εντολής ls –l και διοχετεύοντας τα αποτελέσματά της στην εντολή -egrep να βρείτε τα αρχεία όπου: -a. To group έχει δικαιώματα r-x. -b. Ο user και οι others έχουν ακριβώς τα ίδια δικαιώματα -c. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write -d. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write και execute -e. To group και οι others έχουν τα ίδια δικαιώματα για read και execute - -Απάντηση: -a) Το pattern που θα αναζητήσουμε είναι στο permission string να περιέχονται -οποιοιδήποτε χαρακτήρες σε όλα τα πεδία αλλά πρέπει οπωσδήποτε τα permissions -του group να είναι r-x. Το - στην αρχή το βάζουμε για να ψάξουμε μόνο αρχεία και όχι -τυχόν directories. - - ls -l | egrep "^-...r-x..." - -Αποτέλεσμα εκτέλεσης της εντολής: - - -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1 - -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5 - -b) Θα φτιάξουμε τρία capture groups στα πεδια που βρισκονται τα permissions -του user ώστε να ψάξουμε ό,τι αποθηκεύτηκε στις μεταβλητές 1, 2 και 3 -στο πεδίο που βρίσκονται τα permissions των others. Ένα capture group φτιάχνουμε -βάζοντας () και γράφοντας μέσα τους το pattern που θέλουμε. - - ls -l | egrep "^-(.)(.)(.)...\1\2\3" - -Πιο αναλυτικά συμβαίνει το εξής: -1. Θέλουμε το pattern να ξεκινάει με - ώστε να είναι αρχείο -2. Αποθηκεύουμε τους 3 επόμενους χαρακτήρες στις μεταβλητές 1, 2, 3. -3. Έχουμε φτάσει στο πεδίο του group, οπότε ψάχνουμε για οποιονδήποτε -χαρακτήρα επειδή δεν μας νοιάζει σε αυτό το παράδειγμα τι permissions έχει το group. -4. Тώρα είμαστε στο πεδίο των others. Εμφανίζουμε τις μεταβλητές 1, 2, 3 -(με την σειρά) οι οποίες έχουν κρατήσει κάθε permission του user. - -Αποτέλεσμα εκτέλεσης της εντολής: - - -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1 - --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2 - ------x--- 1 christos christos 0 Nov 14 22:16 f3 - ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 - -c) Με την ίδια λογική όπως στο ερώτημα b, απλώς αυτή τη φορά δεν θα κρατήσουμε όλα τα -permissions του user, αλλά μόνο τα permissions για write. - - ls -l | egrep "^-.(.)..\1..\1." - -Αποτέλεσμα εκτέλεσης της εντολής: - - ------x--- 1 christos christos 0 Nov 14 22:16 f3 - -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5 - ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 - -d) Ξανά με την ίδια λογική, αλλά κρατήσουμε τα πεδία για write και execute. - - ls -l | egrep "^-.(.)(.).\1\2.\1\2" - -Αποτέλεσμα εκτέλεσης της εντολής: - - -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5 - ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 - -e) Αυτή τη φορά θα κρατήσουμε στις μεταβλητές τα permissions από το group, και όχι -από τον user. - - ls -l | egrep "^-...(.).(.)\1.\2" - -Αποτέλεσμα εκτέλεσης της εντολής: - - -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1 - --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2 - ---x-wx-wx 1 christos christos 0 Nov 14 22:16 f6 - ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 - -Ερώτηση 32: ------------ -Υποθέστε πως οι γραμμές στο αρχείο /etc/passwd είναι όμοιες με την παρακάτω: - -spouneri:x:2107:1067:Pouneridis Sokratis:/home/student/e2021/spouneri:/bin/bash - -Στο πέμπτο πεδίο θα υπάρχει πάντα πρώτο το επίθετο και μετά το όνομα του χρήστη. -Μόνο ένα επίθετο και μόνο ένα όνομα, γραμμένα με λατινικούς χαρακτήρες κεφαλαίους -ή/και πεζούς. - -Τα υπόλοιπα πεδία θα είναι γραμμένα πάντα με πεζούς λατινικούς -χαρακτήρες. - -Ελέγχοντας το αρχείο /etc/passwd και κάνοντας χρήση της εντολής egrep -βρείτε όλους τους (υποθετικούς) χρήστες του συστήματος όπου: - -a. Χρησιμοποιούν για κέλυφος το bash -b. To HOME DIRECTORY τους βρίσκεται στον κατάλογο /home -c. To UID τους είναι ίδιο μετο GID τους -d. Τουλάχιστον τα 5 πρώτα γράμματα του επιθέτου τους αποτελούν μέρος και του username τους -e. Τουλάχιστον τα 3 πρώτα γράμματα του επιθέτου τους και τα 3 πρώτα γράμματα του -ονόματός τους αποτελούν μέρος και του username τους. - -Απάντηση: - -=================================================================== -=================================================================== -32 -=================================================================== -=================================================================== +# Eργαστήριο ΛΣ 1 / Άσκηση 1 / 2020-21 +# Ονοματεπώνυμο: Χρήστος Μαργιώλης +# ΑΜ: [REDACTED] +# ==================================== +# +# Ερώτηση 1: +# ---------- +# Δημιουργήστε στον τρέχοντα κατάλογο το αρχείο 'ask1.txt' με τα ακόλουθα +# περιεχόμενα(όνομα, επώνυμο, username, ΤΚ, περιοχή, τηλ.), και εμφανίστε +# το στησυνέχεια στην οθόνη, με αριθμημένες τις γραμμές του. +# +# Απάντηση: +# Προκειμένου να δημιουργήσουμε ένα αρχείο χρησιμοποιούμε την εντολή 'touch [FILE...]', +# όπου FILE είναι το όνομα του αρχείου και ... ότι μπορούμε να δώσουμε όσα ορίσματα +# θελουμε. Στην προκειμένη περίπτωση + +touch ask1.txt + +# Αν και θα μπορούσαμε να γράψουμε τα δεδομένα του αρχείο σε έναν +# κειμενογράφο, χρησιμοποιώντας την 'echo' (και οποιαδηποτε παρόμοια εντολή, +# όπως την 'printf'), μπορούμε να ανακατευθύνουμε την έξοδο της στο αρχείο που θέλουμε, +# οπότε μπορούμε με τις παρακάτω εντολές να έχουμε το ίδιο αποτέλεσμα. +# Για χάρην απλότητας στο διάβασμα επέλεξα να καλέσω αρκετές φορές την 'echo' αντί να +# ενώσω τα πάντα με newlines. Από την δεύτερη κλήση της και μετά το >> σημαίνει +# ότι θέλουμε να γράψουμε στο τέλος του αρχείο, όχι να γράψουμε το αρχείο από την αρχή. + +echo "George Pappas george2 12136 Peristeri-------" > ask1.txt +echo "Nick Nikolaoy nick23 12232 Aigaleo 5314555" >> ask1.txt +echo "George Georgioy george583 11132 Athens-------" >> ask1.txt +echo "Helen Georgioy helen3 12136 Peristeri 5748456" >> ask1.txt +echo "Nick Pappas nick4 11223 Aigaleo 5324123" >> ask1.txt +echo "Helen Ioannoy helen367 13222 Athens" ------- >> ask1.txt +echo "Helen Thanoy helen36 11132 Peristeri9718345" >> ask1.txt +echo "Vasilis Mamalis vas32 12345 Dafni 9738383" >> ask1.txt + +# Για να εμφανίσουμε τα περιεχόμενα του αρχείου με αριθμημένες σειρές, +# θα χρησιμοποιηθεί η εντολή 'nl', η οποία αριθμεί σειρές, δέχοντας ως +# input το αρχείο με τα περιεχόμενα. + +nl ask1.txt + +# Αποτέλεσμα εκτέλεσης εντολής: +# +# 1 George Pappas george2 12136 Peristeri------- +# 2 Nick Nikolaoy nick23 12232 Aigaleo 5314555 +# 3 George Georgioy george583 11132 Athens------- +# 4 Helen Georgioy helen3 12136 Peristeri 5748456 +# 5 Nick Pappas nick4 11223 Aigaleo 5324123 +# 6 Helen Ioannoy helen367 13222 Athens ------- +# 7 Helen Thanoy helen36 11132 Peristeri9718345 +# 8 Vasilis Mamalis vas32 12345 Dafni 9738383 +# +# Ερώτηση 2: +# ---------- +# Τρέξτε την εντολή cal -3 > calfile.txt και εξηγείστε τι ακριβώς κάνει. +# +# Απάντηση: +# Η εντολή 'cal' αρχικά εμφανίζει ημερολόγιο του τρέχοντος μήνα. Με την +# εντολή + +cal -3 > calfile.txt + +# Θα εμφανιστεί ο προηγούμενος, τρέχων και επόμενος μήνας, και στην συνέχεια +# το output της εντολής θα γραφτεί στο αρχείο calfile.txt +# +# Ερώτηση 3: +# ---------- +# Συνενώστε τα αρχεία calfile.txt και ask1.txt σε ένα αρχείο με όνομα full.txt +# +# Απάντηση: +# Για την συνένωση των δύο παραπάνω αρχείων - και γενικότερα δύο ή παραπάνω +# αρχειών - χρησιμοποιούμε την εντολή 'cat', οπότε + +cat calfile.txt ask1.txt > full.txt + +# Ερώτηση 4: +# ---------- +# Εμφανίστε στην οθόνη τα πέντε πιο πρόσφατα τροποποιημένα αρχεία του καταλόγου σας. +# +# Απάντηση: +# Για να εμφανίσουμε τα αρχεία του καταλόγου χρησιμοποιούμε την εντολή 'ls'. +# Προκειμένου να εμφανιστούν κατά ημερομηνία τροποποίησης ενεργοποιούμε την +# επιλογή -t. Έπειτα θα κάνουμε pipe το output του 'ls' στην εντολή 'head' για να +# εμφανίσουμε μόνο τα 5 πρώτα αρχεία. + +ls -t | head -6 + +# Ερώτηση 5: +# ---------- +# Δημιουργήστε έναν κατάλογο με όνομα 'mydir1'. Μεταβείτε σε αυτόν και στη +# συνέχεια αντιγράψτε εκεί (χωρίς να αλλάξετε κατάλογο) το αρχείο 'full.txt' +# (από το γονικό κατάλογο). Μετονομάστε το εν συνεχεία σε 'new.txt'. +# Επιστρέψτε στο γονικό κατάλογο. Διαγράψτε τον κατάλογο 'mydir1' και τα +# περιεχόμενά του. +# +# Απάντηση: +# Οι εντολές που θα χρειαστούμε είναι οι εξής: +# mkdir Δημιουργεί κατάλογο +# cd Αλλάζει κατάλογο +# cp Αντιγράφει αρχεία και καταλόγους +# rm -rf Διαγράφει αναδρομικά έναν κατάλογο (εφόσον υπάρχει το -rf) +# +# Στην πρώτη σειρά, το && σημαίνει ότι η επόμενη εντολή θα εκτελεστεί +# μόνο αν η προηγούμενη εντολή εκτελεστεί επιτυχώς. Στην δεύτερη σειρά +# το '.' δηλώνει τον κατάλογο που βρισκόμαστε - το '..' δηλώνει +# τον γονικό κατάλογο. + +mkdir mydir1 && cd mydir1 +cp ../full.txt . +cd .. +rm -rf mydir1 + +# Ερώτηση 6: +# ---------- +# Δώστε τις εντολές που θα εμφανίσουν: +# (α) όλα τα αρχεία του καταλόγου /usr με πληροφορίες για το inode τους και +# το μέγεθος τους σε blocks. +# (β) όλα τα περιεχόμενα του δέντρου καταλόγων και υποκαταλόγων (αναδρομικά) +# που βρίσκονται κάτω από τον κατάλογο /usr, με πλήρεις πληροφορίες για +# κάθε ένα από αυτά και εμφανιζόμενα σταδιακά, σελίδα προς σελίδα. +# +# Απάντηση: +# Και στα δύο υποερωτήματα θα χρησιμοποιηθεί η εντολή 'ls' +# (α) Η επιλογή -i εμφανίζει το inode και η επιλογή +# -s το μέγεθος σε blocks, οπότε + +ls -lsi /usr + +# (β) Η επιλογή -R εμφανίζει αναδρομικά όλα τα περιεχόμενα ενός +# καταλόγου, οπότε + +ls -lR /usr + +# Ερώτηση 7: +# ---------- +# Δημιουργήστε έναν κατάλογο με όνομα 'testdir1'. Μεταβείτε σε αυτόν +# και φτιάξτε εκεί ένα hard link (με το όνομα 'ask1link') προς το αρχείο +# 'ask1.txt' του γονικού καταλόγου. Βεβαιωθείτε (δίνοντας την κατάλληλη +# εντολή και εξηγώντας τι βλέπετε) ότι έχει δημιουργηθεί και ότι δεν είναι +# symbolic (soft) link. +# +# Απάντηση: +# Για να φτιάξουμε hard link θα χρησιμοποιήσουμε την εντολή 'ln'. + +mkdir testdir1 && cd testdir1 +ln ../ask1.txt ask1link + +# Αν εκτελέσουμε την εντολή 'ls -li' στον κατάλογο testdir1 θα δούμε +# ότι σε αντίθεση με το soft link, στο hard link δεν εμφανίζεται +# το -> το οποίο δηλώνει ότι είναι symbolic link. +# +# 11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1link +# +# Επίσης παρατηρούμε ότι και το ask1link αλλά και το ask1.txt έχουν το ίδιο inode. +# +# 11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1.txt +# 11403520 -rw-r--r-- 2 christos wheel 350 Nov 11 12:28 ask1link +# +# Ερώτηση 8: +# ---------- +# Μπείτε στο αρχείο 'ask1link' και διαγράψτε την τελευταία του γραμμή. +# Βεβαιωθείτε στη συνέχεια ότι η αλλαγή αυτή έχει γίνει και στο αρχείο 'ask1.txt'. +# +# Απάντηση: +# Εφόσον το ask1link ειναι hardlink στο 'ask1.txt', δηλαδή είναι reference +# στο 'ask1.txt', ό,τι αλλαγή γίνει στο ένα αρχείο, θα γίνει και στο άλλο, +# οπότε αν διαγράψουμε την τελευταία γραμμή από το 'ask1link', η αλλαγή +# πράγματι θα έχει γίνει και στο 'ask1.txt'. Ανοίγουμε το 'ask1link' στο +# Vim και εκτελούμε τις εξής εντολές ώστε να σβήσουμε την τελευταία γραμμή + +# vim ask1link + +# G πάει στην τελευταία γραμμή +# dd την σβήνει +# ZZ βγαίνουμε από το Vim +# +# Τώρα κάνοντας + +cd .. +diff ask1.txt testdir1/ask1link + +# βλέπουμε ότι εντολή δεν βγάζει output, το οποίο σημαίνει ότι τα αρχεία +# είναι ίδια, οπότε η αλλαγή που κάναμε στο ένα αρχείο ίσχυσε και στο άλλο. +# +# Ερώτηση 9: +# ---------- +# Δημιουργήστε ένα κατάλογο kat1 και μέσα σε αυτόν δύο αρχεία, file1 και file2, +# με περιεχόμενο τη λέξη 'one' το ένα και τη λέξη 'two' το άλλο. +# Τρέξτε (μέσα στον κατάλογο kat1) την εντολή 'cp *' και εξηγήστε το αποτέλεσμα. +# Στη συνέχεια τρέξτε την εντολή 'mv *' και εξηγήστε το αποτέλεσμα. +# +# Απάντηση: +# Αρχικά πρέπει να γράψουμε τα περιέχομενα στα κατάλληλα αρχεία. + +mkdir kat1 && cd kat1 +echo "one" > file1 +echo "two" > file2 + +# Αφού τρέξουμε την εντολή 'cp *' στον kat1 θα παρατηρήσουμε ότι και τα +# δύο αρχεία τώρα έχουν την λέξη "one". + +cp * +cat file1 file2 + +# one +# one +# +# Αυτό γίνεται επειδή γράφοντας 'cp *', επιλέγουμε όλα τα αρχεία του +# καταλόγου. Επειδή όμως έχουμε δύο αρχεία η εντολή θα αναπτυχθεί σε +# +# cp file1 file2 +# +# και αυτό που θα γίνει τελικά είναι να αντιγραφεί το file1 στο file2. +# Όταν τρέξουμε την εντολή 'mv *' θα δούμε ότι διαγράφεται το file1, +# επειδή, όπως και με την 'cp *', η εντολή θα αναπτυχθεί σε + +mv file1 file2 +ls +cd .. + +# οπότε το file1 θα μετονομαστεί σε file2, και έτσι θα χαθεί. +# +# Ερώτηση 10: +# ----------- +# Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες τελειώνουν +# με ένα ή περισσότερα συνεχόμενα ψηφία. +# +# Απάντηση: +# Η εντολή 'grep' δέχεται ένα regular expression (regex) και επιστρέφει +# τις γραμμές στο αρχείο στις οποίες βρίσκεται το regex. +# Το regex που θα ψάξουμε θα αποτελείται από τα εξής μέρη: +# +# 1. [0-9] οποιδήποτε ψηφίο από το 0 εώς το 9 +# 2. \+ μία ή παραπάνω επαναλήψεις του προηγούμενου +# 3. $ τέλος γραμμής +# +# Οπότε η τελική εντολή θα είναι + +grep "[0-9]\+$" ask1.txt + +# Ερώτηση 11: +# ----------- +# Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες περιέχουν μεν +# το πρότυπο 'Pap' αλλά δεν περιέχουν το πρότυπο 'Aig'. +# +# Απάντηση: +# Στην εντολή 'grep' η επιλογή -v αποκλείει το δοθέν regex. Προκειμένου +# πρώτα να πάρουμε τις γραμμές που περιέχουν το πρότυπο 'Pap' αλλα όχι +# το πρότυπο 'Aig', θα εκτελέσουμε το 'grep' 2 φορές, ώστε πρώτα να πάρουμε +# όλες τις γραμμές που περιέχουν το 'Pap' και μετά να αποκλείσουμε το 'Aig'. + +grep "Pap" ask1.txt | grep -v "Aig" + +# Ερώτηση 12: +# ----------- +# Εμφανίστε τις γραμμές του αρχείου 'ask1.txt' οι οποίες δεν αρχίζουν +# με 'G' ή 'N' και περιέχουν εν συνεχεία (κάπου στα περιεχόμενά τους) +# τα πρότυπα 'Geo' και 'Per' με αυτή τη σειρά.' +# +# Aπάντηση: +# Όπως και στην ερώτηση 11, θα μπορούσαμε να χρησιμοποιήσουμε την επιλογή +# -v για την εντολή 'grep', αλλα θα χρησιμοποιήσουμε μία διαφορετική σύνταξη. +# Αυτή τη φορά τα regex που θα ψάξουμε είναι τα εξής +# +# Για την πρώτη κλήση: +# 1. ^ ξεκινάει με +# 2. ^[GN] πρεπει να ξεκινάει με G ή N +# 3. ^[^GN] ΔΕΝ πρέπει να ξεκινάει με G ή N +# +# Για την δεύτερη κλήση: +# 1. Geo περιέχει την λέξη 'Geo' +# 2. .* οποιοσδήποτε αριθμός οποιουδήποτε χαρακτήρα +# 3. Per περιέχει την λέξη 'Per' +# +# Οπότε η τελική εντολή είναι (το | ειναι separator) + +grep "^[^GN]" ask1.txt | grep "Geo.*Per" + +# Αποτέλεσμα εκτέλεσης εντολής: +# +# Helen Georgioy helen3 12136 Peristeri 5748456 +# +# Ερώτηση 13: +# ----------- +# Πόσοι χρήστες που το username τους δεν αρχίζει από 'ls1' είναι +# συνδεδεμένοι στο σύστημα; +# +# Απάντηση: +# Η εντολή 'who' μπορεί να μας επιστρέψει μια λίστα με τους χρήστες +# που είναι συνδεδεμένοι. Ο λόγος που χρησιμοποίησα την 'who' αντί +# για την 'w' που κάνει περίπου το ίδιο πράγμα είναι επειδή η 'w' +# έχει και μια γραμμή header στην αρχή, οπότε 'wc -l' θα την μέτραγε. +# Με την χρήση της εντολής 'wc' μπορούμε να μετρήσουμε λέξεις, γραμμές +# και χαρακτήρες. Αν στην εντολή 'wc' δώσουμε την επιλογή -l τότε θα +# μετρήσει μόνο πόσες γραμμές έχει το input που της δώθηκε. + +who | grep -v "^ls1" | wc -l + +# Ερώτηση 14: +# ----------- +# Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή +# τη στιγμή στο σύστημα. +# +# Απάντηση: +# Η εντολή 'ps' (process status) εμφανίζει τις τρέχουσες διεργασίες που +# εκτελεί το σύστημα. Επιπλέον θα χρειαστούμε τις επιλογές a και u, οι οποίες +# εμφανίζουν τις διεργασίες που εκτελούνται από όλους τους συνδεδεμένους χρήστες +# αυτή τη στιγμη. Στην εντολή 'ps' χρησιμοποιήσα την BSD σύνταξη. + +ps -au + +# Αποτέλεσμα εκτέλεσης της εντολής: +# +# USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND +# christos 5200 0.1 0.1 18048 7084 2 Ss 21:44 0:09.04 /usr/local/bin/zsh +# christos 1160 0.0 0.1 15072 6016 v0 I 12:19 0:00.07 -zsh (zsh) +# christos 1175 0.0 0.0 11828 3044 v0 I+ 12:19 0:00.00 /bin/sh /usr/local/bin/startx +# christos 1188 0.0 0.0 13164 3240 v0 I+ 12:19 0:00.00 xinit /home/christos/.xinitrc +# christos 1192 0.0 0.1 22152 11360 v0 S 12:19 0:19.69 dwm +# christos 1218 0.0 0.1 17136 8000 0- S 12:20 0:16.20 slstatus +# christos 5005 0.0 0.1 18004 7000 1 Is 21:15 0:00.31 /usr/local/bin/zsh +# christos 5193 0.0 0.2 28028 16288 1 S+ 21:44 0:07.88 nvim ex1.txt +# christos 6849 0.0 0.0 11860 3080 2 R+ 00:22 0:00.00 ps -u +# root 1158 0.0 0.0 10880 2304 v1 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv1 +# root 1159 0.0 0.0 10880 2304 v2 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv2 +# root 1160 0.0 0.0 10880 2304 v3 Is+ 13:14 0:00.00 /usr/libexec/getty Pc ttyv3 +# +# Ερώτηση 15: +# ----------- +# Πόσες διεργασίες χρηστών (αλλ/σης) τρέχουν στο σύστημα και τελειώνει +# το όνομά τους με 'sh' ? +# +# Απάντηση: +# Τρέχοντας την εντολή της ερώτησης 14 (ps -ux) και φιλτράροντας +# το ouput ώστε να πάρουμε μόνο τις γραμμές που τελειώνουν σε +# 'sh', έχω 3 διεργασίες που το όνομα τους τελειώνει σε 'sh' + +ps -au | grep "sh$" | wc -l + +# Συνολικά έχουμε 3 διεργασίες που τελειώνουν σε sh. +# +# Ερώτηση 16: +# ----------- +# Εμφανίστε όλες τις διεργασίες χρηστών (αλλ/σης) που τρέχουν αυτή τη στιγμή στο σύστημα. +# +# Απάντηση: +# Αυτή τη φορά στην εντολή 'ps', πέρα από την επιλογή u, θα δώσουμε και την επιλογή +# x, η οποία εμφναίζει πληροφορίες ακόμα και για διεργασίες που δεν ελέγχουν κάποιο terminal + +ps -aux + +# Το output της εντολής είναι πολύ μεγάλο για να το συμπεριλάβω εδώ. +# +# Ερώτηση 17: +# ----------- +# Πόσα αρχεία του τρέχοντος καταλόγου σας (μόνο του τρέχοντος -όχι και +# των υποκαταλόγων του) έχουν permissions 'rw' από τους πάντες και 'x' +# από κανέναν; +# +# Απάντηση: +# Η 'ls -l' στην αρχή κάθε σειράς εμφανίζει το permission string και με την +# 'grep' μπορούμε να εμφανίσουμε μόνο τις γραμμές που περιέχουν το permission +# που ζητάει η εκφώνηση. Τέλος διοχετεύουμε την έξοδο στην 'wc -l'. + +ls -l | grep "^-rw-rw-rw-" | wc -l + +# Ερώτηση 18: +# ----------- +# Βρείτε τους καταλόγους του συστήματος που το όνομά τους αρχίζει από 'b'. +# +# Απάντηση: +# Η εντολή 'find' είναι μια πιο ανεπτυγμένη μορφή της 'ls' στην οποία μπορούμε +# να δώσουμε πολλές παραπάνω επιλογές. Οι επιλογές που έχουν δωθεί στην παρακάτω εντολή +# σημαίνουν τα εξής: +# /* - η αναζήτηση ξεκινάει από την ρίζα του συστήματος (root directory) +# -type d - αναζήτηση μόνο για directories +# -name "b*" - το όνομα τους πρέπει να ξεκινάει από 'b' + +find /* -type d -name "b*" + +# Ερώτηση 19: +# ----------- +# Να βρείτε και να παρουσιάσετε στην οθόνη με πλήρεις πληροφορίες +# όλα τα αρχεία με όνομα που αρχίζει από tty και βρίσκονται στον κατάλογο /dev. +# +# Απάντηση: +# Η εντολή stat επιστρέφει πλήρεις πληροφορίες για ένα αρχείο. +# Με την εντολή 'grep', όπως έχει ειπωθεί και σε παραπάνω ερωτήσεις, μπορούμε +# να πάρουμε τις γραμμές στις οποίες γίνεται match ένα regular +# expression - έτσι κατά την εμφάνιση των αρχείων του /dev μπορούμε +# να εξάγουμε μόνο όσες γραμμές περιέχουν την λέξη 'tty'. + +stat /dev/* | grep "tty" + +# Ερώτηση 20: +# ----------- +# Ταξινομήστε τα περιεχόμενα του αρχείου 'ask1.txt' ως προς το +# username σε φθίνουσα σειρά. +# +# Απάντηση: +# Θα ταξινομίσουμε το αρχείο με την χρήση της εντολής 'sort'. +# Στην εντολή αυτή μπορούμε να της δώσουμε κατα ποιά στήλη θέλουμε +# να ταξινομηθεί το αρχείο με την επιλογή -k. Εφόσον username +# βρίσκεται στην 3η στήλη, θα δώσουμε την 3η στήλη ως μέσο +# σύγκρισης για ταξινόμηση. Επίσης, προκειμένου να είναι κατα +# φθήνουσα σειρά η ταξινόμηση, θα χρησιμοποιήσουμε την επιλογή -r + +sort -rk 3 ask1.txt + +# Σε περίπτωση που θέλουμε οι αλλαγές να γραφτούν στο αρχείο, μπορούμε +# να γράψουμε την εντολή ως +# +# sort -rk 3 ask1.txt -o ask1.txt +# +# Ερώτηση 21: +# ----------- +# Ταξινομήστε τα '.c' αρχεία του καταλόγου στον οποίον δουλεύετε ως +# προς το μέγεθός τους. +# +# Απάντηση: +# Στην εντολή 'ls' η επιλογή -S ταξινομεί τα αρχεία ανάλογα με το +# μέγεθός του κατα φθήνουσα σειρά (μεγαλύτερο πρώτα), οπότε + +ls -S *.c + +# Ερώτηση 22: +# ----------- +# Ταξινομήστε τα αρχεία του λογαριασμού σας με permissions 644 +# ως προς το μέγεθός τους. +# +# Απάντηση: +# Μπορούμε να εμφανίσουμε αρχεία που έχουν συγκεκριμένα permissions +# με την εντολή 'find' και την επιλογή -perm [PERMISSION] όπου +# το PERMISSION πρέπει να δωθεί σε οκταδικό. Επίσης μέσα στην 'find' +# μπορούμε να εκτελέσουμε και επιπλέον shell commands στο output της με +# την επιλογή -exec [COMMAND] - θα χρησιμοποιήσουμε την 'ls -alS' ώστε +# να ταξινομήσει το output κατα μέγεθος. Η τελική εντολή θα εκτελεστεί +# στον κατάλογο '/usr/home/christos', ο οποίος είναι ο κατάλογος του λογαριασμού +# μου. Το {} \; στο τέλος της εντολής δηλώνει ότι η 'ls -alS' θα εκτελεστεί +# σε κάθε αρχείο που βρίσκεται από την 'find'. + +find /home/christos -perm 644 -exec ls -alS {} \; + +# Ερώτηση 23: +# ----------- +# Ταξινομήστε όλα τα περιεχόμενα του καταλόγου /dev κατά πρώτον ως προς +# τον owner και κατά δεύτερον ως προς το group και αποθηκεύστε το +# output στο αρχείο 'binfiles.txt'. +# +# Аπάντηση: +# Παίρνοντας πληροφορίες για τον owner και το group των αρχείων με την +# 'ls -l /dev' μπορούμε να ταξινομήσουμε τις κατάλληλες στήλες (3 για owner +# και 4 για group). + +ls -l /dev | sort -k 3,4 > binfiles.txt + +# Ερώτηση 24: +# ----------- +# Φτιάξτε ένα αρχείο που θα περιέχει πληροφορίες μόνο για τους συνδεδεμένους +# χρήστες που το username τους αρχίζει από 'ls1', ταξινομημένο ως προς +# την ημερομηνία και ώρα σύνδεσή τους. +# +# Απάντηση: +# ΑΦού φιλτραριστεί το ouput της 'who' ώστε να πάρουμε μόνο τους +# χρήστες που το όνομά τους ξεκινάει από ls1, θα ταξινομήσουμε +# κατά 3η και 4η στήλη επειδή αυτές δείχνουν την ημερομηνία +# και ώρα σύνδεσης. + +who | grep "^ls1" | sort -k 3,4 > userinfo.txt + +# Ερώτηση 25: +# ----------- +# Αλλάξτε στο αρχείο 'ask1.txt' το όνομα 'Nick' (όπου συναντάται) σε 'Nickolaos'. +# +# Απάντηση: +# Με την χρήση της εντολής 'sed' (stream editor) μπορούμε να αλλάξουμε ένα +# pattern κάθε φορά που συναντάται με την παρακάτω σύνταξη +# +# sed "s/PATTERN/NEWPATTERN/g" file +# +# Τo g στο τέλος σημαίνει ότι αυτή η αλλαγή πρέπει να γίνει σε όλο το αρχείο, +# και όχι μόνο την πρώτη φορά που θα συναντήσει το PATTERN. +# Οπότε, στην προκειμένη περίπτωση η εντολή που θα εκτελεστεί είναι + +sed "s/Nick/Nickolaos/g" ask1.txt + +# Εάν θέλουμε οι αλλαγές να αποθηκευτούν στο αρχείο κατευθείαν, μπορούμε +# να εκτελέσουμε την εντολή με την επιλογή -i. + +sed -i "s/Nick/Nickolaos/g" ask1.txt + +# Ερώτηση 26: +# ----------- +# Έστω τα ακόλουθα items του filesystem με protection strings: +# (α) '-rwxr-x--x', +# (β) 'drwxr-x---' και +# (γ) 'drwx--x--x. +# Εξηγείστε τι είδους items είναι και ποια τα δικαιώματα πρόσβασης user, +# group και others σε αυτά. +# +# Απάντηση: +# (α) Το είδος item είναι απλό αρχείο εφόσον το πρώτο πεδίο του protection string +# είναι κενό. Όσο αφορά τα δικαίωματα του, δικαίωμα εγγραφής έχει μόνο ο ιδιοκτήτης +# του αρχείο, διαβάσματος ο ιδιοκτήτης του αρχείου, και όσοι είναι στο ίδιο group με αυτόν. +# Επίσης όλοι οι χρήστες μπορούνε να το εκτελέσουν. +# +# (β) Το είδος είναι directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα εγγραφής +# έχει μόνο ο ιδιοκτήτης, διαβάσματος και εκτέλεσης ο ιδιοκτήτης και τα μέλη του group - +# οι υπόλοιποι χρήστες δεν έχουν δικαιώματα για το συγκεκριμένο directory. +# +# (γ) Το είδος είναι επίσης directory λόγω του 'd' στο πρώτο πεδίο του string. Δικαίωμα +# εγγραφής και διαβάσματος έχει μόνο ο ιδιοκτήτης και εκτέλεσης όλοι οι χρήστες. +# +# Ερώτηση 27: +# ----------- +# Αλλάξτε τα permissions όλων των αρχείων του καταλόγου 'testdir1' +# έτσι ώστε να έχουν δικαίωμα εκτέλεσης και εγγραφής μόνο ο ιδιοκτήτης, +# ενώ δικαίωμα ανάγνωσης να έχουν όλοι. +# +# Απάντηση: +# Η εντολή 'chmod' μπορεί να αλλάξει permissions. Με την επιλογή 'R' δηλώνουμε +# ότι αυτό θέλουμε να γίνει αναδρομικά εφόσον θέλουμε να αλλάξουμε τα permissions +# όλων των αρχείων του καταλόγου 'testdir1'. Τα υπόλοιπα πεδία σημαίνουν τα εξής: +# a=r - όλοι οι χρήστες έχουν δικαίωμα ανάγνωσης +# u+wx - προσθέτουμε στον ιδιοκτήτη του αρχείου και τα δικαιώματα εγγραφής και εκτέλεσης + +sudo chmod -R a=r,u+wx testdir1 + +# Ερώτηση 28: +# ----------- +# Αλλάξτε τα permissions του καταλόγου 'testdir1' έτσι ώστε να έχουν δικαίωμα +# πρόσβασης μόνο ο ιδιοκτήτης και οι χρήστες του ιδίου με αυτόν group, +# ενώ οι υπόλοιποι χρήστες να μην έχουν (θεωρείστε ότι τα τρέχοντα +# permissions του καταλόγου είναι 755). +# +# Απάντηση: +# Χρησιμοποιώντας πάλι την εντολή 'chmod' μπορούμε να αλλάξουμε και τα permissions +# ενός καταλόγου. Τα πεδία τώρα σημαίνουν τα εξής: +# ug+r - ο ιδιοκτήτης και τα μέλη του group έχουν δικαίωμα διαβάσματος +# o-r - οι υπόλοιποι χρήστες δεν έχουν δικαίωμα διαβάσματος + +sudo chmod ug+r,o-r testdir1 + +# Ερώτηση 29: +# ----------- +# Δημιουργήστε έναν νέο χρήστη στο σύστημά σας με username 'myfriend'. +# Αλλάξτε στη συνέχεια τον ιδιοκτήτη του αρχείου 'ask1.txt' σε 'myfriend' και +# μετακινήστε το στο working directory του. Περιορίστε τέλος το διαθέσιμο +# χώρο αποθήκευσης στο δίσκο για το συγκεκριμένο χρήστη στα 10MB. +# +# Απάντηση: +# Για να φτιάξουμε έναν user χρησιμοποιούμε την εντολή 'useradd'. Σε BSD +# συστήματα η εντολή είναι η 'adduser'. Για να αλλάξουμε ιδιοκτήτη αρχείου +# χρησιμοποιούμε την εντολή 'chown'. Τέλος, για να περιορίσουμε τον χώρο +# αποθηκεύσης στον δίσκο για έναν χρήστη χρησιμοποιούμε την εντολή 'edquota'. + +useradd -m -d /home/myfriend myfriend +chown myfriend ask1.txt +mv ask1.txt /home/myfriend +edquota myfriend + +# Η εντολή 'edquota' θα μάς ανοίξει στον default editor μας ένα αρχείο +# στο οποίο μπορούμε να τροποποιήσουμε τον αποθηκευτικό χώρο για τον χρήστη +# myfriend. Θα πρέπει να δούμε κάτι σαν +# +# Disk quotas for user ice19390133 (uid 1022): +# Filesystem blocks soft hard inodes soft hard +# /dev/vda1 36 10240 13312 11 0 0 +# +# Το 'soft' το θέτουμε σε 10240 (kilobyte), δηλαδή 10MB. +# +# Ερώτηση 30: +# ----------- +# Έστω τα παρακάτω: +# user1@localhost:~$ w +# USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT +# user1 pts/0 1.2.3.4 03:34 0.00s 0.38s 0.01s w +# user2 pts/1 5.6.7.8 03:45 0.00s 0.38s 0.01s ls +# user3 pts/2 9.7.5.3 03:57 0.00s 0.38s 0.01s ps +# +# user1@localhost:~$ ls -al /dev/pts/* +# crw--w---- 1 user1 tty136, 0 Oct 25 04:04 /dev/pts/0 +# crw--w--w- 1 user2 tty136, 1 Oct 25 04:04 /dev/pts/1 +# crw--w--w- 1 user3 tty136, 2 Oct 25 04:04 /dev/pts/2 +# +# Εξηγήστε τι είδους items του file system είναι τα παραπάνω, +# καθώς και τι θα κάνουν οι παρακάτω εντολές: +# user1@localhost:~$ cat > /dev/pts/1 +# user1@localhost:~$ wall "test" +# +# Απάντηση: +# Σε ένα permission string, το 'c' δηλώνει ότι αυτό το item +# ειναι 'character device', το οποίο πρακτικά σημαίνει συσκευές +# οι οποίες μεταφέρουν δεδομένα σε μορφή κειμένου (bytes). Τέτοιες +# συσκευές είναι για παράδειγμα τα ηχεία. Στην προκειμένη περίπτωση +# το item ειναι 'tty' (από το teletype), δηλαδή είναι terminals. Τα +# συγκεκριμένα terminals ειναι συνδεδεμένα με το πληκτρολόγιο. +# +# Η εντολή 'cat > /dev/pts/1' θα εμφανίζει στο πρώτο terminal που +# ανοίχτηκε οτίδηποτε γράψουμε στο stdin. Στον κατάλογο /dev/pts/ +# εμφανίζονται τα ανοιχτά terminals που τρέχουν αυτή τη στιγμή. + +cat > /dev/pts/1 + +# hello world +# hello world +# +# Η εντολή 'wall "test"' θα στείλει το μήνυμα "test" σε όλους τους +# συνδεδεμένους χρήστες. + +wall "test" + +# Broadcast message from christos@freebsd (pts/1) (Wed Nov 14 23:26:58 2020): +# +# test +# +# +# Ερώτηση 31: +# ----------- +# Δημιουργείστε τα αρχεία f1, f2, f3, f4, f5, f6 ,f7 με τα εξής δικαιώματα: +# f1, 757 +# f2, 313 +# f3, 010 +# f4, 642 +# f5, 551 +# f6, 133 +# f7, 111 +# Με χρήση της εντολής ls –l και διοχετεύοντας τα αποτελέσματά της στην εντολή +# egrep να βρείτε τα αρχεία όπου: +# a. To group έχει δικαιώματα r-x. +# b. Ο user και οι others έχουν ακριβώς τα ίδια δικαιώματα +# c. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write +# d. Ο user, το group και οι others έχουν τα ίδια δικαιώματα για write και execute +# e. To group και οι others έχουν τα ίδια δικαιώματα για read και execute +# +# Απάντηση: +# Αρχικά θα δημιουργήσουμε τα αρχεία με τα κατάλληλα permissions + +touch f1 && chmod 757 f1 +touch f2 && chmod 313 f2 +touch f3 && chmod 010 f3 +touch f4 && chmod 642 f4 +touch f5 && chmod 551 f5 +touch f6 && chmod 133 f6 +touch f7 && chmod 111 f7 + +# a) Το pattern που θα αναζητήσουμε είναι στο permission string να περιέχονται +# οποιοιδήποτε χαρακτήρες σε όλα τα πεδία αλλά πρέπει οπωσδήποτε τα permissions +# του group να είναι r-x. Το - στην αρχή το βάζουμε για να ψάξουμε μόνο αρχεία και όχι +# τυχόν directories. + +ls -l | egrep "^-...r-x..." + +# Αποτέλεσμα εκτέλεσης της εντολής: +# +# -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1 +# -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5 +# +# b) Θα φτιάξουμε ένα capture group στα πεδια που βρισκονται τα permissions +# του user ώστε να ψάξουμε ό,τι αποθηκεύτηκε στην μεταβλητή 1 +# στο πεδίο που βρίσκονται τα permissions των others. Ένα capture group φτιάχνουμε +# βάζοντας () και γράφοντας μέσα το pattern που θέλουμε. + +ls -l | egrep "^-(...)...\1" + +# Πιο αναλυτικά συμβαίνει το εξής: +# 1. Θέλουμε το pattern να ξεκινάει με - ώστε να είναι αρχείο. +# 2. Αποθηκεύουμε τους 3 επόμενους χαρακτήρες στη μεταβλητή 1. +# 3. Έχουμε φτάσει στο πεδίο του group, οπότε ψάχνουμε για οποιονδήποτε +# χαρακτήρα επειδή δεν μας νοιάζει σε αυτό το παράδειγμα τι permissions έχει το group. +# 4. Тώρα είμαστε στο πεδίο των others. Εμφανίζουμε τη μεταβλητή 1 η οποία έχει κρατήσει +# τα permissions του user. +# +# Αποτέλεσμα εκτέλεσης της εντολής: +# +# -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1 +# --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2 +# ------x--- 1 christos christos 0 Nov 14 22:16 f3 +# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 +# +# c) Με την ίδια λογική όπως στο ερώτημα b, απλώς αυτή τη φορά δεν θα κρατήσουμε όλα τα +# permissions του user, αλλά μόνο τα permissions για write. + +ls -l | egrep "^-.(.)..\1..\1." + +# Αποτέλεσμα εκτέλεσης της εντολής: +# +# ------x--- 1 christos christos 0 Nov 14 22:16 f3 +# -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5 +# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 +# +# d) Ξανά με την ίδια λογική, αλλά κρατήσουμε τα πεδία για write και execute. + +ls -l | egrep "^-.(..).\1.\1" + +# Αποτέλεσμα εκτέλεσης της εντολής: +# +# -r-xr-x--x 1 christos christos 0 Nov 14 22:16 f5 +# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 +# +# e) Αυτή τη φορά θα κρατήσουμε στις μεταβλητές τα permissions από το group, και όχι +# από τον user. + +ls -l | egrep "^-...(.).(.)\1.\2" + +# Αποτέλεσμα εκτέλεσης της εντολής: +# +# -rwxr-xrwx 1 christos christos 0 Nov 14 22:16 f1 +# --wx--x-wx 1 christos christos 0 Nov 14 22:16 f2 +# ---x-wx-wx 1 christos christos 0 Nov 14 22:16 f6 +# ---x--x--x 1 christos christos 0 Nov 14 22:16 f7 +# +# Ερώτηση 32: +# ----------- +# Υποθέστε πως οι γραμμές στο αρχείο /etc/passwd είναι όμοιες με την παρακάτω: +# +# spouneri:x:2107:1067:Pouneridis Sokratis:/home/student/e2021/spouneri:/bin/bash +# +# Στο πέμπτο πεδίο θα υπάρχει πάντα πρώτο το επίθετο και μετά το όνομα του χρήστη. +# Μόνο ένα επίθετο και μόνο ένα όνομα, γραμμένα με λατινικούς χαρακτήρες κεφαλαίους +# ή/και πεζούς. +# +# Τα υπόλοιπα πεδία θα είναι γραμμένα πάντα με πεζούς λατινικούς +# χαρακτήρες. +# +# Ελέγχοντας το αρχείο /etc/passwd και κάνοντας χρήση της εντολής egrep +# βρείτε όλους τους (υποθετικούς) χρήστες του συστήματος όπου: +# +# a. Χρησιμοποιούν για κέλυφος το bash +# b. To HOME DIRECTORY τους βρίσκεται στον κατάλογο /home +# c. To UID τους είναι ίδιο μετο GID τους +# d. Τουλάχιστον τα 5 πρώτα γράμματα του επιθέτου τους αποτελούν μέρος και του username τους +# e. Τουλάχιστον τα 3 πρώτα γράμματα του επιθέτου τους και τα 3 πρώτα γράμματα του +# ονόματός τους αποτελούν μέρος και του username τους. +# +# Απάντηση: +# +# a. Εφόσον το shell βρίσκεται πάντα στο τέλος της γραμμής, μπορούμε να κάνουμε + +egrep "/bin/bash$" /etc/passwd + +# b. Αφού φτάσουμε στο πεδίο όπου βρίσκεται το Home directory, θα φροντίσουμε +# να εμφανιστούνε μόνο οι γραμμές που ξεκινάνε με '/home'. + +egrep "^[a-z]+:.+:[0-9]+:[0-9]+:.+:/home/*" /etc/passwd + +# c. Θα χρησιμοποιήσουμε την ίδια τεχνική με τα capture groups που χρησιμοποίησα +# και στην άσκηση 31. + +egrep "^[a-z]+:.+:([0-9]+):\1" /etc/passwd diff --git a/sh-os1/ex2/createpvs b/sh-os1/ex2/createpvs @@ -0,0 +1,32 @@ +#!/bin/sh + +main() { + test $# -eq 4 || usage + + rootdir=$1 + ndbdirs=$2 + ndatadirs=$3 + username=$4 + + test -d "$rootdir" || err "$rootdir: no such directory" + isnumber $ndbdirs || err "'$ndbdirs' is not a number" + isnumber $ndatadirs || err "'$ndatadirs' is not a number" + test ! -z $(grep "$username" /etc/passwd) || err "'$username' is not in /etc/passwd" + + # pending... +} + +usage() { + echo "usage: ${0##*/} [ROOT_DIR] [N_DBDIRS] [N_DATADIRS] [USERNAME]" && + exit 1 +} + +err() { + echo "${0##*/}: $1" && exit 1 +} + +isnumber() { + test ! -z $(echo "$1" | grep "^[0-9]\+$") +} + +main "$@" diff --git a/sh-os1/ex2/searching b/sh-os1/ex2/searching @@ -1,7 +1,7 @@ #!/bin/sh main() { - test $# -eq 0 && usage + test $# -eq 2 || usage isnumber $1 isnumber $2 diff --git a/sh-os1/ex2/teldb b/sh-os1/ex2/teldb @@ -15,7 +15,7 @@ main() { } usage() { - echo "usage: ${0##*/} [-a|-l|-s [COL]|-c [KEYWORD]|-d [KEYWORD [-b|-r]]|-n]" + echo "usage: ${0##*/} [-a|-l|-s COL|-c KEYWORD|-d KEYWORD [-b|-r]|-n]" echo "" echo "options:" echo "-a add a new entry" @@ -26,10 +26,12 @@ usage() { echo " -b replace line with an empty line" echo " -r remove line completely" echo "-n count empty lines and ask if they should be deleted" + + exit 1 } errempty() { - test -z "$1" && echo "${0##*/}: expected non-empty string" && exit 1 + test -z "$1" && usage } skipempty() {