Οδηγός Μελέτης - Εισαγωγή στον Προγραμματισμό

Α1.12 · Παιχνίδια με Κονσόλα (cmdline)

Εργασία 0 (2025-26), Άσκηση 2 · Δυσκολία ★★☆ · tooling · Κεφάλαια: 1, 4

Έχεις χρησιμοποιήσει την γραμμή εντολών; Linux; Γνωρίζεις πως να κάνεις SSH σε απομακρυσμένους servers και να λύνεις προβλήματα με εντολές κονσόλας; Αν όχι, καιρός να μάθουμε! Αν ναι, τότε αυτή η άσκηση θα σου είναι παιχνιδάκι.

Σε αυτήν την άσκηση θα μπούμε με ssh σε έναν απομακρυσμένο server που βρίσκεται στην IP διεύθυνση 35.169.96.19 μέσω τερματικού και θα ανακτήσουμε συγκεκριμένες πληροφορίες. Υπάρχουν διαφορετικοί χρήστες (byte0, byte1, …) που αντιστοιχούν σε διαφορετικά προβλήματα/υποερωτήματα. Για όλους τους χρήστες ο κωδικός για να μπείτε είναι bits&bytes. Σε κάθε ένα υποερώτημα θα αναζητούμε ένα string που μπορεί να είναι μια μόνο λέξη ή πολλές λέξεις διαχωρισμένες με τον χαρακτήρα underscore _, για παράδειγμα: something_like_that.

byte0: Αλλάζοντας Φάκελο (cd)

Ο χρήστης byte0 είναι ελαφρώς μανιακός με την οργανωτικότητα. Του αρέσει να οργανώνει όλα του τα αρχεία σε φακέλους, υποφακέλους κ.ο.κ.. Με αυτά και με αυτά όμως, δεν μπορεί να βρει το αρχείο του, μπορείτε να τον βοηθήσετε; Για να μπείτε στον server τρέξτε:

ssh byte0@35.169.96.19

και βάλτε τον κωδικό που γράψαμε παραπάνω. Η εντολή cd μπορεί να σας φανεί χρήσιμη όπως και η εντολή cat (ίσως και το tab / autocomplete :)). Όταν διαβάσετε τα περιεχόμενα του αρχείου, σημειώστε το string που βρήκατε μέσα στο αρχείο ώστε να το προσθέσετε στο solution.txt (δες παρακάτω στις τεχνικές προδιαγραφές).

byte1: Μια Εντολή Άγνωστη

Ο χρήστης byte1 έφτιαξε ένα καινούριο πρόγραμμα με άγνωστη σε μας λειτουργία ονόματι supercalifragilisticexpialidocious. Πως μπορείτε να βρείτε τι κάνει;

byte2: Τα Άπαντα του Shakespeare (grep)

Ο χρήστης byte2 έχει δύο βασικά χαρακτηριστικά: (1) είναι μεγάλος θαυμαστής του Shakespeare και (2) είναι κάπως μυστικοπαθής. Αποφάσισε να συνδυάσει τα δύο και καταχώνιασε ένα μυστικό string μέσα στην συλλογή του με τα άπαντα του Shakespeare. Μπορείτε να τον βοηθήσετε να το βρεί;

Το μόνο που γνωρίζουμε είναι πως το κρυφό κείμενο περιέχει το string “will find”. Η εντολή grep μπορεί να σας φανεί χρήσιμη.

byte3: Τα Άπαντα του Shakespeare Άλλαξαν (diff)

Ο χρήστης byte3 αποφάσισε να αλλάξει κάτι στα άπαντα του Shakespeare ελπίζοντας πως η αλλαγή θα περάσει απαρατήρητη. Ελέγξαμε τον αριθμό των λέξεων και χαρακτήρων του κάθε αρχείου:

byte3@ip-172-31-37-131:~$ wc -w *.txt
  901325 shakespeare.modified.txt
  901325 shakespeare.txt
 1802650 total
byte3@ip-172-31-37-131:~$ wc -c *.txt
 5458203 shakespeare.modified.txt
 5458199 shakespeare.txt

και παρατηρήσαμε πως ενώ ο αριθμός λέξεων παρέμεινε ίδιος (901.325), ο αριθμός των χαρακτήρων άλλαξε. Επομένως, υποψιαζόμαστε πως άλλαξε μια λέξη του αυθεντικού με μια καινούρια. Βρείτε την καινούρια λέξη—η εντολή diff ίσως σας φανεί χρήσιμη.

byte4: Λαβύρινθος (find)

Ο χρήστης byte4 είναι συγγενής του byte2 παραπάνω και ελαφρώς πιο μυστικοπαθής. Προκειμένου να “ανεβάσει” το παιχνίδι του αποφάσισε να κρύψει τα δεδομένα του σε ένα δαιδαλώδες κατασκεύασμα από φακέλους. Μπορείτε και πάλι να τον βοηθήσετε να βρει το μυστικό που έχει κρύψει μέσα σε ένα από όλα τα αρχεία των υποφακέλων; Το μόνο που γνωρίζουμε είναι πως έχει κρύψει το μυστικό του σε ένα αρχείο που λέγεται cup.txt. Η εντολή find μπορεί να σας φανεί χρήσιμη.

byte5: Compile and Run (gcc, mkdir, cp)

Ο byte5 έγραψε ένα προγραμματάκι σε C ονόματι byte5.c. Μεταγλωττίστε το και τρέξτε το προκειμένου να πάρετε τον κωδικό σας! Προσοχή: ο default φάκελος του byte5 δεν σας επιτρέπει να χρησιμοποιήσετε αρχεία, ίσως χρειαστεί να φτιάξετε έναν καινούριο υποφάκελο μέσα στον φάκελο /tmp προκειμένου να τοποθετήσετε το εκτελέσιμό σας. Οι εντολές mkdir, cp, gcc μπορεί να σας φανούν χρήσιμες.

byte6: Αποσυμπίεση αρχείου 1 (unzip)

Κάποιες φορές προκειμένου να μικρύνουμε τον χώρο που πιάνει ένα αρχείο το συμπιέζουμε. Ο χρήστης byte6 έχει ένα αρχείο byte6.zip το οποίο χρειάζεται αποσυμπίεση. Ανοίξτε το για να αποκτήσετε πρόσβαση στα περιεχόμενά του. Το πρόγραμμα unzip μπορεί να σας βοηθήσει.

byte7: Αποσυμπίεση αρχείου 2 (tar)

Υπάρχουν διάφοροι τρόποι και εργαλεία για να συμπιέσεις αρχεία και τα περιεχόμενα τους. Ο χρήστης byte7 χρησιμοποίησε ένα πρόγραμμα που λέγεται tar - μπορείτε να χρησιμοποιήσετε το ίδιο προκειμένου να βρείτε τα περιεχόμενα του byte7.tar.gz;

byte8: Carriage Return (xxd, pico, vim)

Ο χρήστης byte8 μας είπε πως ο κωδικός που ψάχνουμε είναι μέσα στο αρχείο carriage_return.txt. Όμως δοκιμάσαμε να το τυπώσουμε:

byte8@ip-172-31-37-131:~$ ls
carriage_return.txt
byte8@ip-172-31-37-131:~$ cat carriage_return.txt
There is absolutely nothing to see here. Move along.

και δεν είδαμε κάτι. Μπορείς να μας βοηθήσεις; Πιστεύουμε πως οι εντολές xxd, pico ή vim μπορεί να φανούν χρήσιμες.

byte9: Ένα Περίεργο Όνομα (cat)

Ο χρήστης byte9 ανέφερε πως ο κωδικός του είναι μέσα στον φάκελο /home/byte9 - μπορείς να μας βοηθήσεις να τον ανακτήσουμε; Ίσως σε βοηθήσει να θυμηθείς τι είναι το filepath (μονοπάτι) ενός αρχείου.

byte10: Το 42ο Όνομα (sort, head)

Ο χρήστης byte10 έχει ένα αρχείο γεμάτο με ονόματα και θέλει να τα ταξινομήσει αλφαβητικά και να βρει το 42ο όνομα στην σειρά. Γνωρίζει ότι το 1ο όνομα είναι το Aarika - μπορείτε να τον βοηθήσετε να βρει το 42ο; Οι εντολές sort και head μπορούν να συνδυαστούν και να βοηθήσουν.

byte11: Επιλογές Ονόματος (sort, uniq)

Ο χρήστης byte11 μόλις απέκτησε ένα παιδάκι και προκειμένου να μην το κοροϊδεύουν στο σχολείο αποφάσισε να του δώσει το πιο συχνό όνομα εκείνης της χρονιάς. Στο αρχείο births.txt περιέχονται τα ονόματα όλων των φετινών γεννήσεων. Μπορείτε να τον βοηθήσετε να βρει το πιο συχνό όνομα; Οι εντολές sort και uniq ίσως σας φανούν χρήσιμες.

byte12: Βρες το Μονοπάτι (which, PATH)

Ο byte12 είναι κάπως αφηρημένος. Μόλις έφτιαξε το πρόγραμμα tuxsay αλλά δεν θυμάται που το τοποθέτησε και δεν πρόλαβε να φτιάξει ένα manual page. Παρόλα αυτά, μπορεί να το τρέξει κανονικά. Μπορείτε να βρείτε το basename του φακέλου μέσα στον οποίο βρίσκεται το πρόγραμμα tuxsay;

byte13: Commit Messages (git log)

Ο byte13 μόλις πήρε πρόσβαση σε ένα git repository (αποθετήριο) και θέλει να δει τα commit messages (μηνύματα για προηγούμενες αλλαγές) που έκαναν οι χρήστες που συνεισέφεραν στο repository. Μπορείτε να διαβάσετε αυτά τα μηνύματα;

byte14: Ιστορικό (git log -p)

Ο byte14 ξεκίνησε να γράφει μια νουβέλα με την βοήθεια του ΑΙ. Μετά από αρκετές αλλαγές διαπίστωσε ότι το ΑΙ είχε προσθέσει (κατά λάθος;) έναν από τους κωδικούς του μέσα στο κείμενο. Ευτυχώς το είδε, το αφαίρεσε, έκανε commit τις αλλαγές και πλέον ξέρει δεν είναι ορατό σε άλλους χρήστες. Έχει δίκιο ο byte14;

byte15: Open the Vault (bonus / προαιρετικό)

Ο byte15 είναι χρήστης του vault, ενός υπερασφαλούς προγράμματος που εμφανίζει τα περιεχόμενα του λογαριασμού σου, μόνο εφόσον γνωρίζεις το μυστικό PIN. Δυστυχώς, ο byte15 ξέχασε το PIN του! Μπορείτε να τον βοηθήσετε να ανακτήσει τα περιεχόμενα του λογαριασμού του;

Τεχνικές Προδιαγραφές

Η υποβολή σου πρέπει να έχει τα ακόλουθα χαρακτηριστικά:

Το περιεχόμενο του solution.txt πρέπει να έχει την ακόλουθη μορφή:

$ cat solution.txt
byte0: ...
byte1: ...
byte2: ...
...

Όπου οι τελείες (…) περιγράφουν το μέρος της λύσης που έχει παραληφθεί. Στο αρχείο README.md πρέπει να γράψετε μια σύντομη περιγραφή για τον τρόπο που λύσατε το κάθε πρόβλημα.

Αν σου άρεσε αυτή η άσκηση ή έχεις κολλήσει με ένα από τα παραπάνω και δεν ξέρεις πως να συνεχίσεις, υπάρχουν και άλλα site online στα οποία μπορείς να εξασκηθείς όπως για παράδειγμα το overthewire τα οποία μπορούν να σου δώσουν ιδέες. Σημείωση: μέχρι το επίπεδο 11 τα προβλήματα σε αυτό το site είναι εντός θέματος για το μάθημα, από εκεί και πέρα γίνονται πιο δύσκολα / απαιτούν γνώσεις που θα αποκτήσουμε σε μεγαλύτερα έτη.

Εμφανίσεις

Υπόδειξη

Κάθε επίπεδο δοκιμάζει μία ή δύο εντολές, και το man <εντολή> (ή το --help) είναι ο πρώτος σου σύμμαχος, ακόμα και για άγνωστα προγράμματα. Για τα επίπεδα με πολλά δεδομένα συνδύασε εντολές με σωληνώσεις (|), π.χ. ταξινόμηση πριν από μέτρηση διπλοτύπων. Τα ονόματα αρχείων που αρχίζουν με παύλα ή έχουν κενά, τα κρυφά αρχεία (τελεία στην αρχή), οι χαρακτήρες ελέγχου μέσα σε ένα αρχείο και το ιστορικό ενός git repository είναι οι συνηθισμένες «παγίδες» που αξίζει να έχεις στο μυαλό σου.

Αριθμός στον οδηγό: Α1.12 (στο κεφάλαιο) · Μόνιμο αναγνωριστικό: hw-2025-hw0-cmdline · Σύνδεσμος: https://progintro.github.io/study/questions/homework/hw-2025-hw0-cmdline.html · Markdown (GitHub)