Table of Contents

Tema 3 - Mini-shell

Scopul acestei teme este realizarea unui shell simplu, compatibil cu sh;

Informații generale

Deadline: 5 Aprilie, ora 23:55
Punctaj: 2 puncte din nota
Incarcarea temei: vmchecker.cs.pub.ro
Incarcarea cu intarziere: 0.1 punct / zi (maxim 4 zile)

Cunoștințe evaluate

Reguli

  1. Tema trebuie sa contina un fisier Readme in care sa explicati cum ati facut tema (-0.1p)
  2. Aveti voie sa folositi doar functii POSIX (biblioteca os)
  3. Aveti voie sa folositi doar limbajul Python (Python 3)
  4. O temă care trece toate testele automate va obține 10 puncte din 10 (daca nu trișează folosind API interzis, cum ar fi funcția f.write(), os.popen, caz în care nu va fi punctată).

Copierea

Tema se rezolva individual. Orice tentativa de copiere va rezulta in 0p pentru tema respectiva. Vom utiliza si sisteme automate de detectare a copierii. Daca avem dubii, va vom adresa intrebari suplimentare legate de tema.

Intrebari

Daca aveti intrebari legate de tema, va rugam sa scrieti un issue pe repository-ul de github repository cu titlul de forma [mini-shell] <titlul intrebarii voastre>. Aveti nevoie de un cont de github pentru a scrie intrebari.

NU PUBLICATI COD SURSA. Acesta va fi considerata copiere si se va penaliza cu 0p pe tema pentru voi.

Daca doriti sa primiti un email cand se pun intrebari noi sau cand apar raspunsuri, accesati github repository si faceti click pe Watch.

Mini Shell

Să se implementeze un shell simplu, care suportă execuția de comenzi externe cu argumente multiple, comenzi interne, redirectări, pipe-uri. Shell-ul trebuie să suporte execuția de comenzi compuse, cu oricâți operatori.

Comnezi interne: comenzi pe care shell-ul le execute: cd, pwd, exit … Comenzi externe: comenzi care sunt de fapt executabile separate: ls, vim, tree, nano, …

Regula este asa: se verifica daca este comanda interna, daca nu, se presupune ca este o comanda externa.

Shell-ul trebuie să suporte următorii operatori de execuție:

spre ceea ce citeste de la tastatura al doilea proces. De exemplu, expr1 | expr2 va avea ca efect execuția comezilor expr1 cu stdout-ul redirectat în stdin-ul comenzilor expr2;

Prioritatea operatorilor de execuție este, de la cel mai prioritar la cel mai puțin prioritar:

  1. operatorul pipe
  2. operatorii de execuție condiționată
  3. operatorul de paralelism
  4. operatorul de secvențiere

Shell-ul trebuie, de asemenea, să suporte și următorii operatori de redirectare:

În fine, shell-ul trebuie să suporte următoarele comenzi interne:

Shell-ul trebuie să suporte subcomenzi:

Precizări generale

Sugestii de rezolvare

Tema este relativ complexa fata de cea anterioara. Un sablon pentru inceperea temei este disponibil in repository in directorul tema3.

Recomandăm rezolvarea și testarea din aproape în aproape a temei, după pași:

  1. rularea de comenzi simple (ls, ls -l)
  2. rularea de comenzi interne (cd, exit, quit)
  3. implementarea redirectărilor (operatorii <, >, 2>, &>, >>, 2>>)
  4. secvențierea comenzilor (operatorii &&, ||, ;)
  5. implementarea operatorilor & (paralel)
  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
 
 
 > exit

Materiale ajutătoare

Cursuri utile:

Laboratoare utile:

Resurse:

Parcurgerea linii de comanda

Pentru parcurgerea linii de comanda, am scris noi deja un parser (parser.py) pe care il puteti folosi. Incepeti tema in fisierul cmd.py aflat in sablon.

Pentru a vizualiza cum arata structura de date primita de la parser, rulati scriptul din cmd.py după care introduceți o comandă de la tastatură.

Pentru a putea rula fișierul cmd.py, trebuie să instalați biblioteca 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

Structura intoarsa in cmd.py

Prin apelarea parse.parse(line), se va intoarce un obiect de tipul Command.

Clasa Command

Proprietati:

Pentru a verifica tipul unui obiect, folositi structura isinstance (obj, class).

Clasa SimpleCommand

Obiectul de tip SimpleCommand este folosit in cadrul comenzilor cu op egal OP_NONE (comanda simpla). Acestea se gasesc in lista commands si sunt fie comenzi, fie parametrii unor comenzi.

Proprietati:

Tipurile de operatii

Modulul parse expune urmatoarele tipuri de operatii (valoarea lui command.op):

Testarea locala a temei

Pentru a testa tema local, va recomandam ca prima data sa rulati comanda make -f Makefile.checker in directorul devoir3. Astfel se vor instala toate modulele necesare pentru rularea fisierului cmd.py. In continuare, puteti rula tema folosind python3 cmd.py, iar in directorul verify veti gasi toate comenzile pe care tema trebuie sa le ruleze.

FAQ

Trimiterea temei

Tema se va incarca pe vmchecker. Logati-va pe site cu folosind utilizatorul de pe moodle, selectati cursul Systemes d'Explotation (FILS) si incarcati arhiva temei.

Readme

Fisierul readme are urmatorul format:

Numele vostru intreg
Grupa

Descrierea rezolvarii temei, de ce ati ales anumite solutii, etc.

Arhiva temei

Pentru a incarca tema, urmariti pasii:

  1. Creati o arhiva zip (nu rar, ace, 7zip sau alt format) care sa contina:
    • toate fisierele Python (*.py)
    • fisierul principal cu numele cmd.py
    • fisierul Readme
  2. logati-va pe vmchecker
  3. selectati cursul Systemes d'Explotation(FILS)
  4. selectati 3. Mini-Shell
  5. incarcati arhiva

Arhiva trebuie sa contina toate fisierele (principale) in radacina, nu in subdirectoare. NU arhivati directorul temei, arhivati DIRECT fisierele.

NU includeti directoarele specifice bibliotecii bashlex (pycache, bashlex, bashlex-0.14.dist-info).

Dupa ce incarcati arhiva, vmchecker va rula:

unzip archive.zip homework
cd homework
make -f Makefile.checker