Curs Instrumente si Tehnici de Baza in Informatica (PDF)

Summary

This document is a lecture outline for a course on Basic Information Technology Tools and Techniques, Semester 1 2024-2025, taught by Vlad Olaru. Topics covered include system architecture, operating systems, boot process, user login, and other fundamental concepts.

Full Transcript

Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 10/1/2024 Curs 1 - outline structura sistemelor de calcul ce este un sistem de operare serviciile sistemului de operare pornirea sistemul...

Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 10/1/2024 Curs 1 - outline structura sistemelor de calcul ce este un sistem de operare serviciile sistemului de operare pornirea sistemului (procesul de boot) procesul de login utilizator interpretorul de comenzi 2 Structura sistemelor de calcul componente sistem de calcul:  Hardware – resursele de calcul de baza  CPU, memorie, echipamente intrare/iesire (I/O)  Sistem de operare  controleaza si coordoneaza utilizarea HW intre programe si utilizatori  Programe de aplicatie – definesc modul in care resursele sistemului sunt folosite pentru a rezolva problemele utilizatorilor  Procesoare de text, compilatoare, browser-e web, sisteme de baze de date, jocuri video  Utilizatori  oameni, masini, alte computere Perspectiva abstracta a componentelor unui calculator Organizarea sistemelor de calcul operarea sistemelor de calcul  unul sau mai multe procesoare si controllere de echipamente comunica prin intermediul unei magistrale care asigura accesul la memorie  efect net: concurenta executiei procesoarelor si a echipamentelor care intra in competitie pentru cicli de acces la memorie Cum functioneaza un computer modern Ce este un sistem de operare? un program care intermediaza intre utilizator si HW calculatorului obiectivele sistemului de operare:  executa programele utilizator si usureaza solutionarea problemelor  face sistemul de calcul convenabil de utilizat  in particular, responsabil pentru definirea unor abstractii software  eg., lucram cu fisiere nu cu blocuri de disc, cu conexiuni de retea nu cu sirurile de biti manipulate de placile de retea  foloseste HW computerului in mod eficient Ce face un sistem de operare depinde de punctul de vedere utilizatorii vor usurinta utilizarii si performanta  nu le pasa de utilizarea resurselor dar calculatoarele mari (eventual supercomputere) trebuie sa satisfaca asteptarile tuturor utilizatorilor  sistemul de operare = alocator de resurse si program de control care eficientizeaza folosirea HW si gestioneaza executia programelor utilizator utilizatorii de statii de lucru au resurse dedicate, dar adesea folosesc resurse partajate de catre servere echipamentele mobile (smartphone, tablet) au resurse limitate, sunt optimizate pentru uzabilitate si viata bateriei  interfete utilizator speciale, touch screen, recunoastere vocala unele computere au interfete limitate sau n-au deloc, eg. embedded systems in echipamente industriale sau automobile  in principal ruleaza fara interventia utilizatorului Definitia sistemului de operare nu exista o definitie general acceptata “software-ul cu care este echipat calculatorul livrat de producator” e o buna aproximatie  variaza insa mult “programul care ruleaza in permanenta pe calculator” este nucleul (kernelul) sistemului de operare restul este fie  program de sistem (livrat cu sistemul de operare, dar nu e parte a nucleului), sau  aplicatie, toate programele neasociate cu sistemul de operare SO actuale de uz general (GPOS, General Purpose OS) sau pt calcul mobil includ si middleware – un set de framework-uri software care furnizeaza servicii aditionale dezvoltatorilor de aplicatii cum ar fi baze de date, multimedia, grafica Serviciile sistemului de operare sistemul de operare ofera un mediu de executie pentru programe si servicii pentru programe si utilizatori o parte a serviciilor SO furnizeaza functii de asistenta a utilizatorului:  interfata utilizator – aproape toate SO au interfata utilizatori (UI)  variaza: linia de comanda Command-Line (CLI), interfata grafica Graphics User Interface (GUI), touch-screen, Batch  executia programelor – SO trebuie sa fie capabil sa incarce un program in memorie si sa-l execute, sa termine executia lui fie normal, fie anormal cu indicarea erorii  operatii de intrare/iesire (I/O) - un program in executie poate cere I/O, ceea ce poate implica acces la fisiere sau la un echipament I/O  manipularea fisierelor - sistemul de fisiere este in mod particular interesant pt utilizator (programele au nevoie sa citeasca/scrie fisiere si directoare, sa le creeze si sa le stearga, sa le caute, sa afiseze informatii despre ele, sa gestioneze permisiunile de acces la ele) Serviciile SO (cont.) o parte a serviciilor SO furnizeaza functii de asistenta a utilizatorului (cont.):  comunicatia – procesele pot schimba informatii, pe acelasi calculator sau intre calculatoare legate in retea  comunicatia poate avea loc prin memorie partajata sau schimb de mesaje (message passing)  detectia erorilor – SO trebuie sa fie constant constient de posibile erori  pot aparea in CPU sau memorie, in echipamente I/O, in programele utilizator  pt fiecare tip de eroare, SO trebuie sa ia actiunea potrivita pt a asigura calculul corect si consistent  facilitatile de debug pot inbunatati substantial abilitatile utilizatorilor si programatorilor de a utiliza eficient sistemul de calcul Serviciile SO (cont.) alta parte a SO exista pt a asigura operarea eficienta a sistemului in prezenta resurselor partajate  alocarea resurselor – cand mai multi utilizatori sau programe se executa concurent, au nevoie de resurse fiecare  tipuri de resurse - ciclii CPU, memoria principalea, stocarea fisierelor, echipamente I/O  logarea executiei – necesara pt a contabiliza utilizarea resurselor de catre utilizatori si tipul de resurse folosite  protectie si securitate –informatiile stocate in sisteme multi-utilizator sau conectate in retea pot avea regim de acces restrictionat + procesele concurente nu trebuie sa interfereze unele cu altele  protectia implica asigurarea ca toate accesele la resursele sistemului sunt controlate  securitatea sistemului fata de utilizatori externi necesita autentificarea utilizatorilor si se extinde la protejarea echipamentelor I/O externe de incercari de acces invalide O perspectiva a serviciilor SO Instalarea si bootarea SO SO sunt in general proiectate sa ruleze pe o clasa de sisteme cu o varietate de echipamente periferice uzual, SO deja instalat pe calculatorul cumparat  se pot insa compila si instala alte SO  daca se genereaza un SO de la zero  se scrie codul SO  se configureaza pt sistemul de calcul pe care va rula  se compileaza SO  se instaleaza SO  se booteaza calculatorul sub comanda noului SO Exemplu, Linux se descarca codul sursa Linux (http://www.kernel.org) se configureaza nucleul via “make menuconfig” se compileaza nucleul folosind “make”  se produce vmlinuz, imaginea nucleului  se compileaza modulelel kernel via “make modules”  se instaleaza modulele kernel in vmlinuz via “make modules_install”  se instaleaza noul kernel in sistem via “make install” Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 10/8/2024 Outline pornirea sistemului (procesul de boot) procesul de login utilizator interfata cu utilizatorul fisiere si directoare 2 Bootarea sistemului la pornirea calculatorului, executia incepe intr-un loc fix din memorie SO trebuie sa fie facut disponibil HW ca sa-l poata porni  o mica bucata de cod – bootstrap loader, BIOS, stocat in ROM sau EEPROM localizeaza kernelul, il incarca in memorie si il porneste  uneori e un proces in doi pasi, utilizand un bloc de boot aflat la o adresa fixa in codul ROM, care apoi incarca boostrap loader-ul de pe disc  sistemele moderne inlocuiesc BIOS cu Unified Extensible Firmware Interface (UEFI) un bootstrap loader uzual este GRUB, permite selectia kernelului de pe discuri multiple, cu versiuni si optiuni diferite programul kernel se incarca si apoi sistemul ruleaza boot loader-erele permit frecvent diferite stari de boot, cum ar fi de pilda single user mode 10/8/2024 Procesul de boot Unix primul sector al discului de boot (MBR, respectiv succesorul sau GPT)  tabela de partitii de disc  cod de bootstrap (boot loader) 4 10/8/2024 Procesul de boot Unix (cont.) loader-ul identifica partitia de boot si incarca codul kernel (nucleul sistemului de operare) obs: la acest nivel nu exista notiunea (abstractia) de fisier, ci doar sectoare de disc => 2 solutii posibile  1. loader-ul cunoaste o harta a sectoarelor de disc care contin codul kernel  solutie hardcoded, implica actualizari alei hartilor atunci cand imaginea kernelului pe disc se schimba, la defragmentarea discului, etc  2. loader-ul are acces la drivere care inteleg structura sistemului de fisiere de pe disc si pot identifica astfel kernelul ca pe un fisier oarecare (folosind calea fisierului) ex boot loaders Linux: Lilo, Grub 5 10/8/2024 Procesul de boot (cont.) fisierul cu imaginea kernelului (eg, /boot/vmlinuz pt Linux) se incarca in memorie si kernelul preia controlul masinii HW subsecvent, kernelul executa:  secventa de intializare a componentelor HW  instantiaza principalele componente: controlul proceselor, gestiunea memoriei, gestiunea fisierelor, accounting, gestiunea timpului sistem, mecanismele de protectie HW si de securitate, etc  ramane rezident in memorie in asteptarea unor evenimente externe (“program interrupt-driven”)  la sfarsitul secventei de initializare executa primul proces (ID = 1): /sbin/init  init seteaza modul de operare (runlevel)  defineste starea masinii de calcul dupa boot  traditional definit de un numar intre 0 si 6  istoric (sistemele Unix), init cauta runlevel-ul in /etc/inittab  apoi, apeleaza scripturi de initializare a serviciilor sistem cf. runlevelului selectat /etc/rc0.d/, /etc/rc1.d, …, /etc/rc6.d, /etc/rcS.d 6 10/8/2024 Runlevels asignate modului de operare al masinii  0 , power-off  1, single-user mode  2, multi-user fara retea  3, multi-user cu retea dar fara interfata grafica  4, in general nedefinit, rezervat pt utilizari speciale  5, multi-user cu retea si interfata grafica  6, reboot Linux: init s.n. systemd, iar runlevel-urile sunt definite ca targets, manipulate cu comenzi specifice (systemctl) comenzi care manipuleaza runlevels: $ runlevel # afiseaza runlevelul current, similar cu “who –r” $ telinit # comuta kernelul in runlevelul specificat $ telinit 6 # reboot 7 10/8/2024 Sisteme cu sau fara GUI init este responsabil si pt. pornirea proceselor de login pt utilizator:  in functie de runlevel: /sbin/getty respectiv desktop manager-ul de interfete grafice de tip X Window (xdm, gdm, etc)  runlevel 3: init porneste getty pe un numar prestabilit de terminale  runlevel 5: init porneste getty + desktop manager  istoric (sistemele Unix), init cauta in /etc/inittab asocierea terminal – program de login (getty sau xdm/gdm) comutarea sistemului intre runleveluri cu sau fara interfata grafica $ telinit 3 # dezactiveaza GUI $ telinit 5 # activeaza GUI inapoi Obs: combinatii de taste (gen Ctrl-Alt-F1 in Linux) permit comutarea intre terminale si GUI (uzual, Ctrl-Alt-F7) in runlevel 5, dar nu se dezactiveaza GUI ! 8 10/8/2024 Logarea utilizatorului in sisteme fara GUI getty afiseaza prompt-ul de login utilizatorul introduce numele de utilizator getty apeleaza /bin/login care stabileste o noua sesiune de lucru login afiseaza promptul de parola  cauta in /etc/passwd o intrare corespunzatoare numelui de utilizator  verifica parola (de regula stocata criptat in alt fisier, eg. /etc/shadow)  pt parola corecta, executa interpretorul de comenzi (shell-ul) asociat intrarii identificate  asociaza cu shell-ul variabile de mediu (environment)  unele variabile importante (USER, SHELL, HOME ) initializate cu valorile din campurile citite din intrarea corespunzatoare din /etc/passwd shell-ul afiseaza un prompt specific (eg, $) si asteapta comenzile utilizatorului init monitorizeaza sesiunea de lucru a utilizatorului  la terminarea activitatii (shell exit), reporneste o instanta a programului getty pe terminalul respectiv 9 10/8/2024 Interpretorul de comenzi Command Line Interpreter (CLI), permite introducerea directa a comenzilor  program de sistem care preia comenzile utilizator si le executa  utilizabil deopotriva in mod interactiv cat si batch (folosind shell script-uri)  executa atat comenzi interne (executate in cadrul interpretorului) cat si externe (programe incarcate de pe disc)  functionalitati principale  asigurarea unui mediu de lucru utilizatorului (v. comanda env)  comenzi de manipulare a fisierelor si directoarelor  comenzi de control al executiei programelor  controlul si monitorizarea activitatilor de I/O  administrarea sistemului (rezervata unui utilizator special cunoscut in mod uzual sub numele de root, cu UID = 0, v. prima intrare din /etc/passwd)  samd. ex. interpretoare de comenzi: Bourne Shell (/bin/sh), Bourne Again Shell (/bin/bash), C Shell (/bin/csh), Korn Shell (/bin/ksh), etc. /etc/shells contine interpretoarele de comenzi disponibile pe sistem 10 Bourne Shell (CLI) Interfata grafica- GUI interfata user-friendly  compusa uzual din mouse, tastatura, si monitor  icoanele reprezinta fisierele, programele, actiuni, etc  actionarea butoanelor mouse peste obiecte din interfata determina diverse actiuni (furnizare de informatii, optiuni, executia de functii, deschiderea de directoare, etc)  inventata la Xerox PARC multe sisteme de azi includ atat CLI cat si GUI  Microsoft Windows are GUI si CLI “command” shell  Apple Mac OS X are GUI cu kernel UNIX dedesubt si shell-uri disponibile  Unix si Linux au CLI (shell-uri) cu GUI optional (CDE, KDE, GNOME) Mac OS X GUI 10/8/2024 Identificarea utilizatorului la login, utilizatorul primeste un ID propriu (valoare intreaga nenegativa prin care utilizatorul este identificat in SO), user ID-ul (UID)  obtinut din intrarea corespunzatoare utilizatorului din /etc/passwd  unic  asignat de catre root, singurul care are permisiunea de a scrie in /etc/passwd  nu poate fi schimbat de catre utilizator  folosit de kernel pentru a verifica daca procesele utilizatorului au dreptul sa execute anumite operatii  UID = 0 rezervat pt root sau superuser (administratorul sistemului) procesele root au privilegii de superuser si de regula circumventeaza verificarile pe care kernelul le face pentru o serie de operatii unele dintre functiile kernelului pot fi executate doar de procese root root-ul are control total asupra sistemului de calcul  Obs: din acest motiv, este puternic descurajata initiativa utilizatorilor sistemului care stiu parola de root sa ruleze programe obisnuite in calitate de root (UID = 0) 14 10/8/2024 Identificarea utilizatorului (cont.) la login utilizatorul primeste si un GID (Group ID), setat tot de root in intrarea corespunzatoare din /etc/passwd  permite partajarea de resurse intre membrii aceluiasi grup, chiar daca au UID-uri diferite  in schimb, utilizatorii cu GID diferit nu pot accesa aceste resurse partajate ale grupului  ex: intrarile de director pentru fiecare fisier din sistem contin perechea (UID,GID) a proprietarului fisierului respectiv  comanda shell ls –l permite afisarea ID-urilor proprietarului fisierului /etc/group  asigneaza nume lizibile GID-urilor utilizator  modificabil doar de catre root  listeaza si supplementary GIDs, i.e. acelasi utilizator poate avea mai multe GID-uri (poate apartine mai multor grupuri) /usr/bin/id afiseaza UID/GID $ id # UID/GID pt utilizatorul shell-ului $ id root # UID/GID pt alt utilizator (root) 15 10/8/2024 Fisiere si directoare fisier: abstractie de nivel SO pentru stocarea permanenta a datelor  ascunde detaliile stocarii efective a datelor pe disc  model usor de inteles al structurii datelor (eg, stream de octeti in Unix)  grupate in directoare  referite prin nume (poate contine orice caracter mai putin ‘/’)  atribute: tip, dimensiune, proprietar, permisiuni, timpul ultimei modificari, etc  eg Unix, comanda uzuala pentru afisarea atributelor $ ls –l director/folder: colectie de fisiere  poate contine alte directoare (subdirectoare)  modalitate de a organiza informatia, uzual de-o maniera ierarhica 16 10/8/2024 Fisiere si directoare (cont.) sistemele tip Unix folosesc o structura ierarhica de directoare  incepe dintr-un director special numit root (radacina), desemnat prin caracterul “/” directoare speciale create automat atunci cand se creeaza un nou director . directorul curent (directorul nou creat) .. directorul parinte (directorul in care a fost inserata o noua intrare corespunzatoare noului director creat)  in cazul directorului radacina (root)./ si../ reprezinta acelasi director, si anume “/” cale (path): secventa de nume de fisiere separate de caracterul /  cai absolute: incep intotdeauna cu /  cai relative: nu incep cu /, fiind interpretate relativ la directorul de lucru curent (current working directory) la login, directorul de lucru curent este setat la valoarea obtinuta din /etc/passwd pentru utilizatorul logat (s.n. home directory) comanda de tiparire a intrarilor intr-un director: /bin/ls  Obs: un program executabil este si el reprezentat printr-o cale in sistemul de fisiere 17 10/8/2024 Sistemul de fisiere componenta speciala a SO care gestioneaza fisierele si directoarele structureaza datele pe disc intr-un anumit format ofera utilizatorului o interfata uniforma de acces la date  eg Unix, ierarhie arborescenta de directoare, cu o radacina comuna SO moderne sunt capabile sa integreze sisteme de fisiere cu format diferit in aceeasi ierarhie de directoare  VFS – Virtual Filesystem Switch (ext3, ext4, ntfs, vfat, etc) devin disponibile utilizatorului ca urmare a operatiei de mount $ mount –t ext4 /dev/sda1 / directorul in care se instaleaza discul formatat s.n. mountpoint /etc/fstab: tabela system-wide cu mountpoint-uri inspectata la bootarea SO  la bootare, mountpoint-urile din tabela se instaleaza ca si cand s-ar fi apelat $ mount -a 18 10/8/2024 Mountpoints 19 10/8/2024 Descriptori de fisiere intregi nenegativi folositi pentru identificarea fisierelor deschise in sistem  alocati de kernel la deschiderea/crearea unui fisier prin program  folositi subsecvent de catre program pentru citirea/scrierea fisierului descriptori speciali  la pornirea oricarui program, shell-ul deschide pentru acesta trei descriptori de fisiere speciali:  0 standard input  1 standard output  2 standard error  uzual, asociati cu terminalul de login (sau terminalul de lucru, intr-un mediu grafic cu multiple X terminale)  /usr/bin/tty afiseaza terminalul asociat unui shell (in general, nu doar terminalul de login) 20 10/8/2024 Redirectarea operatiilor de I/O redirectarea operatiilor de I/O se poate face programatic sau direct din shell shell-ul intelege constructii sintactice de tipul urmator ca fiind redirectari ale operatiilor de I/O [n] < filename redirecteaza citirile de pe descriptorul n catre fisierul desemnat; daca n lipseste, se foloseste stdin filename redirecteaza scrierile pe descriptorul n catre fisierul desemnat; daca n lipseste, se foloseste stdout [n] >> filename adauga scrierile pe descriptorul n la sfarsitul fisierului desemnat (“append”); daca n lipseste, se foloseste stdout 21 10/8/2024 Redirectarea operatiilor de I/O ex: $ echo “redirectarea stdout in fisierul out” > out $ echo “adaugam la sfarsitul fisierului out inca o linie” >> out $ cat < out $ cat > out > mai adaugam o line la sfarsitul fisierului out > EOF $ 22 Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 10/14/2024 Curs 3 - outline interpretorul de comenzi fisiere si directoare (revizitat) 2 10/14/2024 Interpretorul de comenzi (recapitulare) mod de lucru interactiv (comanda-raspuns) sau batch (automatizarea lucrului cu scripturi) in mod interactiv, afiseaza un prompt  indica faptul ca se asteapta o comanda (interna/externa) de la utilizator  uzual, $ sau % pt utilizatori obisnuiti, # pt root  definit de continutul variabilei de mediu PS1 $ echo $PS1  prompt de continuare in variabila de mediu PS2, uzual > $ cat > out > mai adaugam o line la sfarsitul fisierului out > EOF $ 3 10/14/2024 Mediul de lucru (environment) lista de perechi name = value name este numele unei variabile interne a shell-ului  Obs: nu orice variabila interna a shell-ului este variabila de mediu valorile variabilelor influenteaza comportamentul shell-ului, respectiv al comenzilor externe lansate de acesta  setate de SO sau utilizator numele scris cu litere mari: PS1, SHELL, HOME, PATH, etc valoarea dereferentiata cu ajutorul simbolului $, eg $SHELL = /bin/bash 4 10/14/2024 Variabile de mediu setate cu comanda interna export  marcheaza variabila ca fiind variabila de mediu $ export PS1=“my-new-prompt> ” afisate cu comanda /usr/bin/env intr-un program C, accesibile in al treilea parametru al functiei main a programului lansat in executie de catre shell int main(int argc, char* argv[], char *envp[]) 5 10/14/2024 The Bourne-Again SHell /bin/bash, urmasul primului shell istoric, /bin/sh (Bourne Shell) fisiere de configurare  fisiere de start-up inspectate doar la login  system-wide: /etc/profile  locale, in home directory: ~/.profile, ~/.bash_profile, ~/.bash_login  continutul lor e executat automat la login  fisiere de start-up inspectate la crearea fiecarui terminal (rc file, “run commands”)  ~/.bashrc  continutul lor poate fi executat voluntar cu comanda source (sau “.”) source.bashrc..bashrc  fisier de logout: ~/.bash_logout  continutul executat la iesirea din shell (cu exit sau Ctrl-d)  Obs: Ctrl-d in Unix este caracterul EOF, tiparirea Ctrl-d la prompt termina shell-ul istoria comenzilor inregistrata in ~/.bash_history 6 10/14/2024 Structura comenzilor bash pipeline-uri $ cmd1 | cmd2 | … |cmdn # executie paralela a comenzilor $ cmd1 |& cmd2 |& … |& cmdn # “|&” e totuna cu “2>&1 |” liste de comenzi $ cmd1; cmd2; …; cmdn # executie secventiala a comenzilor $ cmd1 && cmd2 && … && cmdn $ cmd1 || cmd2 …. || cmdn variabila bash “?” contine codul de terminare (exit status) al ultimei comenzi executate (valoarea zero inseamna succes) $ echo $? Obs: ? nu e variabila de mediu ! 7 10/14/2024 Job control doua categorii de programe  executate in foreground, au acces R/W la terminal  executate in background comanda incheiata un “&” ruleaza in background  shell-ul returneaza imediat utilizatorului promptul $ cmd & executia unei comenzi in foreground se poate suspenda cu ^Z (Ctrl-z)  de fapt, e semnalul SIGTSTP (kill –SIGTSTP )  executia comenzii poate fi reluata ulterior, fie in foreground, fie in background comanda jobs listeaza procesele (joburile) rulate la momentul curent de shell  joburile identificate prin numar  numarul job-ului poate fi folosit impreuna cu urmatoarele comenzi $ kill %n # termina procesul/job-ul cu nr n $ fg %n # muta in foreground procesul cu nr n $ bg %n # muta jobul n in background $ %n & # muta jobul n in background 8 10/14/2024 Controlul istoriei comenzilor ~/.bash_history exemple !n re-executa comanda cu nr n !-n re-executa comanda curenta – n !string re-executa cea mai recenta comanda care incepe cu string !?string? re-executa cea mai recenta comanda care contine string ^str1^str2 repeta comanda anterioara inlocuind str1 cu str2 interactiv: Ctrl-r urmat de un substring al comenzii cautate din istoric 9 10/14/2024 Comenzi interne: executate direct de catre bash cd alias l=‘ls –l’ fg/bg/kill exit # termina shell-ul cu cod de retur status exec # inlocuieste imaginea bash cu imaginea noului proces # de ex: $ exec firefox externe: programe de pe disc lansate de catre shell pwd echo string ex escape chars: echo –e \a # bell echo –e “aaa\tbbb” # horizontal tab echo –e “aaa\v\bbbb” # vertical tab + backspace echo –e “aaa\t\rbbb” # carriage return echo –e “aaa\t\nbbb” # newline 10 10/14/2024 Tipuri de fisiere fisiere obisnuite (regular files): contin date (text sau binare) directoare: contin numele altor fisiere si informatii despre ele  pot fi citite de catre procesele care au permisiunile potrivite  DOAR kernelul poate scrie in ele ! fisiere speciale, tip device  caracter: pt device-uri caracter (ex: tty, seriala)  bloc: pt device-uri orientate pe bloc (ex: discuri)  operatiile de R/W nu se fac prin intermediul FS ci al driverelor Obs: orice device (echipament) din sistem e fie fisier bloc, fie caracter FIFO: named pipe, mecanism IPC (Inter-Process Communication)  | s.n. anonymous pipes, leaga procese inrudite  conecteaza procese fara legatura  fisiere de pe disc, cu nume si politica de acces FIFO  bidirectionale, spre deosebire de | 11 10/14/2024 Tipuri de fisiere (cont.) socket: abstractie pentru IPC peste retea  canal de comunicatie local (socket Unix, un fel de FIFO)  canal de comunicatie intre masini conectate in retea (socket TCP/IP) link simbolic: fisier care refera un alt fisier  practic fisierul destinatie (link-ul simbolic) contine numele fisierului sursa (fisierul referit) $ ln –s formatul lung al comenzii ls marcheaza in primul caracter tipul fisierului: -, d, c, b, p, s, l comanda generala, distinge si tipuri de fisiere regulate (text, executabile, imagini, etc): $ file 12 10/14/2024 Set UID, set GID fiecare proces (program in executie) are asociat  UID, GID real: identitatea reala a utilizatorului provenita din /etc/passwd  UID, GID efectiv  set-UID, set-GID salvate (copii ale UID/GID efectiv) in mod normal, UID/GID real = UID/GID efectiv cand se executa un program exista posibilitatea de a seta un flag in atributele fisierului executabil a.i.: “pe durata executiei acestui program UID/GID efectiv al procesului devine UID/GID-ul proprietarului fisierului program” Ex: comanda de schimbare a parolei utilizator $ passwd /usr/bin/passwd este un program set-UID la root pt a avea drepturi de scriere in /etc/shadow 13 10/14/2024 Permisiuni de acces la fisiere atribute ale fisierului grupate in trei categorii  permisiuni utilizator: S_IRUSR, S_IWUSR, S_IXUSR  permisiuni grup: S_IRGRP, S_IWGRP, S_IXGRP  permisiuni pt. alti utilizatori: S_IROTH S_IWOTH, S_IXOTH  permisiuni speciale: set-uid, set-gid, sticky bit modificabile din shell cu ajutorul comenzii chmod ex: chmod u+rw , chmod g-x , chmod o-rwx , etc sau in octal chmod 755 , chmod 644 , etc accesul la un fisier: conditionat de combinatia dintre UID efectiv (respectiv GID efectiv) al comenzii executate si bitii de permisiune 14 10/14/2024 umask orice fisier nou creat are setata o masca implicita a permisiunilor  setata cu comanda umask (comanda interna shell) $ umask 022 bitii setati in umask sunt off in permisiunile noului fisier creat de regula, masca setata in fisierele de configurare shell (eg, /etc/profile) 15 10/14/2024 Stergerea fisierelor un fisier poate avea m.m. link-uri la aceeasi structura interna din kernel (i-node)  nume diferite ale aceluiasi fisier  s.n. link-uri hard  create cu comanda ln $ ln  stergerea unui link nu inseamna stergerea fisierului de pe disc !  stergerea ultimului link sterge si fisierul pt. a sterge o intrare de fisier dintr-un director se foloseste rm $ rm stergerea necesita doua permisiuni:  permisiunea de a scrie in director  permisiunea de a cauta in director (bitul x de executie setat in directorul din care stergem fisierul) 16 10/14/2024 Link-uri simbolice limitari link-uri hard  link-ul si fisierul linkat trebuie sa se afle pe acelasi sistem de fisiere (disc formatat)  doar root-ul poate crea linkuri hard catre directoare link simbolic: fisier care contine numele fisierului referit (un string) utilizate pentru a circumventa limitarile link-urilor hard create cu comanda ln si flag-ul –s $ ln –s /etc/profile ~/.system-wide-profile in general, comenzile shell dereferentiaza linkul simbolic  exceptii: lstat, remove, rename, unlink, samd  ex: pt. linkul simbolic creat mai sus $ rm ~/.system-wide-profile # sterge link-ul simbolic, nu sursa, adica /etc/profile $ ls –l ~/.system-wide-profile # afiseaza atributele linkului symbolic, nu ale sursei $ cat ~/.system-wide-profile # afiseaza continutul /etc/profile 17 10/14/2024 Lucrul cu directoare create cu mkdir, sterse cu rmdir $ mkdir $ mkdir –p / # creeaza si directoarele # inexistente on the fly $ rmdir Obs: rmdir nu poate sterge un director decat daca e GOL ! schimbarea directorului curent $ cd # schimba directorul in $ cd #  cd $HOME $ cd - # schimba directorul curent in directorul anterior aflarea directorului de lucru curent (current working directory) $ pwd 18 Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 10/21/2024 Curs 4 - outline fisiere si directoare (epilog) procese inter-process communication semnale 2 10/21/2024 Sumar comenzi utile pt. lucrul cu fisiere mkdir – creeaza directoare rmdir – sterge directoare (cu conditia sa fie goale) touch – creeaza un fisier gol daca nu exista deja mv – muta directoare sau fisiere  redenumeste, nu se face copiere fizica decat daca datele se muta de pe un disc pe altul cp – copiaza (fizic, duplica) directoare (cu –r) sau fisiere  se pot copia directoare/fisiere multiple intr-un director destinatie $ cp …. rm – sterge directoare (cu –r) sau fisiere ln – creeaza linkuri hard sau simbolice mknod – creeaza fisiere speciale tip caracter, bloc sau FIFO $ mknod /dev/sda3 b 8 3 3 10/21/2024 Wildcards caractere speciale interpretate de shell ^ – simbolizeaza inceputul liniei $ – simbolizeaza sfarsitul liniei atom = caracter sau set de caractere grupat cu [ ] sau ( ) * – 0 sau mai multe aparitii ale atomului precedent + – cel putin 1 aparitie a atomului precedent, posibil mai multe ? – cel mult o aparitie a atomului precedent (0 sau 1 aparitii) 4 10/21/2024 Cautarea in fisiere comanda uzuala: grep foloseste tipare si expresii regulate synopsis $ grep optiuni utile -R / -r cautare recursiva (cu/fara dereferentiere linkuri simbolice) -i case insensitive -n tipareste nr liniei pe care s-a gasit expresia -w cauta cu exactitate tiparul furnizat (cuvant, word) -v inverseaza sensul matching-ului (afiseaza liniile care nu se potrivesc) ex: $ grep printf *.c $ grep –v –w printf *.[ch] $ ls –l | grep ^d 5 10/21/2024 Cautarea in directoare comanda uzuala: find synopsis: $ find -name optiuni utile -exec executa comanda specificata asupra elementelor gasite -type limiteaza rezultatele afisate la un anumit tip (eg, fisiere) -iname similar cu –name dar case insensitive -maxdepth limiteaza nivelul de recursivitate ex: $ find / -name hello $ find. –iname \*.o –exec rm {} \; 6 Procese proces = abstractia executiei unui program (instr + date) in fapt, este programul + starea executiei sale la un moment dat (reflectata de registrele CPU si valorile variabilelor din program) identificat prin Process ID (PID) comanda ps afiseaza PID-urilor proceselor aflate in rulare momentan mai multe instante in rulare ale aceluiasi program sunt procese diferite, cu PID-uri diferite executia proceselor este secventiala, nu exista executie paralela a instructiunilor intr- un singur proces mai multe parti  codul program, cunoscut si ca sectiunea de text  starea curenta reflectata de registrele CPU  stiva contine date temporare  parametrii functiilor, adrese de retur, variabile locale  sectiunile de date initializate/neinitializate  contin datele globale  heap-ul contine memoria alocata dinamic de catre program in timpul executiei Imaginea unui program C in memorie variabile de mediu -> program break -> Comunicare inter-procese (IPC) procesele pot fi independente sau cooperante procesele cooperante pot afecta sau pot fi afectate de alte procese, inclusiv prin partajarea datelor motive de cooperare  partajarea informatiei  accelerarea calculului  modularitate  confort procesele cooperante necesite mijloace de comunicare inter-proces (IPC) modele IPC  memorie partajata  schimb de mesaje (message passing) Modele de comunicare (a) Memorie partajata. (b) Message passing. IPC – Message Passing procesele comunica intre ele fara variabile partajate operatii:  send(message)  receive(message) dimensiunea mesajului este fixa sau variabila Tipuri de comunicare directa: procesele isi folosesc identitatea explicit  send (P, message) – trimite un mesaj procesului P  receive(Q, message) – primeste un mesaj de la procesul Q  ex: sockets (canale de comunicatie TCP/IP) indirecta: mesajele sunt trimise si receptionate in/din casute postale (numite si porturi)  fiecare casuta are un ID unic  procesele pot comunica doar daca partajeaza o casuta  operatii  creeaza casuta (port)  trimite si primeste mesaje prin intermediul casutei postale  sterge casuta  primitive de comunicare  send(A, message) – trimite mesaj in casuta postala A  receive(A, message) – primeste mesaj din casuta postala A Sincronizare schimbul de mesaje poate fi blocant sau neblocant modul blocant este considerat sincron  send blocant – transmitatorul e blocat pana cand se primeste mesajul  receive blocant – receptorul e blocat pana cand un mesaj e disponibil modul neblocant este considerat asincron  send neblocant – transmitatorul trimite mesajul si continua  receive neblocant – receptorul primeste:  un mesaj valid, sau  mesaj vid (null) sunt posibile diferite combinatii  daca send si receive sunt ambele blocante, avem un rendezvous Comunicare FIFO in Unix prin pipe-uri anonime sau cu nume pipe-uri anonime  combinatie de comunicare directa/indirecta  procesele cooperante isi cunosc implicit identitatea  comunicare unidirectionala $ cat hello.c| grep printf pipe-uri cu nume (FIFOs)  fisiere speciale cu nume  comunicare indirecta, procesele cooperante nu isi cunosc identitatea  create cu comenzile mknod/mkfifo  odata create, folosite la fel ca fisierele, dar cu politica de acces FIFO $ mknod myfifo p #  mkfifo myfifo $ cat < myfifo & # trebuie sa existe mai intai un # receptor care asteapta date $ echo “write some message in myfifo” > myfifo 10/21/2024 Semnale notificari asincrone ale procesului referitoare la producerea anumitor evenimente  echivalentul software al exceptiilor (HW sau SW) se trimit fie intre procese, fie de catre kernel catre un proces generate din mai multe surse: apel sistem kill(pid, semnal) comanda kill: kill –TERM tastatura: DEL, Ctrl-C, Ctrl-Z, etc anumite evenimente soft si hard generate de kernel ex: terminarea unui proces notificata asincron parintelui cu SIGCHLD procesul care executa o impartire la zero primeste un semnal SIGFPE accesul ilegal la memorie (eg, memorie nealocata) genereaza SIGSEGV reactia procesului la primirea unui semnal depinde de tipul semnalului decizia programului de a trata sau nu evenimentul semnalat 15 10/21/2024 Posibilitati de tratare a semnalelor 1) semnalul e ignorat - specific pt. evenimente care nu rezulta in erori/consecinte majore 2) terminarea programului (semnalul “ucide” procesul) - valabil pt. restul evenimentelor 3) tratarea semnalului cf. indicatiei/dispozitiei programului, despre care se spune ca “prinde” semnalul - se face cu ajutorul unei rutine de tratare a semnalului (handler) Obs: nu orice semnal poate fi “prins” ! Ex: SIGKILL/SIGSTOP nu pot fi prinse, KILL termina invariabil programul $ kill -KILL #  kill -9 16 10/21/2024 Exemple utilizare semnale comanda kill  foloseste un PID identificat in prealabil cu comanda ps $ kill – $ kill –TERM 4899 #  kill 4899 sau kill -15 4899 Obs: numele semnalului poate fi complet, eg, SIGTERM sau prescurtat, eg TERM $ kill –l # afiseaza toate semnalele disponibile $ kill –l 15 # mapeaza nr de semnal in nume semnalele pot fi generate voluntar de catre utilizator  ex: Ctrl-c genereaza SIGINT  uzual termina procesul rulat de shell  daca procesul prinde SIGINT, la apasarea Ctrl-c se executa signal handlerul asociat SIGINT de catre proces (i.e., procesul nu moare automat) $ kill –SIGINT 4899 #  kill -2 4899  Ctrl-z genereaza SIGTSTP  suspenda executia procesului curent (poate fi continuat cu comenzi tip job control, fg/bg) $ kill –SIGTSTP 4899 #  kill -20 4899 17 Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 11/5/2024 Curs 5 - outline programare shell scripturi variabile teste instructiuni conditionale instructiuni iterative si repetitive functii 2 Motivatie de multe ori vrem să avem o singură comandă pentru un sir de comenzi comenzile sunt preponderent comenzi shell sau din sistem, nu operatii logice sau aritmetice dezvoltare rapida pentru programe scurte (in general) in particular, folosite extensiv de sistemele de operare la pornire/oprire (eg, pt servicii) & administrare portabilitate: vrem să functioneze pe si pe alte sisteme pt. automatiza operatii de configurare sau administrare surse: tutoriale internet (eg, CS2043 Unix and Scripting de la Cornell University) Variante Shell sh(1) – Bourne shell printre primele shelluri disponibilă oriunde în /bin/sh functionalitate redusă portabilitate csh(1) – C shell, comenzi apropiate de modul de lucru în C ksh(1) – Korn shell, bazat pe sh(1), succesor csh(1) bash(1) – Bourne Again shell cea mai răspândită există si în Windows 10 , majoritatea scripturilor moderne scrise în bash(1) acest rezultat a dus la o lipsă de portabilitate proiect mare cu multe linii de cod si probleme de securitate , Variabile Shell două tipuri de variabile: locale s,i de mediu variabilele locale există doar în instanta curentă a shell-ului conventie: variabilele locale se notează cu litere mici asignare: x=1 (fără spatii!) x = 1: se interpretează drept comanda x cu argumentele = si 1 folosirea valorii unei variabile se foloseste prin prefixarea numelui cu $ continutul oricărei variabile poate fi afisat cu comanda echo(1) $ x=1 $ echo $x 1 Variabile de mediu folosite de sistem pentru a defini modul de functionare a programelor shell-ul trimite variabilele de mediu proceselor sale copil env(1) – afisează toate variabilele de mediu setate variabile importante $HOME – directorul în care se tin datele utilizatorului curent , $PATH – listă cu directoare în care se caută executabilele $SHELL – programul de shell folosit implicit $EDITOR – programul de editare fisiere implicit $LANG – limba implicită (ex. ro_RO.UTF-8) export(1) – se foloseste pentru a seta o variabilă de mediu printenv(1) – se foloseste pentru a afisa o variabilă de mediu $ ex p o r t V=2 $ p r i n t en v V 2 $ echo $V 2 Variabile locale vs mediu Variabila locala $ V = 2 $ echo $ V 2 $ b a s h bash $ echo $V bash $ Variabila de mediu $ V = 2 $ echo $ V 2 $ export V $ b a s h bash $ echo $V 2 Variable expansion Variabilele pot fi mai mult decât simpli scalari $(cmd) – evaluează întâi comanda cmd, iar rezultatul devine valoarea variabilei $ echo $ ( pwd ) /home/ p a u l $ x=$ ( f i n d. −name \ ∗. c ) $ echo $x. / b a t l e f t. c. / p c i e. c. / max int. c. / e i s a i d. c $((expr)) – evaluează întâi expresia aritmetică + side effects $ x=1 $ echo $ ( ( x + + ) ) $ echo $ ( ( 1 + 1 ) ) 1 2 $ echo $ ( ( x + + ) ) $ echo $ ( ( x + 1 ) ) 2 2 $ echo $ ( ( + + x ) ) $ echo $ ( ( x < 1 ) ) 4 0 Quoting Sirurile de caractere sunt interpretate diferit în functie de citare: Single quotes ‘’ toate caracterele î s i păstrează valoarea caracterul ’ nu poate apărea în sir, nici precedat de "\" exemplu: $ echo ’Am o variabila $x ’ Am o variabila $x Double quotes "" caractere speciale $ ‘ \ (optional ! ) restul caracterelor îsi păstrează valoarea exemplu: $ echo "$USER has home i n $HOME" p a u l has home i n /home/ p a u l Quoting (cont.) Sirurile de caractere sunt interpretate diferit în functie de citare: Back quotes ` – functionează ca $() $ echo " Today i s `date ` " Today i s Wed May 2 1 8: 00 : 0 8 E ES T 2018 Înlăntuirea comenzilor cmd1; cmd2 – înlăntuire secventială, cmd2 imediat după cmd1 cmd1 | f i l t r u | cmd2 – iesirea comenzii din stânga este intrarea celei din dreapta operatorului | cmd1 && cmd2 – execută a doua comandă doar dacă prima s-a executat cu succes cmd1 | | cmd2 – execută a doua comandă doar dacă prima a esuat exemplu: $ mkdir a c te && mv ∗. docx a c te / $ l s −lR | t ee f i l e s. l s t | wc −l $ s s h example. org || echo " Con n ection f a i l e d !" Scripting Script = program scris pentru un mediu run-time specific care automatizează executia comenzilor ce ar putea fi executate alternativ manual de către un operator uman. nu necesită compilare executia se face direct din codul sursă de acea programele ce execută scriptul se numesc interpretoare în loc de compilatoare exemple: perl, ruby, python, sed, awk, ksh, csh, bash Indicii de interpretare semnalate cu ajutorul string-ului #! pe prima linie a scriptului are forma #!/path/to/interpreter exemple: #!/bin/sh, #!/usr/bin/python pentru portabilitate folositi env(1) pentru a găsi unde este instalat interpretorul exemple: #!/usr/bin/env ruby, #!/usr/bin/env perl oriunde altundeva în script # este interpretat ca început de comentariu s,i restul linei este ignorată (echivalent // în C) introdusă de Denis Ritchie circa 1979 Exemplu: hello.sh 1. Scriem f i s ierul hello.sh cu comenzile dorite # ! / b i n / sh # S a l u t e the u s er echo " Hello , $USER! " 2. Permitem executia: chmod +x hello.sh 3. Executăm: $. / h e l l o. sh Hello , p a u l ! Alternativ: $ s h h e l l o. sh # nu necesita permisiunea de executie Variabile speciale în scripturi $1, $2,..., ${10}, ${11},... – argumentele în ordinea primită dacă numărul argumentului are mai mult de două cifre, trebuie pus între acolade $0 – numele scriptului (ex. hello.sh) $# – numărul de argumente primite $* – toate argumentele scrise ca "$1 $2... $n" $@ – toate argumentele scrise ca "$1" "$2"... "$n" $? – valoarea iesirii ultimei comenzi executate $$ – ID-ul procesului curent $ ! – ID-ul ultimului proces suspendat din executie shiftarea parametrilor pozitionali la stanga: comanda shift Exemple: argumente script add.sh – adună două numere # ! / b i n / sh echo $ ( ( $1 + $2 ) ) apel: $ sh add. sh 1 2 3 Varianta add2.sh: # ! / b i n / sh sum = $1 shift echo $ ( ( $sum + $1 ) ) Exemple: argumente script tolower.sh – imită funct,ia din C tolower(3) # ! / b i n / sh t r ’ [A−Z ] ’ ’ [ a−z ] ’ < $1 > $2 apel: $ echo "WHERE ARE YOU?" > scre a mi n g. t x t $. / t o l o wer. sh scr ea m i n g. t x t decent. t x t $ ca t decent. t x t where a r e you ? Blocuri de control Pentru scripturi mai complexe avem nevoie, ca în orice limbaj, de blocuri de control conditionale – i f , te s t [ ], case iterative – for, while, until comparative – -ne, - l t , -g t functii – function i esiri – break, continue, return, exit If cuvinte cheie: if, then, elif, else, fi ex: if test-cmd then cmds elif test-cmd then cmds else cmds fi rezultatul test-cmd apare in $? (0 –> true, !=0 ->false) Exemplu: if Caută în fisier date s,i le adaugă dacă nu le găseste # ! / b i n / sh i f grep " $1 " $2 > / dev / n u l l then echo " $1 found i n f i l e $2 " el s e echo " $1 not found i n f i l e $2 , a p p e n d i n g " echo " $1 " > > $2 fi apel: $. / t e x t. sh who d ece n t. t x t who not found i n f i l e d ece n t. t x t , appending $ ca t d ece n t. t x t where a r e you ? who test sau [ ] nu dorim să testăm tot timpul executia unei comenzi există expresii pentru a compara sau verifica variabile te s t expr – evaluează valoarea de adevăr a lui expr [ expr ] – efectuează aceiasi operatie (atentie la spatii!) [ este comanda interna $ type [ [ is a shell builtin expresiile pot fi legate logic prin [ expr1 -a expr2 ] – conjunctie [ expr1 -o expr2 ] – disjunctie [ ! expr ] – negatie Expresii test: numere [ n1 -eq n2 ] – n1 = n2 [ n1 -ne n2 ] – n1 /= n2 [ n1 -ge n2 ] – n1 ≥ n2 [ n1 -g t n2 ] – n1 > n2 [ n1 - l e n2 ] – n1 ≤ n2 [ n1 - l t n2 ] – n1 < n2 Expresii test: siruri de caractere [ s t r ] – s t r are lungime diferită de 0 [ -n s t r ] – s t r nu e gol [ -z s t r ] – s t r e gol ("") [ str1 = str2 ] – stringuri identice [ str1 == str2 ] – stringuri identice [ str1 != str2 ] – stringuri diferite Expresii test: fisiere -e path – verifică dacă există calea path - f path – verifică dacă path este un fisier obisnuit -d path – verifică dacă path este un director - r path – verifică dacă aveti permisiunea de a citi path -w path – verifică dacă aveti permisiunea de a scrie path -x path – verifică dacă aveti permisiunea de a executa path while execută blocul cât timp comanda cmd se execută cu succes wh i l e cmd do cmd1 cmd2 done în loc de comandă putem avea o expresie de test într-o singură linie: while cmd; do cmd1; cmd2; done Exemplu: while Afisează toate numerele de la 1 la 10: i =1 wh i l e [ $ i −l e 10 ] do echo " $ i " i=$ ( ( $ i + 1 ) ) done Sau într-o singură linie: i=1; while [ $ i - l e 10 ] ; do echo " $ i " ; i=$(($i+1)); done until execută blocul cât timp comanda cmd se execută fără succes u n t i l cmd do cmd1 cmd2 done în loc de comandă putem avea o expresie de test într-o singură linie: u n t il cmd; do cmd1 ; cmd2; done for for execută blocul pentru fiecare valoare din listă f or var i n st r1 str2... strN do cmd1 cmd2 … done var ia pe rând valoarea str 1 , pe urmă str 2 până la strN de regulă comenzile din bloc (cmd1, cmd2) sunt legate de var comanda for are mai multe forme, aceasta este cea mai întâlnită într-o singură linie: for var in str 1 str 2... str N ; do cmd1 cmd2; done Exemplu: for Compileză toate fisierele C din directorul curent f o r f i n ∗. c do echo " $f " cc $f −o $f. out done Sau într-o singură linie: for f in *. c ; do echo " $ f " ; cc $f -o $ f. o u t ; done for traditional formă întâlnite doar în unele shell-uri, nu este portabil execută blocul urmând o sintaxă similară C for (( i =1; i $hostfile } # aici incepe scriptul hostfile=$1 echo “Start script” add_host 80.96.21.88 fmi.unibuc.ro fmi add_host 80.96.21.209 www.unibuc.ro www Obs: add_host parsata de shell si verificata sintaxa, dar executata doar la apelare Scope-ul variabilelor cu exceptia parametrilor, nu exista scope pt variabile e.g. scope.sh #!/bin/sh somefn() { echo “Function call parameters are $@” a=10 } echo “script arguments are $@” a=11 echo “a is $a” somefn first string next echo “a is $a” Apel: $./scope.sh 1 2 3 script arguments are 1 2 3 a is 11 Function call parameters are first string next a is 10 Recursivitate factorial.sh: #!/bin/sh factorial() { if [ “$1” –gt “1” ]; then prev=`expr $1 – 1` rec=`factorial $prev` val=`expr $1 \* $rec` echo $val else echo 1 fi } echo –n “Input some number: ” read n factorial $n Biblioteci de functii colectie de functii grupate intr-un fisier CARE NU INCEPE cu linia speciala #! ! se pot defini variabile globale “apelul” propriu-zis se face folosind comanda source e.g., renamelib.sh: MSG=“Renaming files …” rename() { mv $1 $2 } Apelul functiei de biblioteca in scriptul libcall.sh: #!/bin/sh../renamelib.sh # echivalent cu “source./renamelib.sh” echo $MSG rename $1 $2 Coduri de retur #!/bin/sh add_host() { if [ “$#” -eq “0” ]; then return 1 fi IP_ADDR=$1 HOSTNAME=$2 shift; shift; ALIASES=$@ echo “$IP_ADDR \t $HOSTNAME \t $ALIASES” >> $hostfile } hostfile=$1 echo “Start script” add_host RET_CODE=$? if [ “$RET_CODE” –eq “1” ]; then echo “No arguments to the add_host call !” fi read citeste una sau mai multe variabile din stdin sintaxă: read var1 var2... varN $ read x y 1 2 $ echo $x $y 1 2 fara nici o variabilă, pune tot rezultatul în $REPLY $ read h el l o $ echo $REPLY h el l o citire line cu linie dintr-un fisier: cat f o o. t x t | while read LINE; do echo $LINE; done Depanare Pentru a depana un script apelati-l cu shell-ul folosit si optiunea -x. Comenzile executate apar pe ecran prefixate cu +. $ sh −x t o l o wer. sh s cr ea m i ng. t x t decent. t x t + t r [A−Z ] [ a−z ] + < scr ea min g. t x t + > decent. t x t Instrumente si Tehnici de Baza in Informatica Semestrul I 2024-2025 Vlad Olaru 11/12/2024 Curs 7 - outline filtre editarea automata a textelor procesarea automata a textelor 2 Procesare text: cmd1 | filtru | cmd2 Vocabular filtru – program, comandă, operatie care procesează iesirea în format text a unei comenzi astfel încât noua formă să poată fi procesată mai departe de utilizator sau de un alt program linie – sir de caractere care se termină cu \n (sau \r\n în Windows) separator (sau delimitator) – caracter sau sir folosit pentru a delimita datele într-o linie câmp (field) – un subsir dintr-o linie care reprezintă un anumit tip de date exemplu: linie: nume prenume grupă s e r i e separator: " " câmpuri: nume, prenume, grupă si serie cut(1) cut(1) extrage câmpuri din fiecare linie primită la intrare l i s t – numere sau intervale separate de virgulă sau spatii -b l i s t – lista contine pozitii în bytes -c l i s t – lista contine pozitiile caracterelor - f l i s t – lista specifică câmpuri -d delim – specifică delimitatorul pentru câmpuri (implicit este \t) -n – nu împarte caractere multi-byte în bytes - s – sare peste liniile care nu contin delimitatoare Tipuri de apel cut -b [-n ] l i s t [ f i l e... ] cut -c l i s t [ f i l e... ] cut - f l i s t [ - s ] [-d delim] [ f i l e... ] Exemple: cut(1) Afisează numele s,i shellurile folosite de utilizatorii din sistem: $ c u t - d : - f 1, 7 / e t c / passwd nobody : / s b i n / n o l o g i n p a u l : / b i n / ksh b u i l d : / b i n / ksh j o e : / b i n / ksh _mysql : / s b i n / n o l o g i n _ p o s t g r e s q l : / b i n / sh s o u s e r : / b i n / ksh a l e x : / b i n / ksh Exemple: cut(1) Arată numele si data la care s-au logat utilizatorii activi: $ who | c u t - c 1 - 8 , 1 8 - 30 d e ra a d t May 8 18:32 dlg May 3 20:39 jsing Apr 28 06:47 landry Apr 19 14:22 d e ra a d t Apr 19 08:24 kettenis May 9 02:47 d e ra a d t May 3 22:18 pirofti May 9 04:36 paste(1) Lipeste fisierele primite la intrare pe coloane (pe verticală) -d l i s t – foloseste delimitatorul pentru a înlocui caracterul linie nouă \n din fiecare fisier - s – serializare - – reprezintă intrarea standard (stdin) Apel paste [ - s ] [-d l i s t ] f i l e... Exemplu: paste(1) Fie fisierele cu nume s,i prenume: $ echo " P a u l \ nA l e x \ nAna " > f i r s t n a m e s. t x t $ echo " I r o f t i \ nA l e x a n d r e s c u \ nPopescu " \ > lastnames. txt Implicit, paste(1) lipeste numele de prenume $ paste firstnames. txt lastnames. txt Paul Irofti Alex A l e xa n d re s c u Ana Popescu Acelasi lucru dar cu serializare $ paste - s f i r s t n a m e s. t x t la s tna m e s. tx t Paul Alex Ana Irofti A l e xa n d re s c u Popescu Exemplu: paste(1) Afisează fisierele din directorul curent pe trei coloane: $ l s | paste - - - 1 10 11 2 3 4 5 6 7 8 9 intro Identic cu apelul l s | paste - s -d ’ \ t \ t \ n’ - Crează o listă de directoare bin din sistem separate prin : $ f i n d / - name b i n - t y p e d | p a s t e - s - d : - / u s r / X11R6 / b i n : / u s r / l o c a l / b i n : / u s r / l o c a l / l i b / qt4 / b i n :... split(1) Împarte fisierul dat în mai multe fisiere de 1000 de linii fiecare. -a suffix_length – câte litere să contină sufixul noilor fisiere -b byte_count – crează fisiere de lungimea dată în bytes - l line_count – crează fisiere cu numărul de linii dat f i l e – fisierul de împărtit, implicit este stdin name – prefixul pentru noile fisiere Apel s p l i t [options] [ f i l e [name]] Implicit crează fisierele xaa, xab, xac,... Exemplu: split(1) Împarte fisierul LaTeX în mai multe fisiere de 100 de linii: $ wc - l fisier. tex 362 fisier. tex $ s p l i t - l 100 fisier. tex $ l s x* xaa xab xac xad $ wc - l x* 100 xaa 100 xab 100 xac 62 xad 362 t o t a l Acelasi lucru dar cu prefix fisier s,i o singură literă sufix: $ split -a 1 -l 100 fisier. t e x fisier join(1) Alăturează linii care contin chei identice din două fisiere diferite f i l e 1 , f i l e 2 – fisierele de intrare -1 f i e l d – câmpul cheie din fisierul 1 -2 f i e l d – câmpul cheie din fisierul 2 -a file_number – produce o linie pentru fiecare nepotrivire din fisierul dat (1 sau 2) Apel join [-1 f i e l d ] [-2 f i e l d ] [options] f i l e 1 f i l e 2 Exemplu: join(1) Alătură persoanele pentru care exista date legate de vârstă s,i venit: $ cat age. txt Pa u l 33 A l e x 40 Ana 25 $ c a t income. t x t Pa u l 3000 Ana 4500 $ j o i n a g e. t x t income. t x t Pa u l 33 3000 Ana 25 4500 Acelasi lucru dar include si persoanele (ex. Alex) fără venit: $ j o i n - a1 a g e. t x t income. t x t Basic Calculator – bc(1) Calculator pentru operatii aritmetice s,i logice - l – permite operatii cu numere în virgulă mobilă -e expr – evaluează expresia, pot fi mai multe f i l e – preia expresii din fisier operatorii binari sunt la fel ca in C operatorii logici &&, | | si ! sunt disponibili în unele implementări dar nu sunt specificati de standardul POSIX reprezintă un limbaj de sine stătător cu blocuri de control (ex. while) implicit porneste un shell specializat si asteaptă comenzi Apel bc [ - l ] [ -e expr] [ f i l e ] bc(1) – functii s(x) – sinus c(x) – cosinus e(x) – exponent l ( x ) – logaritm a(x) – arctangent sqrt(x) – radical scale=n – precizie, n numere zecimale quit – terminare program Exemplu: bc(1) Operatii de bază: $ echo " 1 / 3 " | bc 0 $ echo " 1 / 3 " | bc - l.33333333333333333333 $ echo "1 >3" | bc - l 0 $ echo "1 myfor−l o o p. sh #!/ b i n / bash for i in 1 2 3 4 5 do echo ” I t e r a t i a cu numarul $ i ” done $ chmod u+x myfor−l o o p. sh $. / myfor−l o o p. sh I t e r a t i a cu numarul 1 I t e r a t i a cu numarul 2 I t e r a t i a cu numarul 3 I t e r a t i a cu numarul 4 I t e r a t i a cu numarul 5 7 $ Observati ca do si done, cuvinte cheie ale instructiunii for trebuie sa apara pe o linie separata chiar la inceputul ei. Daca modificati scriptul si mutati cuvantul cheie do pe aceeasi linie cu for la executia scriptului veti obtine o eroare de sintaxa. Puteti repara aceasta eroare folosind caracterul special ; care uneste doua linii: #!/ b i n / bash f o r i i n 1 2 3 4 5 ; do echo ” I t e r a t i a cu numarul $ i ” done Valorile din lista pot fi practic orice. De pilda, incercati sa executati urma- torul script, pe care-l puteti salva in fisierul myfor-loop2.sh: #!/ b i n / bash f o r i i n math 1. 5 * 2 done do echo ” V a l o a r e a l u i i e s t e $ i ” done Ca sa intelegeti comportamentul instructiunii for in acest caz este important sa va reamintiti de interpretarea wildcard-urilor in bash prezentata la curs. Incercati sa rulati scriptul de mai sus cu si fara *. Dar daca folositi escape character \* ? Si daca folositi \*, ce se intampla daca in corpul instructiunii for afisati valoarea variabilei i fara sa o includeti in ghilimele (ca mai jos)? echo V a l o a r e a l u i i e s t e $ i 3.2 While loops Instructiunea while este cel mai adesea folosita impreuna cu comanda test, ca in exemplul de mai jos pe care il puteti salva in fisierul while.sh: #!/ b i n / bash w h i l e [ ” $ {INPUT STRING:− h e l l o }” != ” bye ” ] do echo ” I n t r o d u c e t i d a t e ( bye p e n t r u a i e s i d i n b u c l a ) ” r e a d INPUT STRING echo ” Ati i n t r o d u s : $INPUT STRING” done Scriptul de mai sus citeste siruri de caractere de la tastatura in bucla pana cand se tipareste ”bye”. Ce se intampla daca variabila INPUT STRING nu are valoare intiala? Scriptul de mai sus se poate modifica in urmatoarea varianta (while2.sh) care nu foloseste comanda test ci caracterul ”:” (echivalent cu comanda true) care intoarce permanent valoarea de adevar: 8 #!/ b i n / bash while : do echo ” I n t r o d u c e t i d a t e ( C t r l −C p e n t r u a i e s i d i n b u c l a ) ” r e a d INPUT STRING echo ” Ati i n t r o d u s : $INPUT STRING” done De asemenea, instructiunea while se foloseste des impreuna cu read. Ca exemplu aveti scriptul de mai jos (while3.sh), care modifica scriptul anterior case.sh pentru a permite introducerea de nume de fisiere in mod repetitiv: #!/ b i n / bash echo −n ” P l e a s e i n p u t a f i l e n a m e : ” while read filename do l o n g f o r m a t=` l s −l d $ f i l e n a m e 2> / dev / n u l l ` case ”${ longformat : 0 : 1 } ” in −) echo ” $ f i l e n a m e i s a r e g u l a r f i l e ” ;; d) echo ” $ f i l e n a m e i s a d i r e c t o r y ” ;; b) echo ” $ f i l e n a m e i s a b l o c k f i l e ” ;; c) echo ” $ f i l e n a m e i s a c h a r a c t e r f i l e ” ;; *) echo ” Sorry , I don ' t know a n y t h i n g about $ f i l e n a m e ” ;; esac echo −n ” P l e a s e i n p u t a f i l e n a m e : ” done Puteti incheia introducerea datelor cu Ctrl-d sau sa terminati programul cu Ctrl-c. 4 Mai multe despre variabile Pe langa variabilele shell-ului (variabile interne si variabile de mediu) exista un set de variabile speciale care de cele mai multe ori nu pot fi modificate. Primul set de variabile de interes este cel al variabilelor 0, 1,... 9. Variabila $0 de pilda reprezinta numele programului, numit in general basename, in vreme 9 ce restul variabilelor pana la 9, $1, $2,..., $9 reprezinta parametrii cu care a fost apelat scriptul. Variabila @ reprezinta acesti parametri, al caror numar exact este stocat in variabila #. Pentru intelegera mai buna a acestor aspecte, rulati urmatorul script param.sh: #!/ b i n / sh echo ” I was c a l l e d with $# p a r a m e t e r s ” echo ”My name i s $ 0 ” echo ”My n i c e r name i s ‘ basename $ 0 ‘ ” echo ”My f i r s t parameter i s $ 1 ” echo ”My s e c o n d parameter i s $ 2 ” echo ” A l l p a r a m e t e r s a r e $@” Comanda externa basename este folosita pentru a elimina calea din numele scriptului. Iata aici rezultatele unei posibile rulari: $. / param. sh I was c a l l e d with 0 p a r a m e t e r s My name i s. / param. sh My n i c e r name i s param. sh My f i r s t parameter i s My s e c o n d parameter i s All parameters are $. / param. sh f i r s t s e c o n d t h i r d f o u r t h I was c a l l e d with 4 p a r a m e t e r s My name i s. / param. sh My n i c e r name i s param. sh My f i r s t parameter i s f i r s t My s e c o n d parameter i s s e c o n d All parameters are f i r s t second t h i r d fourth $ Cu ajutorul comenzii shift se pot folosi mai mult de 9 parametri in linia de comanda. Scriptul urmator, param2.sh, evidentiaza functia comenzii shift care, atunci cand e apelata, itereaza printre parametrii de apel ai scriptului (”shifteaza” parametrii la stanga). Pe masura ce se shifteaza parametrii, numa- rul lor, continut in variabila $#, scade. #!/ b i n / sh w h i l e [ ” $#” −g t ”0” ] do echo ”\ $ 1 i s $ 1 ” shift done Rezultatul executiei comenzii demonstreaza felul in care se pot accesa toti parametrii de apel, indiferent de numarul lor: 10 $. / param2. sh 1 2 3 4 $ 1 ( f i r s t parameter ) i s 1 $ 1 ( f i r s t parameter ) i s 2 $ 1 ( f i r s t parameter ) i s 3 $ 1 ( f i r s t parameter ) i s 4 $ In final, asa cum am discutat la curs si in laboratoarele anterioare, variabila ? contine valoarea codului de retur cu care s-a incheiat comanda anterioara. Valoarea acestui cod de retur se poate folosi pentru a notifica utilizatorul in privinta rezultatului executiei unei comenzi ca in scriptul de mai jos (retur.sh): #!/ b i n / sh r e a d cmd e v a l ” $cmd” 2> / dev / n u l l i f [ ” $ ?” −ne ”0” ] ; then echo ” $cmd has f a i l e d ! ” fi Comanda interna shell eval evalueaza stringul furnizat ca argument drept comanda si intoarce codul de return al acestei comenzi. Iata cateva exemple de rulare: $. / r e t u r. sh somecmd somecmd has f a i l e d ! $. / r e t u r. sh [ ”0” −g t ”1” ] [ ”0” −g t ”1” ] has f a i l e d ! $ 5 Sarcini de laborator 1. Executat, i toate comenzile prezentate ı̂n acest laborator. 2. Modificati unele din scripturile de la laborator pentru a primi datele ne- cesare ca parametri in linie de comanda, in loc sa fie citite de la tastatura (eg, scripturile care identifica tipuri de fisiere). 3. Scrieti propria versiune a comenzii ls fara nici un parametru (adica pentru a lista continutul directorului curent). 4. Scrieti un script care foloseste o comanda de tip pipeline pentru a afisa utilizatorii si PID-urile proceselor lor asa cum sunt afisate de comanda ps auxw. Scriptul trebuie sa captureze intr-un pipe outputul comenzii ps auxw si sa itereze prin fiecare linie tiparind primele doua campuri ale outputului, cele care corespund utilizatorului si PID-ului. 11 5. Scrieti un script myfind care emuleaza comportamentul simplificat al co- menzii find cu flagurile -name, -type si -exec. Comanda primeste ca prim parametru un director si nu functioneaza recursiv (i.e., maxdepth = 1). Trebuie sa fie capabila sa gaseasca un fisier dupa nume si/sau tip si odata identificat sa poata executa o comanda asupra lui. Numele, tipul si co- manda de executie sunt furnizate ca parametrii in linia de comanda, exact ca pentru comanda find (man find). 12 Laboratorul 6 Lucrul ı̂n ret, ea 1 Retele de calculatoare O retea de calculatoare presupune conectarea fizica a mai multor calculatoare numite si noduri (prin analogie cu grafurile, retelele pot fi modelate si anali- zate teoretic folosind teoria grafurilor) sau host-uri cu ajutorul unor medii de comunicare. Comunicarea efectiva dintre calculatoare folosind aceste medii de comunicare presupune doua premize fundamentale: calculatoarele implicate in comunicare trebuie sa se poate identifica unul pe altul si respectiv trebuie sa se poata ”intelege” unul cu altul. Prima premiza este asigurata prin asignarea unei adrese de retea fiecarui calculator. Cea de-a doua este realizata cu ajuto- rul protocoalelor de comunicatie. In mod uzual, acestea determina si modul de adresare. In cazul Internetului, protocoalele de comunicatie sunt denumite generic TCP/IP, desi in fapt e vorba de o suita de protocoale. Adresele asignate calcu- latoarelor se numesc adrese IP (Internet Protocol) si sunt folosite de protocoalele de comunicatie. O adresa de IP este compusa din 4 octeti separati de punct, de exemplu 192.168.0.1. Odata identificat, un calculator poate oferi o multitudine de servicii: web, mail, transfer de fisiere, etc. TCP/IP identifica aceste servicii prin porturi cu numere: 80 pentru web, 25 pentru mail, 21 pentru transfer de fisiere, samd. Ele se numesc well-known ports pentru ca sunt public cunoscute de toata lumea (ca intr-o carte de telefoane). O lista de well-known ports in sistemele Unix se poate gasi in fisierul /etc/services. 2 Domenii Desi stau la baza comunicarii in internet, adresele de IP sunt mai rar folosite direct, calculatoarele avand in general un nume lizibil, e.g. www.google.com, care este asociat cu adresa lor de IP. Servere specializate numite Domanin Name Servers (DNS), accesibile printr-un protocol de comunicatie special disponibil ca serviciu pe portul 53, raspund cererilor pe care alte calculatoare conectate la 1 internet, uzual definite ca fiind calculatoare client (sau pe scurt, clienti), le fac pentru a afla fie numele unui calculator data fiind adresa sa de IP, fie adresa de IP a unui calculator cunoscut dupa numele sau. Concret, pentru a obt, ine adresa de IP asociata unui host putem folosi mai multe metode. Comanda nslookup(1) (name server look-up) primes, te ca prim argument numele host-ului, asa-numitul Fully Qualified Domain Name sau FDQN, s, i, opt, ional, un al doilea argument care specifică ce server DNS să folosească pentru a căuta informat, ia. $ n s l o o k u p fmi. unibuc. r o Server : 213.154.124.1 Address : 213.154.124.1#53 Non−a u t h o r i t a t i v e answer : Name : fmi. unibuc. r o Address : 1 9 3. 2 2 6. 5 1. 6 În prima parte sunt afis, ate date legate de server-ul DNS folosit. A doua parte oferă informat, iile cerute: numele s, i adresa. Dacă dorim să ı̂ntrebăm un server anume (ı̂n exemplul de mai jos server-ul Google) ı̂i punem adresa ı̂n al doilea argument: $ n s l o o k u p fmi. unibuc. r o 8. 8. 8. 8 Server : 8.8.8.8 Address : 8.8.8.8#53 Non−a u t h o r i t a t i v e answer : Name : fmi. unibuc. r o Address : 1 9 3. 2 2 6. 5 1. 6 Comanda nslookup poate fi lansata si in mod interactiv, caz in care ofera o mica linie de comanda care permite executia anumitor instructiuni, dupa cum se poate vedea mai jos: $ nslookup > server Default server : 1 27. 0. 1.1 Address : 1 2 7. 0. 1. 1 # 5 3 > server 1.1.1.1 Default server : 1. 1. 1. 1 Address : 1. 1. 1. 1 # 5 3 > s e t type=p t r > 8.8.8.8 Server : 1.1.1.1 Address : 1.1.1.1#53 Non−a u t h o r i t a t i v e answer : 8. 8. 8. 8. in−addr. arpa name = dns. g o o g l e. 2 A u t h o r i t a t i v e a ns w er s can be found from : > s e t type=a > dns. g o o g l e Server : 1.1.1.1 Address : 1.1.1.1#53 Non−a u t h o r i t a t i v e answer : Name : dns. g o o g l e Address : 8. 8. 4. 4 Name : dns. g o o g l e Address : 8. 8. 8. 8 > s e t type=ns > g o o g l e. com Server : 1.1.1.1 Address : 1.1.1.1#53 Non−a u t h o r i t a t i v e answer : g o o g l e. com nameserver = ns1. g o o g l e. com. g o o g l e. com nameserver = ns2. g o o g l e. com. g o o g l e. com nameserver = ns3. g o o g l e. com. g o o g l e. com nameserver = ns4. g o o g l e. com. A u t h o r i t a t i v e a ns w er s can be found from : > s e t type=mx > g o o g l e. com Server : 1.1.1.1 Address : 1.1.1.1#53 Non−a u t h o r i t a t i v e answer : g o o g l e. com m a i l e x c h a n g e r = 10 smtp. g o o g l e. com. A u t h o r i t a t i v e a ns w er s can be found from : > exit Comanda server tipareste numele serverului la care apeleaza nslookup mo- mentan pentru a rezolva cereri de DNS. Daca primeste ca parametru o adresa de IP sau un FDQN (Fully Qualified Domanin Name) a unui server DNS, va schimba adresa serverului DNS la care nslookup apeleaza. Comanda set in con- junctie cu parametrul type permite efectuarea de query-uri de FDQN (type A) care returneaza adresa IP corespunzatoare, query-uri de adrese IP (type PTR) care returneaza FDQN-ul corespunzator, query-uri pentru a afla serverul de DNS responsabil pt un anumit domeniu (type NS) sau pentru a afla serverul de mail (type MX) responsabil pentru un anumit domeniu. Alte comenzi utile care funct, ionează similar sunt: dig(1): $ dig @8.8.8.8 fmi.unibuc.ro – server-ul DNS trebuie prefi- 3 xat cu @ host(1): $ host fmi.unibuc.ro 8.8.8.8 – server-ul DNS apare la sfar- situl comenzii whois(1): $ whois unibuc.ro – informat, ii despre domeniul principal, nu despre subdomeniul fmi) Pentru a vedea dacă un host este accesibil in ret, ea putem folosi comanda ping(1). Faceti distinctia intre conectare si accesibilitate. Un calculator poate fi fizic conectat la retea, dar temporar inaccesibil, fie din cauza unor defecte (hardware sau software) locale pe host fie din cauza unor defecte in reteaua din care face parte. De asemenea, se intampla adesea ca un host sa fie temporar inaccesibil pentru mentenanta. ping nu spune decat daca la momentul executiei comenzii host-ul este accesibil (se mai spune si online) sau nu. $ p i n g fmi. unibuc. r o PING fmi. unibuc. r o ( 1 9 3. 2 2 6. 5 1. 6 ) : 56 data b y t e s 64 b y t e s from 1 9 3. 2 2 6. 5 1. 6 : i c m p s e q=0 t t l =50 time =7.317 ms 64 b y t e s from 1 9 3. 2 2 6. 5 1. 6 : i c m p s e q=1 t t l =50 time =7.053 ms 64 b y t e s from 1 9 3. 2 2 6. 5 1. 6 : i c m p s e q=2 t t l =50 time =6.925 ms ˆC −−− fmi. unibuc. r o p i n g s t a t i s t i c s −−− 3 p a c k e t s t r a n s m i t t e d , 3 p a c k e t s r e c e i v e d , 0.0% p a c k e t l o s s round−t r i p min/ avg /max/ std−dev = 6. 9 2 5 / 7. 0 9 8 / 7. 3 1 7 / 0. 1 6 3 ms Observat, i că această comandă ı̂ntâi găses, te adresa host-ului s, i apoi comunică direct cu IP-ul acestuia. In Unix, dacă nu se specifică un număr de ı̂ncercări, comanda va ı̂ncerca până când utilizatorul o opres, te cu Ctrl-C. În Windows, comanda ı̂ncearcă de 4 ori implicit după care se opres, te. O alta comanda utila atunci cand vreti sa obtineti mai multe informatii despre accesibilitatea unui nod de retea din internet este traceroute. De pilda, daca vreti sa stiti peste cate hop-uri trece un pachet trimis de masina locala ca mai sus in comanda nslookup catre serverul DNS public al Google, puteti folosi comanda de mai jos: $ traceroute 8.8.8.8 t r a c e r o u t e t o 8. 8. 8. 8 ( 8. 8. 8. 8 ) , 30 hops max , 60 byte p a c k e t s 1 gateway ( 1 9 2. 1 6 8. 1 0 0. 1 ) 0. 8 3 7 ms 0. 8 0 9 ms 7. 8 9 8 ms 2 10.0.33.143 (10.0.33.143) 5. 8 2 9 ms 5. 7 9 6 ms 5. 8 8 0 ms 3 10.12.100.1 (10.12.100.1) 5. 8 3 9 ms 5. 9 1 2 ms 5. 8 7 1 ms 4 10.220.187.54 (10.220.187.54) 5. 9 0 5 ms 5. 8 6 9 ms 5. 9 3 1 ms 5 10.220.208.244 (10.220.208.244) 1 9. 8 3 9 ms 2 0. 1 2 2 ms 4 5. 2 2 5 ms 6 72.14.216.212 (72.14.216.212) 2 5. 0 5 5 ms 2 0 9. 8 5. 1 6 8. 1 8 2 ( 2 0 9. 8 5. 1 6 8. 1 8 2 ) 1 8. 4 4 7 ms 1 6. 0 4 1 ms 7 ∗ ∗ 172.253.65.251 (172.253.65.251) 2 1. 7 8 8 ms 8 dns. g o o g l e ( 8. 8. 8. 8 ) 1 9. 2 5 3 ms 1 4 2. 2 5 1. 6 5. 2 1 7 ( 1 4 2. 2 5 1. 6 5. 2 1 7 ) 2 2. 2 4 9 ms 2 0 9. 8 5. 2 4 4. 1 4 7 ( 2 0 9. 8 5. 2 4 4. 1 4 7 ) 1 9. 8 0 4 ms Dupa cum observati, in cazul calculatorului de pe care a pornit comanda a fost nevoie sa se treaca de 7 routere pana sa se ajunga la destinatie (dns.google). Aceste routere intermediare se numesc in limbaj colocvial hop-uri. 4 Fis, ierul /etc/hosts este folosit pentru a defini manual perechi adresă IP – nume. In momentul in care se fac query-uri de DNS, clientul local DNS de pe calculator (asa numitul DNS resolver) cerceteaza fisierul /etc/nsswitch.conf pentru a detecta ordinea in care se cauta un server care sa rezolve cererea. In general, campul hosts al fisierului /etc/nsswitch.conf precizeaza ordinea de mai jos: hosts : f i l e s dns Aceasta sintaxa ne spune ca in general fisierele locale (files), in cazul nos- tru /etc/hosts, sunt chestionate prioritar pentru rezolvarea numelui inaintea serverelor DNS. In cazul in care fisierul /etc/hosts contine rezolvarea dorita a numelui, DNS resolver-ul intoarce rezultatul gasit. Daca nu a gasit nicio intrare potrivita cautarii in /etc/hosts, resolver-ul va cauta sa acceseze un server DNS pentru a rezolva numele. Pe sistemele Unix, numele serverului DNS este uzual setat in fisierul /etc/resolv.conf. Formatul /etc/hosts este simplu: $ cat / etc / hosts 127.0.0.1 localhost 192.168.1.1 myserver 5.2.14.244 a l e x. unibuc. r o Prima intrare din /etc/hosts ne indica asa-numita adresa de loopback. Aceasta este adresa locala a calculatorului si poate fi folosita ca orice adresa IP. Spre deosebire de o adresa IP din retea, adresa de loopback poate fi folosita oricand, chiar si atunci cand calculatorul nu este conectat fizic intr-o retea. In continuarea laboratorului veti folosi aceasta adresa de loopback pentru a exersa toate comenzile care urmeaza, atunci cand exercitiul nu indica expres o adresa de internet. 3 Servicii de retea Atunci cand secventa de boot se incheie si kernelul da controlul procesului init (systemd in Linux), daca s-a selectat runlevel-ul care configureaza sistemul ca fiind conectat in retea (e.g., nivelurile 3 sau 5), am vazut la curs ca se executa o serie de scripturi de sistem de tip rc sau run commands care pornesc si monitori- zeaza serviciile sistem din spatiul utilizator. In particular, pentru runlevel-urile care prevad functionarea in retea, aceste scripturi pornesc serviciile de retea. Serviciile de retea in Linux se afla in general in directorul /etc/init.d si sunt manipulate cu ajutorul comenzii service. Aceasta foloseste numele serviciului (e.g., ssh) si comenzile pe care le intelege scriptul aferent serviciului. In general aceste comenzi sunt standardizate pentru toate scripturile lansate de init: {start, stop, restart, reload, etc}. Iata o secventa de pornire/oprire a serviciului de ssh: $ s e r v i c e ssh s t a r t $ s e r v i c e ssh stop 5 Aici ssh este un script cu acest nume din /etc/init.d care poate primi ca parametru string-urile {start, stop}, executand pe cale de consecinta pornirea, respectiv oprirea serviciului. O secventa echivalenta de comenzi este: $ / e t c / i n i t. d/ s s h s t a r t $ / e t c / i n i t. d/ s s h s t o p Serviciile de retea (si in general toate serviciile sistem) pot fi activate respec- tiv dezactivate cu comanda systemctl care controleaza activitatea procesului systemd si a managerului de servicii. Activarea si respectiv dezactivarea unui serviciu nu presupune pornirea sau oprirea lui, ci doar marcheaza serviciul ca fiind legat de o procedura anume din sistem, de pilda bootarea calculatorului. Activarea/dezactivarea si pornirea/oprirea serviciilor sunt ortogonale: un servi- ciu poate activat fara a fi pornit, dupa cum poate fi pornit fara a fi activat. Ca un exemplu concret, urmatoarea comanda: $ systemctl d i s a b l e ssh nu va avea nici un efect asupra serviciului de ssh. Daca era pornit, el va continua sa ruleze. In schimb, la bootarea calculatorului serviciul nu va mai fi pornit automat, va fi nevoie de apelul explicit al comenzii service pentru a il porni. N.B. Executia comenzilor service si systemctl necesita drepturi de root. 4 Acces la distant, ă 4.1 Transfer de date prin FTP Pentru a accesa un host ce serves, te date prin protocolul FTP se foloses, te cumanda ftp(1). $ f t p alex@fmi. unibuc. r o $ f t p f t p : / / fmi. unibuc. r o $ f t p fmi. unibuc. r o −P 2121 Multe servere oferă informat, ii legate de acces s, i structura datelor pe server la momentul conectării. Este important de văzut dacă este oferit acces anonim, fără autentificare. În acest caz de obicei se foloses, te utilizatorul anonymous s, i, politicos, se trece ca parola adresa de email la care putet, i fi contactat, i. Dacă nu dorit, i acest lucru, apăsat, i pur s, i simplu Enter când se cere parola. O dată conectat, i va apărea promptul ftp> care indică faptul că vă aflat, i ı̂ntr- un shell specializat protocolului FTP. Comenzile de navigare s, i manipulare a fis, ierelor (dacă avet, i dreptul) sunt aceleas, i ca cele ı̂nvăt, ate până acum ı̂n shell: ls, cd, pwd, rmdir, chmod etc. Pentru a vedea toate comenzile disponibile apelat, i la comanda help. Pentru a urca sau coborı̂ un fis, ier folosit, i comenzile put, respectiv, get. Dacă avet, i nevoie să efectuat, i operat, ia pentru mai multe fis, iere putet, i folosi mput s, i mget (m de la multiple). Pentru a ies, i folosit, i quit. 6 Server-ele FTP sunt din ce ı̂n ce mai rare ı̂n spat, iul public, dar comenzile s, i modul de lucru este comun cu ı̂nlocuitorii lor moderni (ex. sftp). 4.1.1 Instalarea si pornirea serviciului de FTP Cel mai simplu mod de a exersa comanda ftp este sa porniti local serviciul corespunzator (cel mai probabil instalandu-l in prealabil): $ apt i n s t a l l v s f t p d $ service vsftpd start Obs: Daca ati instalat software-ul cu comanda apt, nu este necesara pornirea serviciului, procedura de instalare a serverului il si porneste automat. Pentru a verifica starea serviciului dupa instalare rulati comanda: $ service vsftpd status Odata ce serverul de FTP ruleaza, puteti folosi urmatoarea comanda: $ ftp localhost Puteti folosi la login contul anonymous? Daca nu, de ce? (v. pagina de manual). 4.2 Administrare prin SSH 4.2.1 Instalarea si pornirea serviciului de SSH La fel ca mai sus, incepeti prin a porni serviciul de SSH (eventual instalandu-l in prealabil daca nu exista in sistem): $ s e r v i c e ssh status $ s e r v i c e ssh s t a r t # daca s e r v i c i u l e o p r i t $ apt i n s t a l l openssh−s e r v e r # daca s e r v i c i u l nu e i n s t a l a t 4.2.2 Lucrul cu SSH Pentru a executa anumite comenzi sau a configura servicii de pe un host aflat la distanta se foloses, te comanda ssh(1). $ s s h fmi. unibuc. r o $ s s h alex@fmi. unibuc. r o $ s s h alex@fmi. unibuc. r o −p 2222 Rezultatul acestei comenzi este deschiderea unui shell pe o masina aflata la distanta, identificata ca mai sus prin adresa de IP si/sau port. Numele de utilizator este fie implicit numele local al utilizatorului care lanseaza comanda ssh, fie cel precizat explicit in comanda inainte de caracterul @. Executia shell- ului la distanta esueaza daca utilizatorul nu reuseste sa se logheze in sistemul de la distanta cu parola de utilizator de pe sistemul respectiv. 7 O varianta mai comoda si mai sigura de autentificare, care nu presupune introducerea parolei de pe sistemul de la distanta, foloseste criptografia cu chei asimetrice. Aceasta metoda de autentificare presupune folosirea a doua chei: una publica si una secreta/privata. Cheia publica este cunoscuta tuturor (poate fi distribuita public) si poate fi preluata de sistemele de calcul care vor sa per- mita accesul pe baza ei. Cheia secreta este cunoscuta doar catre proprietarul contulului si trebuie pastrata in siguranta. Compromiterea ei impune automat generarea unei noi perechi de chei si inlocuirea celor vechi. Perechea de chei este folosita pentru autentificare si acces fara parola. Cheile sunt stocate de regula in directorul ~/.ssh/ din contul utilizatorului. Cheia publica, care foloseste uzual extensia pub este distribuita dupa generare pe sistemele de calcul in care se doreste accesul utilizatorului. Ea este adaugata pe sistemele respective intr- un fisier numit ~/.ssh/authorized_keys care contine toate cheile publice ale utilizatorului care are dreptul sa utilizeze contul respectiv de pe masina aflata la distanta. La lansarea comenzii ssh se verifica continutul directorului ~/.ssh/ si intâi se ı̂ncearcă autentificarea prin chei asimetrice, daca acestea exista in director. Altfel, ssh recurge la procedura de fall-back si se incearca metoda clasică de autentificare cu utilizator s, i parolă. O dată autentificat, i, suntem ı̂ntâmpinat, i de un shell identic cu cel cu care am lucrat până acum doar ca ruleaza pe masina de la distanta, si ca atare toate comenzile sunt executate pe host-ul la distant, ă nu pe mas, ina proprie. Pentru a executa o simplă comandă fără a mai intra ı̂n shell, putem specifica comanda imediat după host: $ s s h fmi. unibuc. r o l s Generarea unei chei asimetrice se face cu comanda ssh-keygen(1). $ ssh−keygen G e n e r a t i n g p u b l i c / p r i v a t e r s a key p a i r. Enter f i l e i n which t o s a v e t h e key ( / home/ a l e x /. s s h / i d r s a ) : Enter p a s s p h r a s e ( empty f o r no p a s s p h r a s e ) : Enter same p a s s p h r a s e a g a i n : Your i d e n t i f i c a t i o n has been saved i n /home/ a l e x /. s s h / i d r s a. Your p u b l i c key has been saved i n /home/ a l e x /. s s h / i d r s a. pub. The key f i n g e r p r i n t i s : SHA256 : ixhRJaJimfffiqTED8+ZGSp+ZMGtqwC/V7qsmxPTtAU alex@fmi The key ’ s randomart image i s : +−−−[RSA 2048]−−−−+ |. o.. | | o. Eo. | |.+ o. o. | |... ooo. | |. o++ S | |.. + + ooo... | |. +∗o =.... | |.. o ∗@ ∗. | |. oOBoX. | 8 +−−−−[SHA256]−−−−−+ Cheia publică are sufix.pub s, i se găses, te ı̂n /home/alex/.ssh/id_rsa.pub. Cea privată se găses, te ı̂n acelas, i loc dar fără sufix. Implicit comanda ssh-keygen(1) generează chei RSA. Este recomandat să folosit, i un algoritm mai nou cum ar fi ed25519 sau ecdsa. Pentru aceasta folosit, i argumentul -t algoritm: $ ssh−keygen −t ed25519 G e n e r a t i n g p u b l i c / p r i v a t e ed25519 key p a i r.... Cheile publice pentru cei care dorit, i să aibă acces pe contul dumneavoastră de pe un host (ex. calculatorul propriu, server web etc.) se pun ı̂n fis, ierul.ssh/authorized_keys din $HOME. Pentru a adăuga o cheie publică id rsa.pub folosit, i $ c a t i d r s a. pub >>. s s h / a u t h o r i z e d k e y s Pentru a transfera date prin SSH se foloses, te comanda scp(1) care se com- portă aproape identic cu cp(1). Diferent, a apare ı̂n specificarea sursei s, i destinat, iei. Acestea sunt prefixate cu date legate de host. $ s c p h e l l o. c fmi. unibuc. r o : $ s c p h e l l o. c alex@fmi. unibuc. r o : code / $ s c p −r p r o j e c t / alex@fmi. unibuc. r o : Implicit, dacă nu este specificată nici o cale după :, transferul se face din/ı̂n directorul $HOME al utilizatorului. Dacă este specificată o cale, aceasta poate fi relativă fmi.unibuc.ro:catalog sau absolută fmi.unibuc.ro:/etc/passwd. Adesea, comanda scp este folosita pentru a intia transferuri de date de di- mensiuni mari, care pot dura foarte mult, facand impractica pastrarea deschisa a terminalului din care s-a lansat comanda. Pe de alta parte, inchiderea termina- lului echivaleaza in mod uzual cu terminarea comenzii, ceea ce nu este de dorit. Exista programe care permit detasarea comenzii de terminalul de lucru, fapt ce permite inchiderea acestuia. Ulterior, cand utilizatorul reia sesiunea de lucru si deschide un nou terminal de lucru poate reatasa comanda noului terminal. In tot acest timp comanda a rulat in background si, presupunand ca nu au existat erori in executia ei, a

Use Quizgecko on...
Browser
Browser