Adloun

Corrigé bac NSI 2025 — Exercice 2 : Permissions Linux et gestionnaire de fichiers

Sujet officiel du baccalauréat, spécialité numérique et sciences informatiques, session 2025 (épreuve de remplacement). Corrigé rédigé par Ibrahim Alame.

Travailler ce sujet sur Adloun Sujet officiel (PDF) Corrigé complet (PDF)

Énoncé

Cet exercice porte sur les systèmes d'exploitation ainsi que sur la programmation et la programmation orientée objet.

Partie A

1. Écrire, dans un système Linux, la commande masquée en noir qui a permis d'obtenir le résultat de la Figure 1.

(figure : capture d'écran d'un terminal Linux)

alovelace@cerebro:~$ █████
total 21297
-rw-r--r--   8 root      www-data   1257  janv. 29   2019  concat.pls
drwxrwxr-x   2 alovelace alovelace  4096  févr. 18   2023  graph
-rwxrwxr--   4 root      adminsys    344  juin  13   2021  todo.txt
-rwxrw-r--   1 alovelace www-data    118  octo. 05   2024  verify.sh

Figure 1. Capture d'écran d'un terminal Linux

Dans la Figure 1, les permissions des fichiers apparaissent au début de chaque ligne et sont composées de 10 caractères. En lisant de la gauche vers la droite :

2. Décrire les permissions que les trois groupes d'utilisateurs (user, group ou other) ont sur le fichier verify.sh d'après la Figure 1.

3. D'après la Figure 1, écrire la commande que l'utilisateur, propriétaire du fichier concat.pls, doit saisir pour supprimer ce fichier.

On s'intéresse à la façon de modifier les permissions d'un fichier avec la commande chmod. Pour cela on saisit dans un terminal la commande man chmod. La Figure 2 ci-après reproduit l'affichage obtenu.

(figure : extrait de la page de manuel de chmod)

NOM
       chmod - Modifier les bits de comportement de fichier

SYNOPSIS
       chmod [OPTION]... MODE[,MODE]... FICHIER...
       chmod [OPTION]... MODE-OCTAL FICHIER
       chmod [OPTION]... --reference=FICHIER-R FICHIER

       Cette page de manuel documente la version GNU du programme chmod. Le
       programme chmod modifie les bits de comportement de fichier de chacun
       des fichiers indiqués, en suivant l'indication de mode, qui peut être
       une représentation symbolique des changements à effectuer, ou un nombre
       octal représentant le motif binaire des nouveaux bits de comportement.

       Le format d'un mode symbolique [ugoa...][[+-=][permissions...]...], où
       permissions vaut soit zéro, soit plusieurs lettres de l'ensemble
       rwx, soit une seule lettre de l'ensemble ugo. Plusieurs modes
       symboliques peuvent être indiqués ensemble, séparés par des virgules.

       Une combinaison des lettres ugoa contrôle la catégorie d'accès à
       modifier. Il peut s'agir de l'utilisateur possédant le fichier (u), des
       autres utilisateurs du même groupe que le fichier (g), des utilisateurs
       n'appartenant pas au groupe du fichier (o), ou de tous les utilisateurs
       (a).

       L'opérateur + ajoute à chaque fichier les bits de comportement de
       fichier spécifiés à ceux déjà existants, l'opérateur - les enlève.

       Les lettres rwx sélectionnent les bits de comportement de fichier
       des utilisateurs concernés : lecture (r), écriture (w), exécution (ou
       recherche pour les répertoires) (x).

Figure 2. Extrait de la page de manuel de chmod

4. Avec les éléments de la Figure 1 et à la lecture de la documentation Figure 2, expliquer quel sera l'effet de l'instruction chmod g-wx todo.txt.

Partie B

Dans la suite de la documentation de la commande chmod, on peut lire l'extrait suivant :

> L'indication de mode, qui peut être une représentation symbolique des changements à effectuer, ou un nombre octal représentant le motif binaire des nouveaux bits de comportement.

Cela signifie que l'on peut indiquer les permissions soit sous la forme d'une chaîne de 9 caractères composée de -, r, w et x, appelée représentation symbolique, soit sous la forme d'une valeur numérique abc composée de trois chiffres a, b et c compris entre 0 et 7 appelée représentation octale.

Le but de cette partie est d'écrire des fonctions Python permettant de passer d'une représentation symbolique à une représentation octale des permissions.

On considère une chaîne de trois caractères dont :

On souhaite déterminer le motif binaire de 3 bits correspondant à cette chaîne. Pour cela, on applique les règles suivantes :

5. Déterminer l'écriture en base 10 du motif binaire de 3 bits correspondant à la chaîne 'rw-'.

La représentation octale associée à une représentation symbolique est obtenue en appliquant ce qui précède trois fois :

Par exemple, la représentation octale associée à la représentation symbolique rwxr-xr-- est 754.

6. Écrire le code d'une fonction Python bin_to_oct qui prend en paramètre une chaîne de caractères composée uniquement des caractères '0' et '1' et renvoie la représentation octale correspondant à ce motif binaire (le bit de poids fort étant à gauche).

Exemples :

>>> bin_to_oct('101')
5
>>> bin_to_oct('011')
3

7. On considère la fonction Python mystere qui prend en paramètre une chaîne de 9 caractères et qui renvoie une chaîne de caractères.

def mystere(chaine):
    resultat = ''
    for c in chaine:
        if c == '-':
            resultat = resultat + '0'
        else:
            resultat = resultat + '1'
    return resultat

Déterminer ce que renvoie mystere('rw-r-xr--').

8. On considère dans cette question qu'on dispose d'une fonction Python symb_to_bin qui prend en paramètre une chaîne de 9 caractères correspondant à l'écriture symbolique d'une permission et qui renvoie une chaîne de caractères correspondant au motif binaire de cette permission.

Recopier et compléter le code de la fonction Python symb_to_oct donné ci-dessous, qui prend en paramètre une représentation symbolique sous la forme d'une chaîne de caractères de 9 caractères et qui renvoie la représentation octale correspondante sous la forme d'une chaîne de caractères. Il est possible de répondre en une ou plusieurs lignes de code.

def symb_to_oct(chaine):
    repr_bin = symb_to_bin(chaine)
    # les 3 premiers bits correspondent au propriétaire
    user = repr_bin[0] + repr_bin[1] + repr_bin[2]
    # les 3 suivants au groupe
    group = repr_bin[3] + repr_bin[4] + repr_bin[5]
    # et les 3 derniers aux autres
    other = repr_bin[6] + repr_bin[7] + repr_bin[8]
    ...

Exemples :

>>> symb_to_oct('rwxrw-r--')
'764'
>>> symb_to_oct('rw-r--r--')
'644'

Partie C

Dans cette partie, on souhaite écrire un gestionnaire de fichiers Linux. Pour cela, on modélise les fichiers en utilisant la programmation orientée objet. On dispose de la classe Fichier ci-dessous.

class Fichier:
    def __init__(self, nom, poids, proprio, groupe, permission):
        self.nom = nom
        self.poids = poids                  # taille en octets
        self.proprietaire = proprio         # nom du propriétaire
        self.groupe = groupe                # nom du groupe
        self.permission = permission        # représentation symbolique

9. Instancier l'objet mon_fichier de la classe Fichier représentant un fichier nommé concat.pls, dont le propriétaire est root, le groupe est www-data, le poids 1257 octets et dont les permissions sont données par la représentation symbolique 'rw-r--r--'.

10. Écrire une méthode chown de la classe Fichier qui prend en paramètre une chaîne de caractères qui correspond au nom du nouveau propriétaire et qui modifie le propriétaire du fichier.

11. Écrire une fonction get_executable qui prend en paramètres une liste d'objets de la classe Fichier ainsi qu'un nom de propriétaire et qui renvoie la liste des fichiers qui appartiennent à ce propriétaire et qui sont exécutables par ce propriétaire.

Corrigé

1. La commande ls permet d'obtenir le listing des fichiers et dossiers présents. On ne demande pas l'option -l.

2. -rwxrw-r-- signifie que le propriétaire peut lire, écrire/modifier et exécuter le fichier. Les autres membres du groupe peuvent lire et écrire/modifier. Les autres utilisateurs ne peuvent que lire.

3. rm concat.pls. On accepte rm seul.

4. chmod g-wx indique que les permissions en écriture et en exécution sont retirées aux membres du groupe adminsys.

5. rw- donne 110 qui vaut 6.

6.

def bin_to_oct(chaine):
    valeur = 0
    for i in range(len(chaine)):
        valeur = valeur + int(chaine[i]) * 2 ** (2 - i)
    return valeur

ou

def bin_to_oct(chaine):
    valeur = 0
    poids = 1
    for i in range(len(chaine)-1, -1, -1):
        valeur = valeur + int(chaine[i]) * poids
        poids = poids * 2
    return valeur

ou tout autre réponse valide.

7. On obtient en sortie la chaîne '110100100'.

8.

def symb_to_oct(chaine):
    repr_bin = symb_to_bin(chaine)
    # les 3 premiers bits correspondent au propriétaire
    user = repr_bin[0] + repr_bin[1] + repr_bin[2]
    # les 3 suivants au groupe
    group = repr_bin[3] + repr_bin[4] + repr_bin[5]
    # et les 3 derniers aux autres
    other = repr_bin[6] + repr_bin[7] + repr_bin[8]
    return str(bin_to_oct(user)) + str(bin_to_oct(group)) + str(bin_to_oct(other))

ou tout autre réponse valide en une ou plusieurs lignes.

9.

mon_fichier = Fichier('concat.pls', 1257, 'root', 'www-data', 'rw-r--r--')

10. On attend une méthode :

def chown(self, nouveau_proprietaire):
    self.proprietaire = nouveau_proprietaire

11.

def get_executable(fichiers, proprietaire):
    executables = []
    for fichier in fichiers:
        if fichier.proprietaire == proprietaire and fichier.permission[2] == 'x':
            executables.append(fichier)
    return executables

Poser une question au tuteur sur ce sujet