Documente Academic
Documente Profesional
Documente Cultură
CUPRINS 1. Scurt istoric al sistemului Unix 2 Structura generala a sistemului UNIX 2.1 Sistemul de Operare 2. 2 Sistemul de fisiere 2.3 Programe Unix 2.4 Conectarea la un sistem Unix 2.5 Comenzi Unix, redirectare 3. Sistemul de fisiere, comenzi 3.1 Tipuri de fisiere 3.2 Atributele fisierelor si directoarelor 4. Comenzi de baza Unix 4.1 Comanda cat 4. 2 Afisarea fisierelor pe pagini: more 4.3 Comparare de fisiere: cmp 4.4 Comparare fisiere ascii: diff 4.5 Determinarea tipului unui fisier: file 4.6 Listarea manualului unei comenzi: man 4.7 Listare variabile de environment: printenv 4.8 Listare stare procese, anularea unui proces: ps, kill 5. Limbajul de comanda Shell 5.1 Generalitati despre Bourne Shell 5.2. Proceduri si parametri 5.3 Structuri de control
Partea I
System V Release 4
Acesta va fi dezvoltat in UnixWare si Solaris 2. 1990 Linux Linux este o versiune free de UNIX dezvoltat prima data de Linus Torvalds la Universitatea din Helsinki(Finlanda) cu ajutorul multor programatori de sistem UNIX. Software-ul disponibil pentru Linux a fost dezvoltat sub licenta GNU (General Public License) al Free Software Foundation din Cambridge, Massachusetts, U.S.A. Programatori din intreaga lume au contribuit si contribuie la dezvoltarea sistemului si a diverselor aplicatii Linux. 1993 Novell cumpara UNIX de la AT&T 1994 Novell da numele "UNIX" lui X/OPEN 1995 Santa Cruz Operations cumpara UnixWare de la Novell. Santa Cruz Operations si Hewlett-Packard anunta ca vor dezvolta o versiune de Unix pe 64 biti.
Sisteme UNIX Acum Unix este larg raspandit si este disponibil din multe surse free sau comerciale: SunOS/Solaris (Sun Microsystems); Digital Unix (Tru64) (Digital/Compaq); HP-UX (Hewlett Packard); Irix (SGI); UNICOS (Cray); NetBSD, FreeBSD (UC Berkeley / the Net); Linux (Linus Torvalds / the Net);
Functiile kernel sunt de doua tipuri: autonome si selective(responsive). Functii ca alocarea de memorie si CPU sunt realizate fara cerere explicita din partea procesului utilizator. Alte functii ca alocarea de resurse, crearea si gestionarea proceselor sunt initiate prin cereri de la proces. Programele utilizator interactioneaza cu kernel-ul prin intermediul unui set standard numit system calls. Aceste system calls cheama servicii care sa fie furnizate de kernel. Exista urmatoarele 3 categorii de apeluri system: - system calls pentru manipulare fisiere: create, open, read, write, close, unlink, trun; - system calls pentru control proces: fork, exec, wait, kill; - system calls pentru manipulare informatii: getpid, getgid, gethostname; Sistemul de operare Unix este un sistem multi-user, multi-tasking. Putem avea mai multi utilizatori conectati la sistem simultan, fiecare ruland mai multe programe. Notiunea de proces Un proces numit uneori si job sau task, este un program in executie. O singura copie a unui program in memorie poate fi utilizata de mai multe procese. Un proces se poate multiplica prin intermediul apelului de sistem fork rezultand un proces numit child a carui imagine difera de procesul parent printr-un numar unic de identificare (PID). Sistemul de operare creaza o structura de date numita Process Control Block(PCB) care include PID-ul, ID-ul procesului parinte(PPID), informatii despre stare proces(registri si stive) precum si informatii de control proces. Procesele sistem sunt pornite de kernel. Procesele utilizator dialogheaza cu exteriorul prin trei fisiere speciale care sunt deschise permanenet: - intrare standard (standard input, 0); - iesire standard (standard output, 1); - iesire de erori standard (standard error output, 2); Un proces poate lua urmatorele stari: - activ (runnable) --> R; - in asteptare(sleeping) --> S; - oprit (traced or stopped) --> T - terminat, dar elementele procesului raman vizibile(zombie) --> Z; Sarcina kernel-ului este si aceea de a pastra fiecare proces si user separat si de a gestiona accesul la sistemul hardware(cpu, memorie, disk si alte device-uri I/O).
O cale prin care procesele comunica unul cu altul si cu kernel-ul este prin intermediul semnalelor(signals). Semnalele sunt diverse notificari trimise procesului in scopul de a notifica diverse evenimente externe neasteptate si importante. Fiecare semnal are asociat un numar intreg(1,2) si un nume simbolic(definit in /usr/include/signal.h). Comanda kill l ne va arata lista cu semnalele suportate de sistem.
1) SIGHUP 5) SIGTRAP 9) SIGKILL 13) SIGPIPE 18) SIGCONT 22) SIGTTOU 26) SIGVTALRM 30) SIGPWR 2) SIGINT 6) SIGABRT 10) SIGUSR1 14) SIGALRM 19) SIGSTOP 23) SIGURG 27) SIGPROF 31) SIGSYS 3) SIGQUIT 7) SIGBUS 11) SIGSEGV 15) SIGTERM 20) SIGTSTP 24) SIGXCPU 28) SIGWINCH 4) SIGILL 8) SIGFPE 12) SIGUSR2 17) SIGCHLD 21) SIGTTIN 25) SIGXFSZ 29) SIGIO
Exemplu: SEGV( segmentation violation) - este trimis de kernel daca utilizatorul incearca su acceseze ilegal memoria. Dupa primirea acestui mesaj, procesul se va termina. Un mod de a trimite semnale procesului este prin intermediul tastaturii. Sunt cateva taste care sunt interpretate de sistem ca cereri de a trimite semnale catre procesele cu care interactionam: Ctrl-C Sistemul trimite un semnal INT(SIGINT) catre procesul in executie. Acest semnal are ca urmare terminarea imediata a procesului. Ctrl-Z Sistemul trimite un semnal TSTP(SIGTSTP) catre procesul in executie si are ca rezultat suspendarea executiei. Ctrl-\ Sistemul trimite un semnal ABRT(SIGABRT) catre procesul in executie. Are acelasi efect cu Ctrl-C. Alt mod de a trimite semnale catre procese este prin comenzi: kill Comanda kill accepta 2 parametri: un nume de semnal(sau numar) si identificatorul procesului(PID): kill -<semnal> <PID> Exp. kill INT 2346 kill 2 2346 == CTRL-C
fg
Aceasta comanda reia executia unui proces care a fost suspendat cu Ctrl-Z prin trimiterea unui semnal CONT. Gestionarea memoriei Sistemul UNIX ruleaza in memoria virtuala, ceea ce permite executia unor procese care cer un spatiu de memorie mai mare decat cel al memoriei fizice instalate. Memoria virtuala este deci memoria care apare alocata aplicatiilor program. Sistemul de operare foloseste o parte din hard disk ca memorie virtuala si schimba date intre hard disk si memoria fizica. Memoria virtuala permite multitasking. Daca
7
este nevoie sa rulam diverse programe simultan iar memoria ceruta de aceste programe depaseste memoria fizica disponibila, sistemul de operare aloca memorie virtuala pentru satisfacerea cerintelor de memorie ale fiecarui program si apoi gestioneaza memoria fizica disponibila pentru satisfacerea cerintelor la un moment dat. Dimensiunea memoriei virtuale alocate poate fi mult mai mare decat dimensiunea memoriei fizice instalate in sistem. Folosirea memoriei virtuale implica paging si swapping. Paging apare cand un proces activ cere mai multa memorie deca este acesibila in memoria fizica. Parti ale procesului sunt mutate pe disk astfel incat memoria fizica poate fi folosita pentru alt proces activ. Swapping: Are loc atunci cand kernel-ul nu gaseste suficienta memorie RAM pentru un proces nou. Kernelul selecteaza procesul cel mai putin ocupat si il muta in intregime pe hard disk(program, stive folosite, date). Cand mai multa memorie RAM devine disponibila kernelul muta procesul inapoi de pe hard disk in memoria RAM. Acest mod de utilizare a memoriei virtuala face posibila folosirea sistemului in continuare, evident cu reducerea performantelor de sistem. Concluzie: Memoria RAM trebuie sa fie cat mai mare. Unde este fisierul kernel? Directorul root contine atat programul de boot cat si fisierul continand kernelul sistemului. Numele acestui fisier este diferit de la un tip de sistem unix/linux la altul dar de obicei include campul nix sau nuz : $ ls -l /*nuz* -rw-r--r-- 1 root root 1346428 Jul 26 2004 /vmlinuz $ % ls -l /*nix* -rwxr-xr-x 1 root sys 1490272 Sep 20 2001 /genunix
%
Obs. Fisierul kernel nu trebuie sters accidental si este bine sa avem o salvare a lui. Fara fisierul kernel sistemul nu va starta.
2. 2 Sistemul de fisiere
Sistemul de fisiere este o componenta esentiala in toate mediile Unix furnizand mecanismele pentru memorarea si regasirea fisierelor precum si o structura ierarhica de organizare.
8
In Unix se poate face referire la doua tipuri de fisiere sistem: structura de directori(logic) sau aranjarea fisierelor in partitiile discului(fizic). Sistemul de fisiere fizic este divizat in partitii pe disc. Dimensiunea partitiei determina numarul de blocuri pe care sistemul de fisiere il foloseste. Fiecare sistem de fisiere are un superblock, inode-uri si data blocks. In superblock se gasesc informatii de control pentru sistem. Inode-urile contin informatii de control pentru fisiere. Inode-ul este un fisier special care este citit de kernel si astfel obtine informatii despre fiecare fisier. Data blocks contin datele fisierelor. Un exemplu de organizare:
Filesystem /dev/dsk/c0t0d0s0 /dev/dsk/c0t0d0s3 proc fd mnttab swap /dev/dsk/c0t0d0s6 swap /dev/dsk/c0t0d0s7 kbytes 2507769 8065025 0 0 0 1888856 5040814 1889272 17365172 used 1118515 1042983 0 0 0 8 1513181 424 1504319 avail capacity 1339099 46% 6941392 14% 0 0% 0 0% 0 0% 1888848 1% 3477225 31% 1888848 1% 15687202 9% Mounted on / /usr /proc /dev/fd /etc/mnttab /var/run /work /tmp /export
Prima partitie(c0t0d0s0) este intotdeauna partitia de root /. Sistemul de fisiere logic se refera la o organizare ierarhica pe directoare si fisiere accesibile utilizatorului. Sistemul de fisiere Unix este organizat intr-o structura de arbore inversat sau de piramida, unde toate fisierele sunt logic continute in directorul root, notat cu / .
Exemplu de structura de sistem de fisiere: Exista diferite organizari ale directoarelor functie de tipul de sistem Unix. Fiecare nod din arbore este ori un fisier ori un director, in care putem avea alte fisiere si directoare. Specificam un fisier sau director prin numele de cale (path name)
9
absoluta sau relativa la o locatie. Numele intreg de cale incepe cu root, / si urmeaza ramurile sistemului de fisiere , fiecare separate de /, pana cand gasim fisierul. Ex. /usr/ Numele relativ de cale specifica calea relativ la alta, de obicei directorul curent de lucru. Avem doua directoare speciale: . directorul curent .. parintele directorului curent Sistemul de fisiere Unix furnizeaza sistemului de operare capabilitati cum ar fi: Creare si stergere de fisiere; Deschiderea fisierelor pentru citire/scriere; Pozitionare in interiorul fisierului; Inchidere fisiere; Creare directori; Listare continut directoare; Stergere directoare;
Last login: Mon Jan 16 00:52:02 from SAS YRBK% yrbk login: operator Password: Linux 2.4.21. Last login: Fri Jan 13 12:04:18 +0000 2006 on pts/2 from 192.168.5.35. No mail. operator@yrbk:~$
In primul caz creem fisierul file sau il stergem daca exista deja. In al doilea caz adauga la sfarsitul fisierului rezultatul comenzii. Pentru redirijarea erorilor folosim 2> si 2>> in loc de > si >>.
Exemple: $ pwd /home/centre/muntenia $ pwd > pwd.out $ cat pwd.out /home/centre/muntenia $ pwd >> pwd.out
11
$ cat pwd.out /home/centre/muntenia /home/centre/muntenia $ cat pwd.out >> pwd.out cat: pwd.out: input file is output file # eroare $ cat pwd.out >> pwd.out 2> pwd.err $ cat pwd.err cat: pwd.out: input file is output file $ > ttest $ ls MUNTENIA.exe pwd.err pwd.out ttest $ ls -l total 2020 -rw-r--r-- 1 centre users 2054865 May 27 2004 MUNTENIA.exe -rw-r--r-- 1 centre users 40 Jan 16 12:11 pwd.err -rw-r--r-- 1 centre users 44 Jan 16 12:07 pwd.out -rw-r--r-- 1 centre users 0 Jan 16 12:12 ttest $
Pentru majoritatea comenzilor sintaxele cmd < file si cmd file sunt echivalente.
Exemple: $ cat < pwd.out /home/centre/muntenia /home/centre/muntenia $ cat > cat.input Aceasta este o metoda practica de a crea fisiere mici fara a utiliza un editor de texte. Inchiderea intrarii standard se se face cu Ctrl-D la inceputul liniei. $ ls -l total 2024 -rw-r--r--rw-r--r--rw-r--r--rw-r--r--rw-r--r-$
2054865 May 27 2004 MUNTENIA.exe 160 Jan 16 12:24 cat.input 40 Jan 16 12:11 pwd.err 44 Jan 16 12:07 pwd.out 0 Jan 16 12:12 ttest
12
Redirectionarea intre comenzi Redirectarea intre comenzi se numeste pipe si este simbolizata prin caracterul | .
$ pwd | od x # afisare nume director curent in hexazecimal 0000000 682f 6d6f 2f65 6563 746e 6572 6d2f 6e75 0000020 6574 696e 0a61 0000026 $ who bkmet tty1 Jan 16 10:26 gologan pts/1 Jan 16 11:50 (192.168.5.35) $ who | wc -l 2 $ $ ls -al | more total 2032 drwxr-xr-x 2 centre users 4096 Jan 16 12:21 . drwxrwxrwx 17 centre users 4096 Oct 31 09:25 .. -rw-r--r-- 1 centre users 2054865 May 27 2004 MUNTENIA.exe -rw-r--r-- 1 centre users 160 Jan 16 12:24 cat.input -rw-r--r-- 1 centre users 40 Jan 16 12:11 pwd.err -rw-r--r-- 1 centre users 44 Jan 16 12:07 pwd.out -rw-r--r-- 1 centre users 0 Jan 16 12:12 ttest
Folosim comanda more ca sa putem afisa pagina cu pagina pe ecran(cand avem un catalog cu multe fisiere).
13
Partea II
3. Sistemul de fisiere, comenzi
Structura fisierelor sub Unix este o structura arborescenta compusa din directoare (cataloage, repertoare) si fisiere. Pentru toate fisierele exista o cale de la radacina (/) catre fisier iar aceasta cale identifica fara ambiguitate fiecare fisier. Calea cu toata structura /dirname1/dirname2/.../dirnamen se numeste referinta absoluta radacina pentru referinta absoluta este /. Referinta la un fisier care nu incepe cu / este o referinta relativa. Fiecare utilizator are un catalog privat care devine si catalogul sau de lucru la startarea sesiunii de lucru(login). 3.1 Tipuri de fisiere Fisierele pot fi grupate in trei mari categorii: 3.1.1 Fisiere ordinare Sunt fisiere care contin programe(binare sau sursa), date ale programelor utilizator sau de sistem(fisiere ASCII). Aceste fisiere sunt rezultatul unor programe(editoare, compilatoare,...). 3.1.2 Fisiere speciale Un fisier special este asociat unui dispozitiv fizic de intrare-iesire. Fisierele speciale sunt tratate de sistem ca fisiere pe disc ordinare dar operatiile de citire/scriere pe aceste fisiere activeaza dispozitivele fizice asociate. Se pot distinge doua tipuri de fisiere speciale: - fisiere speciale in mod caracter precum terminalele, pentru care intrarile-iesirile sunt realizate caracter cu caracter. - fisiere speciale in mod bloc precum discurile, pentru care intrarile-iesirile sunt realizate in mod bloc(512 sau 1024 octeti). 3.1.3 Directoare(Fisiere catalog) Directoarele sunt folosite pentru gruparea fisierelor pe categorii semnificative. Principalele cataloage(directoare) existente in sistemele Unix sunt: - root (/) contine toate celelalte fisiere si directoare.
14
- /bin si /usr/bin contin programe executabile(binare) asociate sistemului de fisiere; - /dev este rezervat pentru fisierelor speciale; Toate fisierele speciale trebuiesc definite in acest director sau in subdirectoare ale acestuia. - /etc contine fisiere necesare pentru operatii sistem de configurare, operatii de administrare si de maintenance. - /lib contine compilatorul si functiile acestuia.(biblioteci); - /tmp contine fisiere temporare; - /usr contine fisiere sistem utilizator; - /usr/bin si /usr/local/bin toate fisierele executabile necesare utilizatorilor;
3.2
Fisierele si directoarele au un nume, o cale(path) si un set de atribute. Sistemul pastreaza calea fisierelor si directoarelor folosind inode uri (index node). Comanda ls l, putem vedea cateva atribute ale fisierelor si directoarelor:
Tip fisier Permisii Nr. links Grup Data ultimei modif. Dimens. in octeti Nume fisier Timpul ultimei modif.
Proprietar
1 1 2 1 3
users 103756 2004-05-13 users 281264 2002-02-24 users 12288 2006-01-17 users 180 2006-01-17 users 4096 2006-01-17
Primul cod (Tip fisier) indica felul fisierului prezent in lista: fisier ordinar b fisier special bloc c fisier special caracter d director l link simbolic
Pentru un fisier dat utilizatorii sistemului pot fi clasificati in trei categorii: - proprietarul fisierului;
15
- membri unui grup particular; - ceilalti utilizatori; Exista in sistem un utilizator privilegiat dispunand de toate drepturile (superuser), utilizatorul root. 3.2.1 Drepturi de acces fisiere si directoare Un fisier poseda 3 permisii rwx aplicabile celor 3 clase de utilizatori(owner, group, others): - r dreptul de citire a fisierului. - w drept de scriere si de modificare a fisierului. - x drept de executie a fisierului. owner rwx group rwx other rwx
O protectie buna pentru un fisier este realizata atribuind permisiile -rw------. Pentru un director drepturile rwx au urmatoare semnificatie: - r dreptul de citire si deci de listare a directorului(ls), dar citirea fisierelor este interzisa daca fisierele sunt protejate la citire. - w drept de scriere in director si deci de stergere a fisierelor continute. -x drept de a traversa directorul(cd) O protectie buna pentru un director este : drwx--x--x. Numar octal 0 1 2 3 4 5 6 7 permisii rwx rwr-x r--wx -w--x ---
read, write and execute read and write read and execute read only write and execute write only execute only no permissions
Comanda umask 066 : drwx--x--x si rw------- pentru fisiere. In comanda umask specificam permisiile fisierului pe care vrem sa le anulam. 3.2.2 Notiunea de grup
16
Un utilizator la un moment dat are drepturile de acces ale unui singur grup definit la crearea userului. Toate fisierele create de acest utilizator apartin acestui grup. Userul poate sa-si schimbe grupul si sa utilizeze alt grup in care este membru cu ajutorul comenzii newgrp. Comanda are ca efect schimbarea GID cu grupul nou. $ newgrp sntm Comanda newgrp este o comanda interna shell(built-in) 3.2.3 Comenzile chown, chgrp, chmod Pentru a putea utiliza cu succes aceste comenzi trebuie sa fim proprietarul fisierului sau root. Comanda chgrp permite schimbarea grupului unui fisier sau director. Grupul ales este unul deja existent in sistem.
$ groups sntm users $ ls l filetest -rwxr-xr-x 1 centre users $ chgrp sntm filetest $ ls l filetest -rwxr-xr-x 1 centre sntm $ chown root filetest $ ls l filetest -rwxr-xr-x 1 root sntm $ chown centre filetest ----eroare $ chmod 555 file1
103756
103756
103756
3.2.4 Crearea si stergerea directoarelor Un director este creat cu comanda: mkdir (make directory). Sintaxa: mkdir numedirector
$mkdir dirtest $ mkdir programe bin temp programe/surse programe/test (atentie la ordine);
17
$ rmdir dirtest
3.2.5 Deplasarea in directoare: cd si pwd Comanda cd (change directory) permite schimbarea directorului curent iar comanda pwd(print working directory) permite afisarea numelui catalogului curent. Sintaxa: cd [director] Directorul este un nume relativ sau absolut. Cand argumentul este absent ne reintoarcem in directorul HOME, care este directorul initial(la login). Consideram subarborescenta urmatoare:
Daca directorul curent este programe putem merge in directorul bin astfel:
$ cd /home/centre/bin sau $ cd ../bin sau $ cd .. $ cd bin
Obs. Pentru toate directoarele numele directorului curent este ., iar numele directorului parinte este . . . Exemple
$ pwd /home/centre/programe $cd test
18
$ pwd /home/centre/programe/test $ cd ../.. $ pwd /home/centre $ cd temp $ pwd /home/centre/temp $ cd $ pwd /home/centre
3.2.6 Listarea atributelor fisierelor si directoarelor: ls Comanda ls (list files) permite listarea continutului directoarelor. Sintaxa: ls [-CFRacdilqrtu1] [files] Exemple
$ ls dict/ etc/ include/ lib/ local/ sbin/ X11R6/ bin/ doc/ i486-slackware-linux/ info/ libexec/ man/ share/ src/ $ ls -l total 144 lrwxrwxrwx 1 root 5 2004-05-18 17:22 X11 -> X11R6/ drwxr-xr-x 11 root 4096 2002-03-13 04:26 X11R6/ lrwxrwxrwx 1 root 8 2004-05-18 17:22 adm -> /var/adm/ drwxr-xr-x 2 bin 36864 2004-05-18 17:43 bin/ drwxr-xr-x 2 root 4096 1993-11-26 05:40 dict/ drwxr-xr-x 497 root 12288 2002-03-13 04:26 doc/ drwxr-xr-x 2 root 4096 2004-05-18 17:22 etc/ drwxr-xr-x 4 root 4096 2004-05-11 07:48 i486-slackware-linux/ drwxr-xr-x 150 root 8192 2004-02-24 04:33 include/ drwxr-xr-x 2 root 12288 2002-03-15 12:43 info/ drwxr-xr-x 90 root 32768 2004-05-18 17:43 lib/ drwxr-xr-x 8 root 4096 2004-05-12 22:45 libexec/ drwxr-xr-x 11 root 4096 1994-03-16 03:50 local/ drwxr-xr-x 35 root 4096 2004-03-23 06:41 man/ drwxr-xr-x 2 bin 8192 2004-05-11 09:00 sbin/ drwxr-xr-x 152 root 4096 2004-03-23 06:42 share/ lrwxrwxrwx 1 root 10 2004-05-18 17:22 spool -> /var/spool/ drwxr-xr-x 5 root 4096 2004-05-18 17:30 src/ lrwxrwxrwx 1 root 8 2004-05-18 17:22 tmp -> /var/tmp/
19
$ ls -l /usr/local total 36 drwxr-xr-x 2 bin 4096 1993-11-24 19:32 bin/ drwxr-xr-x 2 root 4096 1993-11-24 19:32 etc/ drwxr-xr-x 2 root 4096 1993-11-24 19:32 games/ drwxr-xr-x 2 root 4096 1994-03-16 03:50 include/ drwxr-xr-x 2 root 4096 1993-11-24 19:32 info/ drwxr-xr-x 2 root 4096 1994-03-16 02:05 lib/ drwxr-xr-x 22 root 4096 1994-06-02 04:37 man/ drwxr-xr-x 2 bin 4096 1993-11-24 19:32 sbin/ drwxr-xr-x 2 root 4096 1993-11-24 19:32 src/
Optiuni utile: -l: lista in format lung; -a: lista continand si fisierele incepand cu .; -R: listeaza directoarele recursiv; -d: listeaza caracteristicile directoarelor;
3.2.7 Definirea mastii la crearea fisierelor: umask Comanda umask permite pozitionarea unei masti care defineste permisii la crearea fisierelor. Masca este complementul in baza 2 a permisiunilor. Este exprimata in baza 8. Exemple rwx 111 000 0 --x --x 001 001 110 110 6 6 permisiune simbolica. permisiune binara: 711 in octal; masca binara; masca in octal;
# pozitionarea mastii. # afisarea mastii.
3.2.8 Schimbarea drepturilor de acces ale fisierelor: chmod Comanda chmod (change mode) modifica modul (permisiunile) fisierelor si directoarelor. Sintaxa: chmod [ugoa][+ - =][rwxstugo] files - a aplica la toti: user, grup si altii
20
$ ls -l total 28 -rwxr-xr-x 1 centre users 5161 2004-02-22 23:35 rc.inet1 -rw-r--r-- 1 centre users 907 2004-06-07 18:00 rc.inet1.conf -rw-r--r-- 1 centre users 8091 2002-02-25 21:38 rose_link.c -rw-r--r-- 1 centre users 2556 2000-12-30 00:44 rose_loopback.c -rw-r--r-- 1 centre users 3214 2000-12-30 00:44 rose_out.c $ pwd /home/centre/programe/surse $ chmod 750 *.c $ ls -l total 28 -rwxr-xr-x 1 centre users 5161 2004-02-22 23:35 rc.inet1 -rw-r--r-- 1 centre users 907 2004-06-07 18:00 rc.inet1.conf -rwxr-x--- 1 centre users 8091 2002-02-25 21:38 rose_link.c -rwxr-x--- 1 centre users 2556 2000-12-30 00:44 rose_loopback.c -rwxr-x--- 1 centre users 3214 2000-12-30 00:44 rose_out.c
Obs. Notatia octala nu permite adaugarea sau suprimarea unui atribut particular al unui fisier si sa lase celelalte atribute neschimbate.
3.2.9 Crearea unui link la un fisier: ln Un link este definirea unui al doilea nume pentru un fisier care exista deja. Este posibil sa creem link-uri ale unui fisier ordinar sau special adica de a crea mai multe referinte diferite, la un acelasi fisier fizic, adica crearea de sinonime ale aceluiasi obiect fara crearea unui nou inode: Sintaxa: ln numefis1 numefis2
Fisierul numefis1 trebuie sa existe, fisierul numefis2 nu trebuie sa existe, acesta devenind un alt nume posibil pentru numefis1.
$ pwd /home/centre/programe $ ls -il total 36 2228545 -rw------- 1 centre users 1112 2003-05-23 08:07 ediff.gz 2228546 -rw------- 1 centre users 3740 2003-05-23 08:07 efaq.gz 2228555 -rw------- 1 centre users 31 2006-01-18 23:01 rc1 2228560 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf 2228552 -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c 2228554 -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c 2228550 drwxr-xr-x 3 centre users 4096 2006-01-18 22:49 surse/ 2228551 drwxr-xr-x 2 centre users 4096 2006-01-18 00:20 test/ $ ln rc1 rc1_bis $ cat rc1 # Config information for eth0: $ cat rc1_bis # Config information for eth0: $
Fisierele referite de rc1 si rc1_bis au acelasi continut; putem verifica ca cele 2 referinte sunt pentru acelasi fisier:
$ ls -il
22
total 40 2228545 -rw------- 1 centre users 1112 2003-05-23 08:07 ediff.gz 2228546 -rw------- 1 centre users 3740 2003-05-23 08:07 efaq.gz 2228555 -rw------- 2 centre users 31 2006-01-18 23:01 rc1 2228555 -rw------- 2 centre users 31 2006-01-18 23:01 rc1_bis 2228560 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf 2228552 -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c 2228554 -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c 2228550 drwxr-xr-x 3 centre users 4096 2006-01-18 22:49 surse/ 2228551 drwxr-xr-x 2 centre users 4096 2006-01-18 00:20 test/
Optiunea -i permite verificarea daca cele doua referinte rc1 si rc1_bis corespund amandoua la inod-ul cu nr. 2228555 Vom crea o a treia referinta a aceluiasi fisier in subdirectorul test:
$ ln rc1 test/rc1 $ ls il test/rc1 2228555 -rw------- 3 centre users 31 2006-01-18 23:01 test/rc1 $
3.2.10 Copiere de fisiere : cp Comanda cp permite efectuarea unei copii fizice a unui fisier in altul. Aceasta inseamna crearea unui nou inode, crearea unei noi intrari in director si recopierea efectiva a continutului primului fisier. Sintaxa: cp [-ip] f1 f2 sau cp [-irp] f1... fn d2 In sintaxa de baza fisierul f1 este duplicat in f2. Daca fisierul f2 exista, el va fi sters. Optiunea -i permite evitarea acestui tip de incident.
$ ls -l total 36 -rw------- 3 centre users 31 2006-01-18 23:01 rc1 -rw------- 3 centre users 31 2006-01-18 23:01 rc1_bis -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 374 2006-01-18 23:21 rc2_bis -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-18 22:49 surse drwxr-xr-x 2 centre users 4096 2006-01-18 23:11 test $ cp rc2.conf rc2_bis $ ls -l total 36 -rw------- 3 centre users 31 2006-01-18 23:01 rc1 -rw------- 3 centre users 31 2006-01-18 23:01 rc1_bis -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 374 2006-01-18 23:22 rc2_bis -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-18 22:49 surse drwxr-xr-x 2 centre users 4096 2006-01-18 23:11 test $
Fiecare din cele doua fisiere rc2.conf si rc2_bis au un singur link: numerele de inode sunt diferite
$ ls -il rc2.conf rc2_bis 2228560 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf 2228561 -rw------- 1 centre users 374 2006-01-18 23:22 rc2_bis $
24
Optiunea -r permite sintaxa cp -r fd1 fd2....fdn d2 in care fd1...fdn pot fi fisiere sau directoare. Directoarele si continutul lor vor fi copiate recursiv in directorul d2. Optiunea -p permite conservarea pentru noul fisier a permisiunilor fisierului de origine, precum si data ultimei modificari.
$ ls rc1 rc1_bis rc2.conf rc2_bis ros1.c rosout.c surse test $ ls -l total 36 -rw------- 2 centre users 31 2006-01-18 23:01 rc1 -rw------- 2 centre users 31 2006-01-18 23:01 rc1_bis -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 374 2006-01-18 23:27 rc2_bis -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c drwxr-xr-x 2 centre users 4096 2006-01-18 23:48 surse drwxr-xr-x 2 centre users 4096 2006-01-18 23:36 test $ cp -r rc1 test surse $ cd surse $ ls -l total 8 -rw------- 1 centre users 31 2006-01-18 23:50 rc1 drwxr-xr-x 2 centre users 4096 2006-01-18 23:50 test $ cd test $ ls rc1 ros1.c rosout.c $
3.2.11 Stergere de fisiere: rm Comanda rm(remove) permite stergerea fisierelor. Sterge linkul la fisier si deoarece acesta este unic rezulta ca si datele fisierului sunt distrusse. Sintaxa: rm[-ifr] f1 f2....fn Optiuni: - -i mod interactiv ( cere confirmare de stergere) - -r Daca fn este un director, atunci este permisa stergerea recursiva - -f daca fisierul nu exista nu afiseaza mesaj de eroare, daca nu exista dreptul w, nu cere confirmare pentru stergere. Atentie! comanda rm * sterge toate fisierele din directorul curent comanda rm -fr * sterge toate fisierele si directoarele din directorul curent
25
$ ls -l total 36 -rw------- 2 centre users 31 2006-01-18 23:01 rc1 -rw------- 2 centre users 31 2006-01-18 23:01 rc1_bis -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 374 2006-01-18 23:27 rc2_bis -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-18 23:50 surse drwxr-xr-x 2 centre users 4096 2006-01-18 23:36 test $ rm *bis $ ls -l total 28 -rw------- 1 centre users 31 2006-01-18 23:01 rc1 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-18 23:50 surse drwxr-xr-x 2 centre users 4096 2006-01-18 23:36 test $
Comanda mv(move) permite redenumirea unui fisier sau deplasarea lui in arborescenta fisierelor. Sintaxa: sau mv [-if] f1 f2 mv [-if] f1...fn d1 (1) (2)
Forma (1): f1 si f2 in forma (1) sunt fisiere sau directoare. Forma (2): f1, f2,..fn sunt fisiere si sau directoare iar d1 este un director.
$ cd test $ ls -l total 0 $ cd .. $ ls -l total 28 -rw-------rw-------rw-------rw-------
1 centre users 31 2006-01-18 23:01 rc1 1 centre users 374 2006-01-18 22:49 rc2.conf 1 centre users 8091 2006-01-18 00:48 ros1.c 1 centre users 3214 2006-01-18 00:48 rosout.c
26
drwxr-xr-x 3 centre users 4096 2006-01-19 00:14 surse drwxr-xr-x 2 centre users 4096 2006-01-19 00:14 test $ mv rc1 surse test $ ls -l total 20 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 8091 2006-01-18 00:48 ros1.c -rw------- 1 centre users 3214 2006-01-18 00:48 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-19 00:15 test $ cd test $ ls -l total 8 -rw------- 1 centre users 31 2006-01-18 23:01 rc1 drwxr-xr-x 3 centre users 4096 2006-01-19 00:15 surse
Comanda cat este un filtru care permite filtrare si concatenare de fisiere. Comanda cat permite afisarea la iesirea standard a continutului unui fisier sau a mai multor fisiere ale caror referinte sunt date in argumente. Fara argumente comanda trateaza intrarea standard. Exemple
$ ls -l total 16 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 93 2006-01-19 02:57 ros1.c -rw------- 1 centre users 98 2006-01-19 02:54 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-19 00:15 test $ cat ros1.c struct sk_buff *skb; unsigned char *dptr; int len; struct net_dev *first; int facl = 0; $ cat rosout.c #include <linux/errno.h> #include <linux/types.h>
27
#include <linux/socket.h> #include <linux/in.h> $ cat ros1.c rosout.c > rosall.c $ ls -l total 20 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 93 2006-01-19 02:57 ros1.c -rw-r--r-- 1 centre users 191 2006-01-19 02:59 rosall.c -rw------- 1 centre users 98 2006-01-19 02:54 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-19 00:15 test $ cat rosall.c struct sk_buff *skb; unsigned char *dptr; int len; struct net_dev *first; int facl = 0; #include <linux/errno.h> #include <linux/types.h> #include <linux/socket.h> #include <linux/in.h> $
Fisierul ros1.c si rosout.c sunt concatenate pentru a produce fisierl rosall.c. In caz ca nu exista redirectare rezultatul este afisat la iesirea standard. Optiuni: -v permite transformarea(filtrarea) caracterelor neimprimabile intr-o forma imprimabila. -n permite numerotarea liniilor
4. 2 Afisarea fisierelor pe pagini: more Comanda more permite afisarea fisierelor pagina cu pagina.
$ ls -l total 20 -rw------- 1 centre users 374 2006-01-18 22:49 rc2.conf -rw------- 1 centre users 93 2006-01-19 02:57 ros1.c -rw-r--r-- 1 centre users 191 2006-01-19 02:59 rosall.c -rw------- 1 centre users 98 2006-01-19 02:54 rosout.c drwxr-xr-x 3 centre users 4096 2006-01-19 00:15 test $ more rc2.conf erface] is set to "yes", this overrides any other settings. # If you don't have an interface, leave the settings null ("").
28
# Config information for eth0: IPADDR[0]="192.168.189.202" NETMASK[0]="255.255.255.248" USE_DHCP[0]="" DHCP_HOSTNAME[0]="" # Config information for eth1: IPADDR[1]="" NETMASK[1]="" USE_DHCP[1]="" DHCP_HOSTNAME[1]="" # Config information for eth2:
Pentru afisarea tuturor diferentelor folosim optiunea l care un tablou cu trei coloane: - prima coloana reprezinta pozitia caracterului in fisier;
29
- a doua si a treia coloana sunt respectiv caracterele care difera in cele doua fisiere; Optiunea s: nu afiseaza nici un rezultat, dar trimite codul de retur(1: fisiere diferite, 0: caz contrar).
4.5 Determinarea tipului unui fisier: file Comanda file permite recunoasterea naturii unui fisier gratie numarului magic pe care il contine. Numarul magic corespunde in general primilor doi octeti din fisier
$ file * f1: ASCII text f2: ASCII text rc2.conf: ASCII English text ros1.c: ASCII C program text rosall.c: ASCII C program text rosout.c: ASCII C program text test: directory $
30
4.6 Listarea manualului unei comenzi: man Comanda man permite afisarea manualului on-line.
$ man printenv $
printenv
Cu optiunea l (ps l) putem vedea structura arborescenta de creare a proceselor. Un proces este taiat cu ajutorul comenzii kill. kill [-signal] pid
$ kill -9 1606 $ [2]+ Killed tex $ ps PID TTY TIME CMD 1586 ttyp1 00:00:00 bash 1602 ttyp1 00:00:00 vi 1609 ttyp1 00:00:00 ps
5.1 Generalitati despre Bourne Shell Shell-ul furnizeaza facilitati pentru memorarea informatiilor utile si transferarea lor intre programe. Variabilele constau intr-un nume si o valoare asociata.
32
De exemplu putem defini o variabila NUME care sa fie directorul de lucru /home/clasa/nume_x, iar apoi tastam cd $NUME. Ne referim la valoarea variabilei prin prefixul $ la numele sau. Tipuri de variabile: Variabilele Shell sunt sunt create in interiorul shell-ului si sunt folosite pentru memorare temporara de informatii si pentru controlul executiei script-urilor shell. Variabilele de environment sunt utilizate de diverse comenzi ale shell-ului si de diverse comenzi sistem. Ele sunt numite de environment deoarece ele sunt exportate catre toate procesele child ale shell-ului(procesele lansate de shell). 1. Variabile initializate automat si care nu trebuiesc modificate:HOME, LOGNAME,USER. 2. Variabile initializate automat si care pot fi modificate: SHELL, PATH, TERM 3. Variabile care sunt initializate de utilizator in fisierul propriu .profile sau oricand in mod interactiv. Initializarea variabilei se face astfel: $ VARIABILA=valoare $ export VARIABILA Comanda export indica faptul ca variabila este de environment. Daca nu facem export este considerata variabila ordinara. Principalele variabile sunt: HOME, USER si LOGNAME TERM PATH contine lista cu directoarele in care shell-ul cauta o comanda; numele directoarelor sunt separate prin : SHELL contine numele shell-ului de login MAILcontine numele locatiei de mail (/usr/spool/mail/$LOGNAME) MAILCHECK intervalul de control pentru intrari mail PS1 valoarea primului prompt( default $<space>)
33
PS2 valoarea celui de al doilea prompter(default > <space>) Sintaxa numelui variabilelor: un nume de variabila incepe cu o litera si este urmata de caractere alfanumerice. Prin conventie variabilele de environment sunt nume cu majuscule. Exemple
$ pwd /home/centre $ $ echo $HOME /home/centre $ PS1=SALA SALApwd /home/centre SALAPS1=SALA: SALA: SALA:pwd /home/centre SALA:echo $PS1 SALA: SALA:echo $HOME /home/centre SALA:ls Desktop a2p a2ps aa.txt bin info kill.txt ls.txt programe ps.txt temp SALA:cd programe SALA:ls f1 f2 rc2.conf ros1.c rosall.c rosout.c test SALA:cd test SALA:ls rc1 surse SALA:pwd /home/centre/programe/test SALA:PS1=$ $HOME=/home/centre/programe/test $pwd /home/centre/programe/test $cd $pwd /home/centre/programe/test $cd /home/centre $pwd /home/centre $cd $HOME
34
Fiecare proces creaza un numar de variabile de environment. Comanda env permite cunoasterea listei de variabile care sunt exportabile.
$ env CPLUS_INCLUDE_PATH=/usr/lib/qt/include:/usr/lib/qt/include MANPATH=/usr/local/man:/usr/man:/usr/X11R6/man:/usr/lib/java/man:/usr/lib/qt/doc/man:/usr/sh are/texmf/man HZ=100 KDE_MULTIHEAD=false HOSTNAME=pc34.inmh.ro TERM=xterm WINDOW_MANAGER=metacity GTK2_RC_FILES=/etc/gtk-2.0/gtkrc:/root/.gtkrc-2.0:/root/.kde/share/config/gtkrc GS_LIB=/root/.fonts GTK_RC_FILES=/etc/gtk/gtkrc:/root/.gtkrc:/root/.kde/share/config/gtkrc HUSHLOGIN=FALSE WINDOWID=4194309 OLDPWD=/home/centre QTDIR=/usr/lib/qt KDE_FULL_SESSION=true USER=root GDK_USE_XFT=1 KDEDIR=/opt/kde SESSION_MANAGER=local/pc34:/tmp/.ICE-unix/1552 T1LIB_CONFIG=/usr/share/t1lib/t1lib.config MINICOM=-c on KONSOLE_DCOP=DCOPRef(konsole-1749,konsole) PATH=/usr/local/bin:/bin:/usr/bin LC_COLLATE=C PWD=/home/centre/programe/test INPUTRC=/etc/inputrc KONSOLE_DCOP_SESSION=DCOPRef(konsole-1749,session-1) JAVA_HOME=/usr/lib/java LANG=en_US PS1=$ PS2=> HOME=/home/centre/programe/test
35
5.2. Proceduri si parametri In Shell putem sa executam secvente de comenzi si se pot crea si programe complexe. Exemplu
$pwd /home/centre/programe/test $ $cat aa cat: aa: No such file or directory $cat > secv date echo -n directorul de lucru: ; pwd echo -n numarul de fisiere din catalogul de lucru ; ls | wc -l $ls -l total 12 -rw------- 1 centre users 31 2006-01-18 23:01 rc1 -rw-r--r-- 1 centre users 103 2006-01-20 05:28 secv drwxr-xr-x 3 centre users 4096 2006-01-19 00:15 surse $more secv date echo -n directorul de lucru: ; pwd echo -n numarul de fisiere din catalogul de lucru ; ls | wc -l $chmod 755 secv $secv bash: secv: command not found $./secv Fri Jan 20 05:29:27 EET 2006 directorul de lucru:/home/centre/programe/test numarul de fisiere din catalogul de lucru3 $pwd /home/centre/programe/test $vi secv reading secv $ $./secv Fri Jan 20 05:31:25 EET 2006 directorul de lucru:/home/centre/programe/test numarul de fisiere din catalogul de lucru3
36
$vi secv reading secv $./secv Fri Jan 20 05:32:19 EET 2006 directorul de lucru:/home/centre/programe/test numarul de fisiere din catalogul de lucru:3 $
Procedura prezentata este o procedura elementara fara parametri. Putem defini proceduri cu parametri, apelabili in aceeasi maniera ca si comenzile Unix. Acelasi program secv il modificam in secvp cu parametru (directorul de lucru) :
$cat secvp date echo -n directorul de lucru: $1 echo echo -n numarul de fisiere din catalogul de lucru: ; ls $1 | wc -l $ $sh secvp /home/centre Fri Jan 20 05:45:00 EET 2006 directorul de lucru: /home/centre numarul de fisiere din catalogul de lucru:11 $sh secvp /home Fri Jan 20 05:45:24 EET 2006 directorul de lucru: /home numarul de fisiere din catalogul de lucru:4 $sh secvp /usr/lib Fri Jan 20 05:45:35 EET 2006 directorul de lucru: /usr/lib numarul de fisiere din catalogul de lucru:1310
Prin conventie in interiorul comenzii Shell valorile diferitilor parametri sunt respectiv desemnati prin $1,$2.....$9. Se pot folosi alte variabile standard gestionati de Shell care dau informatii generale despre procese in curs: $* da lista parametrilor comenzii ($1....$9); $# da numarul de parametri ai comenzii apelate(fara $0 care este numele comenzii); $$ da numarul procesului Shell in curs; $! da numarul ultimului proces executat in background; $? da valoarea codului de retour(exit-status) a ultimei comenzi executate;
37
$ cat >secv2 ps -l echo $# echo $$ echo $* $ $ chmod 755 secv2 $ $ sh secv2 v e r i t y F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD 4 S 1002 1764 1751 0 76 0 - 652 wait4 ttyp1 00:00:00 bash 0 S 1002 1857 1764 0 78 0 - 625 wait4 ttyp1 00:00:00 sh 0 R 1002 1858 1857 0 79 0 - 841 ttyp1 00:00:00 ps 6 # numarul de parametri 1857 # numarul procesului in curs verity # lista de parametri $
$ls rc1 secv secv2 secv3 secvp surse $ls -l prog1 ls: prog1: No such file or directory $echo $? 1 $test -f prog1 $echo $? 1 $ls -l secv -rwxr-xr-x 1 centre users 104 2006-01-20 05:32 secv $test -f secv $echo $? 0 $
5.3.2 Selectia if then else format: if < lista de comenzi 1 > then < lista de comenzi 2 > else <lista de comenzi 3 > fi
Lista de comenzi 2 este executata daca codul de retur al listei de comenzi 1(codul de retur al ultimei comenzi din lista) este nul, iar daca nu se executa lista de comenzi 3. 5.3.3 Iteratia for Un utilizator are posibilitatea de a executa o lista de comanda pentru o lista de valori data. for <variabila> do <lista de comenzi> done
39