Table of Contents

Devoir 3 - Mini-shell

Le but de ce thème est de créer un shell simple, compatible avec sh ;

Informations générales

Date limite: Le 5 avril, 23h55
Note: 2 points de la note
Téléchargement du devoir: vmchecker.cs.pub.ro
Charge différée: 0.1 point / jour (max 4 jours)

Connaissances précieuses

Règles

  1. Le devoir doit contenir un fichier Readme expliquant comment vous avez créé le devoir (-0.1p)
  2. Vous pouvez utiliser seulement les fonctions POSIX (bibliothèque os ).
  3. Vous pouvez utiliser uniquement le langage Python ( Python 3)
  4. Un devoir qui passe tous les tests automatisés obtiendra 10 sur 10 (si vouz ne trichez pas en utilisant un API interdit, tel que la fonction f.write() , os.popen situation pour laquelle de devoir ne sera pas noté).

Copier

Le devoir doit etre résolu individuellement. Toute tentative de tricher entraînera 0p pour ce devoir. Nous utiliserons également des systèmes de détection de trichage automatique. Si nous avons des doutes, nous vous poserons des questions supplémentaires concernant le devoir.

Questions

Si vous avez des questions sur le sujet, écrivez un problème sur le référentiel github repository avec le titre [mini-shell ] <le titre de votre question>. Vous avez besoin d'un compte github pour écrire des questions.

NE PAS PUBLIER LE CODE SOURCE . Cela sera considéré comme une tentative de tricher et sera pénalisé avec 0p pour vous sur ce devoir.

Si vous souhaitez recevoir un courrier électronique lorsque de nouvelles questions sont posées ou lorsque des réponses sont fournies, accédez à github repository et cliquez sur Regarder .

Mini Shell

Implémentez un shell simple qui prend en charge l'exécution de commandes externes avec plusieurs arguments, commandes internes, redirections, canaux. Le shell doit gérer l'exécution de commandes composées avec plusieurs opérateurs.

Commandes internes: commandes que le shell exécute: cd , pwd , exit

Commandes externes: Les commandes qui sont en fait des exécutables séparés: ls , vim , arbre , nano , …

La règle est la suivante: vérifiez si la commande interne est, sinon, on suppose qu'elle est une commande externe.

Le shell doit prendre en charge les opérateurs d'exécution suivants:

La priorité des opérateurs d'exécution est, de la priorité la plus grande à la plus petite:

  1. opérateur pipe
  2. opérateurs d'exécution conditionnelle
  3. opérateur de parallélisme
  4. opérateur de séquençage

Le shell doit également prendre en charge les redirecteurs suivants:

Finalement, le shell doit accepter les commandes internes suivantes:

Le shell doit aussi supporter les sous-commandes:

Remarques générales

Suggestions

Le devoir est relativement complexe par rapport au précédent. Un modèle pour le commencement du devoir est disponible sur le repository dans le répertoire tema3 . Nous vous recommandons de résoudre et de tester toujours le devoir, étape par étape:

  1. Lancer des commandes simples ( ls , ls -l )
  2. Exécuter des commandes internes ( cd , exit , 'quit' ')
  3. mise en place de redirections (opérateurs < , > , 2> , &> , » , )
  4. séquencement des commandes (opérateurs &&, ||, ;)
  5. implémentation des opérateurs & (parallèle)
  6. |
 $ ls
 Makefile	  README.checker  mini-shell	mini-shell.o  parser
 Makefile.checker  inputs	  mini-shell.c	outputs       tags
 
 $ cat /etc/services | grep telnet
 telnet		23/tcp
 rtelnet	107/tcp				# Remote Telnet
 rtelnet	107/udp
 telnets	992/tcp				# Telnet over SSL
 telnets	992/udp
 tfido		60177/tcp			# fidonet EMSI over telnet
 
 $ uname -a ; ps 
 Linux bogdan-desktop 2.6.31-19-generic #56-Ubuntu SMP Thu Jan 28 02:39:34 UTC 2010 x86_64 GNU/Linux
   PID TTY          TIME CMD
  6078 pts/0    00:00:00 bash
  6190 pts/0    00:00:00 mini-shell
  6200 pts/0    00:00:00 ps
 
 $ date && sleep 1 ; echo date
 Mon Feb  8 13:40:25 EET 2010
 date
 
 $ date && sleep 1; date
 Mon Feb  8 13:40:49 EET 2010
 Mon Feb  8 13:40:50 EET 2010
 
 $ true && date
 Mon Feb  8 13:41:16 EET 2010
 
 $ false && cat mini-shell.c
 
 $ false || date
 Mon Feb  8 13:42:36 EET 2010
 
 $ cat /et/services
 cat: /et/services: No such file or directory
 
 $ gcc > tmp; echo sep; cat tmp
 gcc: no input files
 sep
 
 $ strace -e trace=read ls 2> strace.out   
 Makefile	  README.checker  mini-shell	mini-shell.o  parser	  tags
 Makefile.checker  inputs	  mini-shell.c	outputs       strace.out  tmp
 
 $ head -1 strace.out
 read(3, "\177ELF\2\1\1\0\0\0\0\0\0\0\0\0\3\0>\0\1\0\0\0@#\0\0\0\0\0\0@"..., 832) = 832
 
 $ pwd; cd Teme; pwd
 /home/bogdan/Documents/SO/Solutii
 /home/bogdan/Documents/SO/Solutii/Teme
 
 $ LETTER=alfa && echo $LETTER
 alfa
 
 > echo a > test ; echo b >> test && cat test
 a
 b
 
 > exit

Documents d'aide

Cours utiles:

Laboratoires utiles:

Ressources:

Traitement de la ligne de commande

Pour traiter la ligne de commande, nous avons déjà écrit un analyseur que vous pouvez utiliser. Lancez le devoir dans le fichier 'cmd.py' du modèle.

Pour voir à quoi ressemble la structure de données à partir de l'analyseur, exécutez le script cmd.py et apres introduisez une commande du clavier.

Pour pouvoir exécuter le fichier cmd.py, il faut intaller la bibliotheque bashlex (pip3 install bashlex --target=.).

$ pip3 install bashlex --target=.
$ python3 cmd.py
 
$ ls
ls
{'op': 4, 'com1': None, 'com2': None, 'commands': [<parse.SimpleCommand object at 0x100b4bfd0>], 'input': None, 'output': None, 'err': None, 'append_err': False, 'append_out': False}
commands
ls

La structure retournée en cmd.py

En appelant parse.parse(line), on va renvoyer un objet de type Command.

Classe Command

Propriétés:

Pour vérifier le type d'on objet, utilisez la structure isinstance (obj, class).

Classe SimpleCommand

L'objet de type SimpleCommand est utilisé dans les commandes ayant op égal a OP_NONE (commande simple). Celles-ci se trouvent dans la liste commands est sont soit des commandes, soit des parametres pour des commandes.

Propriétés:

Types d'opérations

Le module parse expose les suivantes types d'opérations (la valeur de command.op):

FAQ

args = ["/bin/bash", "-c", command];
os.execv(args[0], args);

* A: Non.

Télécharger les devoirs

Le devoir sera téléchargé sur vmchecker. Connectez-vous au site à l'aide de l'utilisateur moodle, sélectionnez Systemes d'Explotation (FILS) et chargez archive de devoir.

Readme

Le fichier readme a le format suivant:

Votre nom entier
La groupe

Description de la résolution du devoir, pourquoi vous avez choisi des solutions, etc.

Archivage de devoir

Pour télécharger le devoir, suivez les étapes suivantes:

  1. Créez une archive zip (pas rar, ace, 7zip ou autre format) contenant:
    • tous Python (*.py)
    • le fichier principal ayant le nom cmd.py
    • Fichier Readme - connectez-vous sur vmchecker
  2. sélectionnez le cours Systemes d'Explotation (FILS)
  3. sélectionnez 3. Mini-Shell
  4. téléchargez l'archive

L'archive doit contenir tous les fichiers (principaux) à la racine, pas dans les sous-répertoires. NE PAS archiver le répertoire du devoir, archiver les fichiers DIRECT.

N'incluez PAS les directoires spécifiques a la bibliotheque bashlex (pycache, bashlex, bashlex-0.14.dist-info).

Après avoir chargé l'archive, vmchecker s'exécutera:

unzip archive.zip homework
cd homework
python3 cmd.py