Λειτουργικά Συστήματα [C/Bash]

Lab Notes


Installing a VM

Δύο είναι οι πολύ καλές επιλογές για τα VM:

  • VM Ware
  • Virtual Box

Windows


MacOS


Choosing a Linux Distribution

Δεν υπάρχει σωστή ή λάθος επιλογή, απλά ψάχνετε και διαλέγεται ότι σας αρέσει. Εγώ θα αφήσω εδώ μία πολύ μικρή λίστα με μία σύντομη περιγραφή για το κάθε ένα αλλά από εκεί και πέρα ψάξτε μόνοι σας.

  • Ubuntu

    Το χρησιμοποιεί και ο Κοντζανικολάου και είναι από τα πιο γνωστά στον κόσμο. Είναι βασιμσένο στο Debian το οποίο το κάνει πολύ σταθερό και συμβατό με πάρα πολλά πράγματα.

    ubuntu.png

  • Linux Mint

    Επίσης από τα πιο γνωστά στον κόσμο και το κάνουν promote σε beginners που δοκιμάζουν Linux για πρώτη φορά. Αυτό γιατί το UI του θυμιζει πολύ τα Windows αλλά και επειδή είναι εύκολο στην χρήση. Τέλος και αυτό είναι βασισμένο στο Ubuntu.

    linux_mint.png

  • MX Linux

    To MX Linux είναι βασισμένο στο Debian και είναι γνωστό για το πόσο ελαφρύ είναι. Επίσης είναι πολύ καλό για beginners καθώς οι developers παρέχουν δικά τους εργαλεία για διάφορες καθημερινές ανάγκες.

    mx_linux.jpg

  • PopOS

    Επίσης βασισμένο στο Ubuntu είναι πολύ γνωστό και σταθερό. Μία από τις καλύτερες επιλογές, ειδικά με την καινούρια τους έκδοση.

    pop_os.jpeg

  • ZorinOS

    Έχει ωραία εμφάνιση και είναι λειτυργικό. Είναι βασισμένο στο Ubuntu οπότε και πάλι το εργαστήριο θα γίνεται με άνεση. Είναι επίσης γνωστό για όσους δοκιμάζουν για πρώτη φορά Linux.

    zorin_os.png

  • elementaryOS

    Γνωστό για την εμφάνιση του καθώς έρχεται preconfigured να μοιάζει ως macOS. Είναι βασισμένο στο Ubuntu οπότε πολύ εύκολα γίνεται η δουλειά του εργαστηρίου και από αυτό.

    elementary_os.jpeg

  • Manjaro

    Σε αντίθεση με τα προηγούμενα είναι βασισμένο στο Arch. Είναι αυτό που χρησιμοποιώ εγώ και γενικά έχει αρκετές διαφορές με όλα τα προηγούμενα.

    manjaro_xfce.png

  • Tumbleweed

    tumbleweed.jpg


Installing a Linux Distribution inVBOX

How to Install Ubuntu on VirtualBox: Detailed Overview

Σημείωση: Η διαδικασία είναι ίδια και για όλα τα άλλα distributions που έχω αναφέρει.


Bash and Terminal Commands


Commands

Σημείωση: Θα αναφέρω Commands τα οποία είναι κυρίως χρήσιμα για το μάθημα αλλά κιαι κάποια γενικής χρήσης. Παρόλα αυτά θα εστιάσω σε commands που αφορούν το εργαστήριο. Επίσης όπου έχω ` `` ` βάζετε εσείς ότι θέλετε.


ls

Δείχνει όλα τα αρχεία που περιλαμβάνει ο φάκελος που βρισκόμαστε (χωρίς τα hidden αρχεια).


ls -l

Το ίδιο με το απλό ls απλά τώρα έχουμε κάποιες extra πληροφορίες για το κάθε αρχείο.


touch `new_file`

Δημιουργεί ένα καινούριο αρχείο με το όνομα που του παρέχουμε (αν αυτο δεν υπάρχει).


cat `file`

Εκτυπώνει το περιεχόμενο ενός αρχείο. Αν για παράδειγμα έχουμε ένα αρχείο test.txt στο οποίο είχαμε γράψει Hello, World! τότε η εντολή cat test.txt θα εκτύπωνε Hello, World!.


mv `file` `destination`

Μετακινεί ένα αρχείο στον φάκελο της αρεσκείας μας. Είναι χρήσιμο αν θέλουμε να κάνουμε rename ένα αρχείο.

Αν για παράδειγμα έχουμε ένα αρχείο με όνομα test.txt μπορούμε να το μετονομάσουμε γράφοντας mv test.txt renamed.txt.


cp `file` `destination`

Κάνει copy ένα αρχείο στο destination που παρέχουμε.


rm `file`

Διαγράφει ένα αρχείο.


wc `file`

Εκτυπώνει τον αριθμό των χαρακτήρων, λέξεων και γραμμών που περιέχει ένα αρχείο.

wc -w `file`

Εκτυπώνει τον αριθμό των λέξεων μόνο .

wc -c `file`

Εκτυπώνει τον αριθμό των χαρακτήρων μόνο.


sort `file`

Ταξινομεί τα περιεχόμενα ενός αρχείο γραμμή γραμμή με αλφαβιτική σειρά (α -> ω).


sort -r `file`

Ταξινομεί τα περιεχόμενα ενός αρχείο γραμμή γραμμή προς την ατνίθετη κατεύθηνση (ω -> α).


mkdir `new_directory`

Δημιουργεί έναν νέο φάκελο.


rmdir `directory`

Διαγράφει έναν άδειο φάκελο.


rmdir -rf `directory`

Διαγράφει έναν φάκελο ακόμα και ας έχει περιεχόμενα.


cd `directory`

Μετακινούμαστε σε άλλον φάκελο.


cd ..

Μετακινούμαστε στον parent φάκελο. Δηλαδή αν έχουμε ένα φάκελο Documents/Work και βρισκόμαστε στον φάκελο Work αν κάνουμε cd .. θα πάμε στον φάκελο Documents.


chmod -options `file

Ένα πολύ βασικό command καθώς θα το χρειαστούμε και αργότερα για τα bash αρχεία μας. Μας επιτρέπει να αλλάξουμε τα read, write και execute permissions ενός αρχείου.

Κάθε αρχείο έχει ορισμένα δικαιώματα. Αν για παράδειγμα δημιουργήσουμε ένα νέο bash αρχείο touch test.sh και εκτελέσουμε την εντολή ls -l θα δούμε τέρμα αριστερά κάτι παρόμοιο σε αυτό -rw-rw-r--.

Στην ουσία είναι τα permissions του αρχείου, r = read, w = write και x = execute.

Βλέπουμε όμως ότι η άδεια να διαβάσουμε αυτό το αρχείο r επαναλαμβάνεται 3 φορές. Αυτό γίνεται γιατί υπάρχουν 3 διαφορετικοί users.

Συγκεκριμένα το λεγόμενο ugo, u = user, g = group και o = other.


Ο κάθε χρήστης μπορεί να έχει ίδια αλλά και διαφορετικά permissions. Σημασία έχει πως τα permissions που δίνουμε σε κάθε χρήστη ακολουθούν αυστηρά την σειρά ugo.

Δηλαδή μπορούμε να δούμε ότι το αρχείο test.sh έχει r και w permissions για τον user, r και w permissions για τον group και r permission για τον other.

Μπορούμε εύκολα να δώσουμε permissions στον κάθε χρήστη ξεχωριστά αλλά και μαζικά. Ας δώσουμε σε όλους τους χρήστες το δικαίωμα να κάνουν execute x το αρχείο.

chmod +x test.sh
ls -l

Βλέπουμε ότι τώρα τα permissions είναι τα εξής: -rwxrwxr-x. Το ίδιο μπορούμε να κάνουμε άμα θέλουμε να αφαιρέσουμε ομαδικά ένα permission.

chmod -x test.sh
ls -l

Τώρα τα permissions είναι όπως όταν δημιουργήσαμε το αρχείο.

Αν δεν θέλουμε να κάνουμε μαζική αλλαγή τότε απλώς βάζουμε τον χρήστη που θέλουμε να επιρεάσουμε.

chmod u=rwx test.sh
ls -l

Τώρα έχουμε αυτά τα permissions: -rwxrw-r--.

Σημείωση: Σε αυτές τις περιπτώσεις πρέπει να αναφέρουμε όλα τα permissions αλλιώς δεν θα γίνει αυτό που περιμένουμε. Δηλαδή αν γράφαμε chmod u=x test.sh τότε θα βγάζαμε όλα τα permissions που είχε και απλά θα βάζαμε το execute permission x.

Τέλος μπορούμε να αλλάξουμε τα permissions με αριθμούς. Κάθε permission έχει μία αριθμιτηκή τιμή: r = 4, w = 2 και x = 1.

Οπότε αν έχουμε -rwx---r-- τότε με αριθμούς θα το γράφαμε:

u = r + w + x = 4 + 2 + 1 = 7

g = 0

o = r = 4

Άρα αν θέλαμε να δώσουμε τα δικαιώματα -rwxrw-r-- στο αρχείο μας θα γράφαμε:

chmod 764 test.sh
ls -l

Πλέον το αρχελιο μας έχει τα εξής δικαιώματα: -rwxrw-r--.


grep `string` `file`

Ψάχνει να βρει μέσα σε ένα αρχείο το string που του παρέχουμε. Εκτυπώνει ολήκληρες τις προτάσεις που βρήκε το string.


grep -o `string` `file`

Ψάχνει να βρει μέσα σε ένα αρχείο το string που του παρέχουμε. Εκτυπώνει μόνο το string αν το βρει.


grep -i `string` `file`

Ψάχνει να βρει μέσα σε ένα αρχείο το string που του παρέχουμε αλλά χωρίς να είναι case sensitive.


grep -o `string` `file` > `file`

Μπορούμε να αποθηκεύσουμε το αποτέλεσμα από οποιοδήποτε command σε κάποιο αρχείο χρησιμοποιόντας το >.

Άρα για παράδειγμα αν έχουμε ένα αρχείο test.txt και μέσα έχουμε Hello, World! και τρέξουμε το command grep -o 'Hello' test.txt > result.txt το πρώτο command θα βρει ότι έχουμε γράψει Hello μέσα στο αρχείο και στην συνέχεια αντί να το εκτυπώσει, το μεταφέρει και το γράφει στο αρχείο result.txt.

Σημείωση: Αν το αρχείο result.txt δεν υπάρχει τότε το δημιουργεί αυτόματα.


cat `file` >> `another_file` 

Ο χαρακτήρας >> μας δίνει την δυνατότητα να κάνουμε append σε ένα αρχείο. Στο από πάνω παράδειγμα κάνω cat file δηλαδή εκτύπωση στο terminal τα περιεχόμενα του αρχείου αλλά αντί να τα εκτυπώσω απλά τα προσθέτω στο τέλος ενός άλλου αρχείου another_file.


Ένα από τα πιο σημαντικά commands είναι το |. Το πως λειτουργεί είναι πολύ απλό, στην ουσία παίρνει το αποτέλεσμα από ένα command και το παρέχει ως είσοδο σε ένα άλλο command.

ls -l | sort -r

Εδώ το αποτέλεσμα από το command ls -l θα περάσει στο επόμενο command το sort. Στην ουσία θα εκτυπώσει τα αρχεία και τις πληροφορίες τους ταξινομημένα.

Άλλο παράδειγμα:

grep -io "hello" test.txt | wc -w 

Εδώ βρίσκουμε όλες τις λέξεις hello που υπάρχουν στο αρχείο test.txt (είτε είναι γραμμένες με κεφαλαία είτε όχι) και απλά μετράμε πόσες βρήκαμε με το command wc -w.


Λύσεις Εργαστηρίου - 2020

Είμαστε στο Home directory και χωρίς να μετακινηθούμε από αυτόν πρέπει να δημιουργήσουμε δύο φακέλους (test, other) καθώς και τα αρχεία (012, 021, 120, 102, 201, 210).

Λύση

mkdir test other && touch test/{012,021,120,102,201,210}.txt


➤ Screenshots Here
1. Το Home πριν να τρέξουμε το command. home directory before running the command above

2. Το Home directory μας αφότου τρέξουμε το command. home directory after running the command above

3. Ο φάκελος test που περιέχει όλα τα αρχεία txt που θέλουμε. the newly created folder and what it contains


Χωρίς να μετακινηθούμε από το Home directory και με μία μόνο εντολή να αντιγράψουμε τα αρχεία (xyz, xzy, yxz) στον φάκελο (other). Επίσης πρέπει να παρέχετε μόνο δύο ορίσματα και δεν επιτρέπεται η χρήση των χαρακτήρων { και }. Για να βρείτε τους χαρακτήρες (x, y, z) πρέπει να κάνετε τις εξής πράξεις (x = E mod 3), (y = (E+1) mod 3) και (z = (E+2) mod 3), όπου Ε το τελευταίο ψηφίο του ΑΜ σας.


Λύση

Έστω ότι Ε = 5
x = 5 mod 3. Άρα x = 2.

y = 6 mod 3. Άρα y = 0.

z = 7 mod 3. Άρα z = 1.
Άρα πρέπει να αντιγράψουμε μόνο τα αρχεία: 201, 210 και 021

cp test/[02]?[01].txt other/


Επεξήγηση

Πρέπει να αντιγράψουμε τα αρχεία 201, 210 και 021. Παρατηρούμε ότι όλα τα αρχεία ξεκινάνε είτε με το ψηφίο 2 είτε με το ψηφίο 0. Γι αυτό λέμε [02] δηλαδή περιλαμβάνουμε ότι αρχίζει είτε με 2 είτε με 0. Μετά έχουμε βάλει τον χαρακτήρα ? το οποίο σημαίνει ότι εκεί μπορεί να υπάρχει οποιοσδήποτε χαρακτήρας. Όντως αμα παρατηρήσουμε τα αρχεία που πρέπει να αντιγράψουμε, σαν δεύτερο ψηφίο υπάρχουν όλοι οι πιθανοί αριθμοί (0, 1, 2) άρα δεν μας νοιάζει να έχουμε κάποιο συγκεκριμένο ψηφίο σε αυτή την θέση. Τέλος βάλαμε [01] και αυτό γιατί πολύ απλά το τελικό ψηφίο και στα τρία αρχεία είτε είναι 0 είτε είναι 1.

➤ Screenshots Here
1. Το other directory πριν να τρέξουμε το command. other directory before executing the above command 2. Το command που πρέπει να τρέξουμε. executing the above command 3.Ο φάκελος other που περιέχει όλα τα αρχεία txt που έπρεπε να αντιγράψουμε. other directory after executing the above command


Υπολογίστε τα xyz κάνοντας τις εξής πράξεις (x = Γ mod 8), (y = Δ mod 8) και (z = Ε mod 8), όπου Γ Δ Ε τα τρία τελευταία ψηφία του ΑΜ σας. Στην συνέχεια χωρίς να μετακινηθήτε από το Home directory εκτελέστε την εντολή chmod xyz ~/test/012.txt (χωρίς όμως να χρησιμοποιήσετε αριθμητικές τιμές).


Λύση

Έστω ότι

Γ = 1.

Δ = 9.

Ε = 5.


Τότε θα έχουμε:

x = 1 mod 8. Άρα x = 1

y = 9 mod 8. Άρα y = 1

z = 5 mod 8. Άρα z = 5


Άρα πρέπει να αλλάξουμε τα δικαιώματα του αρχείου 012 σε 115.

chmod u=x,g=x,o=rx test/012.txt


Επεξήγηση

Εφόσον δεν πρέπει να χρησιμοποιήσουμε τις αριθμητικές τιμές για να αλλάξουμε τα δικαιώματα του αρχείου 012 πρέπει να χρησιμοποιήσουμε τους χαρακτήρες r w x. Γνωρίζουμε ότι r = 4, w = 2 και x = 1. Οπότε το μόνο που μένει είναι να βρούμε τον σωστό συνδυασμό χαρακτήρων ώστε να φτιάξουμε τα δικαιώματα του αρχείου. Εφόσον πρέπει να έχουμε 115 σημαίνει ότι έχουμε u=1,g=1,o=5 άρα με χαρακτήρες έχουμε: u=x,g=x,o=rx. Το u και το g νομίζω είναι πολύ απλά να τα καταλάβουμε, το o όμως είναι συνδυασμός του r και του x αυτό γιατί r = 4 και x = 1 οπότε για να φτιάξουμε το 5 χρησιμοποιούμε και τα δύο.


➤ Screenshots Here
1. Τα δικαιώματα του αρχείου 012.txt πριν να τρέξουμε το command. permissions of 012.txt before executing the above command 2. Το command που πρέπει να τρέξουμε. executing the above command 3. Τα δικαιώματα του αρχείου 012.txt μετά την εκτέλεση του command (και εμφάνιση του με αριθμούς αν σας μπερδεύουν οι χαρακτήρες). permissions of 012.txt after executing the above command
permissions of 012.txt after executing the above command in numbers