commit 71fe6d09c17d127d2943c4ae67bc31b34999c59f parent 1617a6590926c443b5933f200104bb6c43543040 Author: Christos Margiolis <christos@margiolis.net> Date: Sun, 22 Nov 2020 20:06:27 +0200 new courses Diffstat:
27 files changed, 963 insertions(+), 2 deletions(-)
diff --git a/README b/README @@ -0,0 +1,4 @@ +uni-assignments +=============== + +My university programming assignments. diff --git a/README.md b/README.md @@ -1,2 +0,0 @@ -# uni-assignments -My university programming assignments. diff --git a/c-parallel-computing/ex1/Makefile b/c-parallel-computing/ex1/Makefile 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 @@ -0,0 +1,26 @@ +\documentclass{article} +\usepackage[utf8]{inputenc} +\usepackage[greek,english]{babel} +\usepackage{alphabeta} +\usepackage{fancyhdr} +\usepackage{listings} +\usepackage{mathtools} +\usepackage{xcolor} +\usepackage{biblatex} + +\title{Εργαστήριο Παράλληλου Υπολογισμού - Εργασία 1} +\author{Χρήστος Μαργιώλης} +\date{Νοέμβριος 2020} + +\begin{document} + +\begin{titlepage} + \maketitle +\end{titlepage} + +%\renewcommand{\contentsname}{Περιεχόμενα} +%\tableofcontents + +Hello world + +\end{document} diff --git a/c-parallel-computing/ex1/ex1.c b/c-parallel-computing/ex1/ex1.c @@ -0,0 +1,175 @@ +#include <stdio.h> +#include <stdlib.h> +#include <mpi.h> + +#define TAG_T 1 +#define TAG_N 2 +#define TAG_BUFSIZE 3 +#define TAG_MENU 4 +#define TAG_SORTED 5 +#define TAG_VAL 6 +#define TAG_POS 7 +#define TAG_PREV 8 + +int +main(int argc, char *argv[]) +{ + MPI_Status status; + int nproc, rank, rc; + int *t, n, prev; + int bufsize, offset, remaining; + int val, sorted; /* results from each process */ + int f_val, f_sorted; /* final results */ + int found = 0; /* indicates that the first unsorted element has been found */ + int i, ch = 1; + + /* just in case an error occurs during initialization */ + if ((rc = MPI_Init(&argc, &argv)) != 0) { + fprintf(stderr, "%s: cannot intialize MPI.\n", argv[0]); + MPI_Abort(MPI_COMM_WORLD, rc); + } + + /* count how many processes we have running */ + MPI_Comm_rank(MPI_COMM_WORLD, &rank); + MPI_Comm_size(MPI_COMM_WORLD, &nproc); + + /* main loop */ + while (ch != 2) { + if (rank == 0) { + printf("Enter N: "); + scanf("%d", &n); + getchar(); + + t = malloc(n * sizeof(int)); + + /* read whole array */ + for (i = 0; i < n; i++) { + printf("t[%d]: ", i); + scanf("%d", &t[i]); + } + getchar(); + + /* reset flag */ + sorted = 1; + /* see if there are any remaining elements */ + remaining = n % nproc; + + /* calculate offsets and pass sub-array to each processor */ + for (i = 1; i < nproc; i++) { + /* calculate bufsize as if there are remaining == 0 */ + bufsize = n / nproc; + /* + * calculate which part of the array each process will get. + * the last parts makes sure that if there are any + * remaining elements, the offset will adapt properly + */ + offset = i * bufsize + (i - 1 < remaining ? i : remaining); + /* if there are any remaining elements, increment bufsize */ + if (i < remaining) + bufsize++; + + /* each process gets the last element of the previous one */ + prev = t[offset - 1]; + + /* send sub-array along with its size and sorted flag */ + MPI_Send(&bufsize, 1, MPI_INT, i, TAG_BUFSIZE, MPI_COMM_WORLD); + MPI_Send(t + offset, bufsize, MPI_INT, i, TAG_T, MPI_COMM_WORLD); + MPI_Send(&prev, 1, MPI_INT, i, TAG_PREV, MPI_COMM_WORLD); + MPI_Send(&sorted, 1, MPI_INT, i, TAG_SORTED, MPI_COMM_WORLD); + } + + /* + * calculate bufsize for proc 0 in and increment + * in case there are still remaining elements + */ + bufsize = n / nproc; + if (remaining != 0) + bufsize++; + } else { + /* + * receive sub-arrays and sorted flag and allocate memory for each + * process' array + */ + MPI_Recv(&bufsize, 1, MPI_INT, 0, TAG_BUFSIZE, MPI_COMM_WORLD, &status); + t = malloc(bufsize * sizeof(int)); + MPI_Recv(t, bufsize, MPI_INT, 0, TAG_T, MPI_COMM_WORLD, &status); + MPI_Recv(&prev, 1, MPI_INT, 0, TAG_PREV, MPI_COMM_WORLD, &status); + MPI_Recv(&sorted, 1, MPI_INT, 0, TAG_SORTED, MPI_COMM_WORLD, &status); + } + + /* check if array is unsorted */ + for (i = 0; i < bufsize - 1; i++) { + if (t[i] > t[i + 1]) { + val = t[i]; + sorted = 0; + break; + /* + * we check if the last element of the previous process + * is greater than t[i] so that each process doesn't compare + * only against its own elements. we make sure that the rank + * is not 0, since it doesn't have a previous rank. + */ + } else if (t[i] < prev && rank != 0) { + val = prev; + sorted = 0; + break; + } + } + + /* we're done with t, free everything */ + free(t); + + if (rank == 0) { + /* collect results from proc 0 first */ + f_sorted = sorted; + f_val = val; + + /* receive results from the rest */ + for (i = 1; i < nproc; i++) { + MPI_Recv(&val, 1, MPI_INT, i, TAG_VAL, MPI_COMM_WORLD, &status); + MPI_Recv(&sorted, 1, MPI_INT, i, TAG_SORTED, MPI_COMM_WORLD, &status); + /* + * AND all flags to determine whether the array is sorted. + * if one of the flags is 0, res will be 0 even if the + * rest of the flags are 1 + */ + f_sorted &= sorted; + /* + * get only the first unsorted element, we don't care about + * the rest, if any + */ + if (!sorted && !found) { + f_val = val; + found = 1; + } + } + + if (f_sorted) + puts("Array is sorted."); + else + printf("Array is not sorted (val: %d)\n", f_val); + + puts("Press [ENTER] to continue. . ."); + getchar(); + } else { + /* send results to processor 0 */ + MPI_Send(&val, 1, MPI_INT, 0, TAG_VAL, MPI_COMM_WORLD); + MPI_Send(&sorted, 1, MPI_INT, 0, TAG_SORTED, MPI_COMM_WORLD); + } + + /* menu */ + if (rank == 0) { + system("clear || cls"); + printf("1. Continue\n2. Exit\nYour choice: "); + scanf("%d", &ch); + /* everyone has to know what the choice is */ + for (i = 1; i < nproc; i++) + MPI_Send(&ch, 1, MPI_INT, i, TAG_MENU, MPI_COMM_WORLD); + } else + MPI_Recv(&ch, 1, MPI_INT, 0, TAG_MENU, MPI_COMM_WORLD, &status); + } + + MPI_Finalize(); + + return 0; +} diff --git a/c-programming/1-basic-elements/docs/assignment-1.odt b/c-programming/1-basic-elements/docs/assignment-1.odt Binary files differ. diff --git a/c-programming/1-basic-elements/docs/assignment-1.pdf b/c-programming/1-basic-elements/docs/assignment-1.pdf Binary files differ. diff --git a/c-programming/2-conditional-statements/docs/assignment-2.odt b/c-programming/2-conditional-statements/docs/assignment-2.odt Binary files differ. diff --git a/c-programming/2-conditional-statements/docs/assignment-2.pdf b/c-programming/2-conditional-statements/docs/assignment-2.pdf Binary files differ. diff --git a/c-programming/3-loops/docs/assignment-3.odt b/c-programming/3-loops/docs/assignment-3.odt Binary files differ. diff --git a/c-programming/3-loops/docs/assignment-3.pdf b/c-programming/3-loops/docs/assignment-3.pdf Binary files differ. diff --git a/c-programming/4-functions/docs/assignment-4.odt b/c-programming/4-functions/docs/assignment-4.odt Binary files differ. diff --git a/c-programming/4-functions/docs/assignment-4.pdf b/c-programming/4-functions/docs/assignment-4.pdf Binary files differ. diff --git a/c-programming/4-functions/docs/photos-diagrams/hanoi-end.png b/c-programming/4-functions/docs/photos-diagrams/hanoi-end.png Binary files differ. diff --git a/c-programming/4-functions/docs/photos-diagrams/hanoi-start.png b/c-programming/4-functions/docs/photos-diagrams/hanoi-start.png Binary files differ. diff --git a/c-programming/4-functions/docs/photos-diagrams/menu-diagram.drawio b/c-programming/4-functions/docs/photos-diagrams/menu-diagram.drawio @@ -0,0 +1 @@ +<mxfile host="www.draw.io" modified="2019-12-15T05:31:47.699Z" agent="Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0" etag="SYY0dTsL9fpDGhyvJYNk" version="12.4.2" type="google" pages="1"><diagram id="584wGGIcUyvgsr8_o2t1" name="Page-1">7VhNj5swEP01HCvxHXLdNLurVbuXtGrVm4MHcGsYZEw++utrggkhsFFWSkLVlOSAn8fYfm9mPGA4s3TzJEiefEYK3LBNujGcj4ZtW65tG9XfpNsambheDcSCUW3UAgv2GzRoarRkFIqOoUTkkuVdMMQsg1B2MCIErrtmEfLurDmJoQcsQsL76DdGZVKjgWe2+DOwOGlmtkzdk5LGWANFQiiuDyBnbjgzgSjru3QzA16R1/BSj3t8o3e/MAGZPGfA1x9RGU/5F/n68r14Jg8UXjYfnPopK8JLvWG9WLltGACqCNFNFDLBGDPC5y36ILDMKFTTmKrV2nxCzBVoKfAnSLnV6pJSooISmXLdG2EmH0nKeOUkMywFA6EW8QqKrod6QdUq3ty4hgo1MoQTu20ciIgY5Ak7ey+P8mvAFKTYqnECOJFs1V0H0Q4W7+1aDdSNluEdklg9SVLCsp4sXdLXCZOwyMlu+2sViu8gOGKcz5Cj2D3Yibzqp/BCCvwFBz3+7tKPO8Dray/VCoSEzWmx+uTqAY6v84POF02grdvgs5qISg4CzzevJId3VxFinxkh7pgRMvkvyYCdP6Ykdj9pQVbeLmlRDwLqDiWtwF46u6R1heRkTcfOTn6P95yUBdyQeAJBFA6eFmEAy+gyxO+J1sTbwdjET+8qB7ln5qBg1MLpvorZczWxxq1m76t+OluUUQsot6eJgKLksrjduREFIYSD58Yy8FzPvMy54Tl/27lh9bkPMV2yTMmO2Q0FAEvVTJMhAab+xCEXqpiOBXDt0QXol6oRCSUKRvgN3T+K7GH3p/7S9y7Evn9UNjn+2OwHPfJzXFc0/VvEH78oXJN41Ww/Iu76Dj7FOvM/</diagram></mxfile>+ \ No newline at end of file diff --git a/c-programming/4-functions/docs/photos-diagrams/menu-diagram.png b/c-programming/4-functions/docs/photos-diagrams/menu-diagram.png Binary files differ. diff --git a/c-programming/4-functions/docs/photos-diagrams/sct-diagram.drawio b/c-programming/4-functions/docs/photos-diagrams/sct-diagram.drawio @@ -0,0 +1 @@ +<mxfile host="www.draw.io" modified="2019-12-17T18:19:33.838Z" agent="Mozilla/5.0 (X11; Linux x86_64; rv:71.0) Gecko/20100101 Firefox/71.0" etag="bD-VX62YIiVDQHE46UFf" version="12.4.2" type="device" pages="1"><diagram name="Page-1" id="c7558073-3199-34d8-9f00-42111426c3f3">7Vpbc5s4FP41zGwf2gHE9XHjJN1e0mkn2e72KSODMNoCYoQc2/31K4G4k9RJMDCZkBkHHR0M+r7v6BwJK2AV799TmIZXxEeRoqv+XgHniq5rwNX5P2E5FBZbdwrDhmJfOtWGa/wLSaMqrVvso6zlyAiJGE7bRo8kCfJYywYpJbu2W0Ci9l1TuEE9w7UHo771H+yzsLA6ulXb/0J4E5Z31iy36FlD7+eGkm0i76foIMiPojuG5XfJgWYh9MmuYQIXClhRQlhxFu9XKBLYlrAV113e01s9N0UJO+YC44yoN5/AltziL39/D7+n326it64k6w5GW1SOI39adigRQj4HTDYJZSHZkARGF7X1LEcBifuovFX7fCYk5UaNG/9DjB0k+3DLCDeFLI5kb0ASdgljHAkRrciWYkT5Q3xBHK+z/kDl2DPu6KGHRidJZJBuEHvI0S4cxVAbt5BAvkckRoweuANFEWT4rq0dKCW4qfxqGviJZOIRrGiq+kqLcHQXRov1SkuOgzkXL/jmo5F9IldudPn1YxrsPzj46q2+CFYGIRmPicGRPxf2/NI/KYWHhkNKcMKyxjd/FQbuIHO+WWY0mfG1duLhJ8U31oRWj/b02HP7oRdDnPSIbtO4CzFD1ynM0d7xAqYTSDiKViQiNL8WBKb44/aMUfITNXqs/JCh17AXx5ND8g5RhvYPRpDsBSZoYe5ICnZ1yVLSoIaNcsVSTxRzWo8OnKRbNiofPkRO4A3y4TloHRyHew/kASruxd2wOlo3JwT+4cm3AX2GE3TLS1pPEY9iwVjgWnzmlXOz/w9ldak4IP80lNWFcmbnn+cCF8oDPXgzblA5HvIGSVw7pmGqEwSP6baDR1fnJ3EZOetUlYR7dCWhjV1JPCmlAbcd5kDtrKU6/npHUR3/06RATTVeRZPjABYhGgM8TjQmmEM02qtoChyWIRrLbotGtycRwTK2edAes3/l5eL8hzh/Z8rW+b7RdX6QjfmFM/re0NNSVGcF0BFOz1+zZhBaiWpDZx6JBT+j1pS+iRzfGKopHX0NqoXalAuyapt3vppSX8amIceUHqooF41GmItmHed5qwz0anKoJoQfjWlj0smhivkjapHTzA6/DWfD6eioeFR5VUdKY6SQUkxzq6tSiX68TO6TpP07Tc6vL+00C6S+vjrFrNmdp+7R12PTWP8+5hT1j90Tb2NP5GXtdlQvj8plxvyZqay9W2VBNirwSONFgT0EvGvZAE5RElja4oBX+8BnI2+aLwB4wwaLA34ZC65T5a9y226O+uiZU9Eyypj5iTlRYfHYeqB6k1XWA+YkO6n911ettyQvqyLQuxuP88+PWp+AAHqMUAyjceEPAn0Yft9aW+Y0WwXaO7Mt8vkJUPsVcUp2YuAvHXzDGAIfTAi+28eeQj+79UhyNyr+47xAf95qRJvu3Stv1j+nLHJF/ZtVcPE/</diagram></mxfile>+ \ No newline at end of file diff --git a/c-programming/4-functions/docs/photos-diagrams/sct-diagram.jpg b/c-programming/4-functions/docs/photos-diagrams/sct-diagram.jpg Binary files differ. diff --git a/c-programming/5-arrays-pointers-files/documentation/assignment-1.5.pdf b/c-programming/5-arrays-pointers-files/docs/assignment-5.pdf Binary files differ. diff --git a/c-programming/5-arrays-pointers-files/documentation/assignment-1.5.tex b/c-programming/5-arrays-pointers-files/docs/assignment-5.tex diff --git a/c-programming/5-arrays-pointers-files/documentation/assignment-1.5.synctex.gz b/c-programming/5-arrays-pointers-files/documentation/assignment-1.5.synctex.gz Binary files differ. diff --git a/mips-architecture/lab1.asm b/mips-architecture/lab1.asm @@ -0,0 +1,19 @@ +.data + str: .asciiz "Hello world\n" + num: .word 256 + +.text +.globl main + +main: + li $v0, 4 # 4 - print string + la $a0, str # load address of str + syscall + + la $t0, num # load address of num + lw $s1, 0($t0) # load (t0 + 0) to s1 + addi $t2, $s1, 8 # add s1 + 8 to t2 + sw $t2, 0($t0) # store t2 to address of (t0 + 0) + + li $v0, 10 # exit + syscall diff --git a/mips-architecture/lab2.asm b/mips-architecture/lab2.asm @@ -0,0 +1,40 @@ +.data + numstr1: .asciiz "Number 1: " + numstr2: .asciiz "Number 2: " + resstr: .asciiz "Result\n" + addstr: .asciiz "Addition: " + +.text +.globl main + +main: + li $v0, 4 + la $a0, numstr1 # print first input message + syscall + + li $v0, 5 # read first word + syscall + move $t0, $v0 # store input in t0 + + li $v0, 4 + la $a0, numstr2 # print second input message + syscall + + li $v0, 5 # read second word + syscall + move $t1, $v0 # store input in t1 + + li $v0, 4 + la $a0, resstr + syscall + + la $a0, addstr # don't load 4 to v0, it's already there + syscall + + li $v0, 1 + add $t2, $t0, $t1 # add two inputs + la $a0, 0($t2) # load sum and prin it + syscall + + li $v0, 10 # exit + syscall diff --git a/mips-architecture/lab2_exmpl.asm b/mips-architecture/lab2_exmpl.asm @@ -0,0 +1,37 @@ +.data + value: .word 0, 0, 0 + message1: .asciiz "RESULT\n" + message2: .asciiz "addition = " + +.text +.globl main + +main: + la $t0, value + li $v0, 5 # Δώστε τον πρώτο αριθμό + syscall + + sw $v0, 0($t0) + li $v0, 5 # Δώστε τον δεύτερο αριθμό + syscall + + sw $v0, 4($t0) + lw $t1, 0($t0) + lw $t2, 4($t0) + add $t3, $t1, $t2 + sw $t3, 8($t0) + + li $v0, 4 # Τύπωσε το message1 + la $a0, message1 + syscall + + li $v0, 4 # Τύπωσε το message2 + la $a0, message2 + syscall + + li $v0, 1 # Τύπωσε το αποτέλεσμα + move $a0, $t3 + syscall + + li $v0, 10 + syscall # Έξοδος diff --git a/sh-os1/ex1.txt b/sh-os1/ex1.txt @@ -0,0 +1,658 @@ +Eργαστήριο ΛΣ 1 / Άσκηση 1 / 2020-21 +Ονοματεπώνυμο: Χρήστος Μαργιώλης +ΑΜ: [REDACTED] +==================================== + +Ερώτηση 1: +---------- +Δημιουργήστε στον τρέχοντα κατάλογο το αρχείο 'ask1.txt' με τα ακόλουθα +περιεχόμενα(όνομα, επώνυμο, username, ΤΚ, περιοχή, τηλ.), και εμφανίστε +το στησυνέχεια στην οθόνη, με αριθμημένες τις γραμμές του. + +Απάντηση: +Προκειμένου να δημιουργήσουμε ένα αρχείο χρησιμοποιούμε την εντολή 'touch [FILE...]', +όπου FILE είναι το όνομα του αρχείου και ... ότι μπορούμε να δώσουμε όσα ορίσματα +θελουμε. Στην προκειμένη περίπτωση + + touch 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 *' και εξηγήστε το αποτέλεσμα. + +Απάντηση: +Αφού τρέξουμε την εντολή 'cp *' στον kat1 θα παρατηρήσουμε ότι και τα +δύο αρχεία τώρα έχουν την λέξη "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" + +Απάντηση: +==================================================================== +==================================================================== +30 +==================================================================== +==================================================================== + +Ερώτηση 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 +=================================================================== +===================================================================