Gestiunea Serviciilor de Rețea

Laborator 03 - Shell scripting

IMPORTANT Dacă un pachet nu este instalat iar un exercițiu face referire la acesta, instalați-l.

1. Scripturi shell. Editare și rulare. Variabile (2p)

  • Comenzi/concepte/fișiere
    • script shell
    • echo
    • argumente în linia de comandă pentru un script
    • escaping (citare, întârziere)
    • redirectare
    • variabile în shell
    • globbing

Tutorial

  • Sarcinile din acest tutorial se rezolvă fiind autentificați ca root
  • Rulați comanda ifconfig eth0 pentru a afla informații despre setările intrefeței de rețea eth0. Redirectați aceste informații în fișierul /home/student/netinfo folosind comanda ifconfig eth0 > /home/student/netinfo
  • Rulați comanda route -n pentru a afla informații despre rutele configurate în sistem. Redirectați aceste informații la finalul fișierului /home/student/netinfo folosind comanda route -n >> /home/student/netinfo
  • Rulați comanda cat /etc/resolv.conf pentru a afla informații despre serverele DNS configurate în sistem. Redirectați aceste informații la finalul fișierului /home/student/netinfo folosind comanda cat /etc/resolv.conf >> /home/student/netinfo
  • puneți cele trei comenzi de mai sus într-un script numit getnetinfo.sh:
    • Adăugati drepturi de execuție scriptului getnetinfo.sh folosind comanda chmod +x getnetinfo.sh
    • Ștergeți fișierul netinfo și rulați scriptul folosind comanda ./getnetinfo.sh.
    • Modificați scriptul pentru a introduce în fișierul netinfo, între output-urile celor trei comenzi, câte o linie de tipul ”----------”:
  • Rulați din nou scriptul getnetinfo ./getnetinfo.sh.
  • Modificați scriptul pentru a înlocui numele fișierului netinfo cu o variabilă numită output_file. Variabila va fi inițializată înainte de rularea primei comenzi din script cu valoarea ”/home/student/netinfo”
Rezolvare
root@mjolnir:~# cat getnetinfo.sh
#!/bin/bash

OUTPUT_FILE="/home/student/netinfo"

ifconfig eth0 > $OUTPUT_FILE
echo "----------" >> $OUTPUT_FILE
route -n >> $OUTPUT_FILE
echo "----------" >> $OUTPUT_FILE
cat /etc/resolv.conf >> $OUTPUT_FILE

root@mjolnir:~# ./getnetinfo.sh

root@mjolnir:~# cat /home/student/netinfo 
eth0      Link encap:Ethernet  HWaddr 70:71:bc:18:1b:ea  
          inet addr:172.16.7.101  Bcast:172.16.7.255  Mask:255.255.252.0
          inet6 addr: fe80::7271:bcff:fe18:1bea/64 Scope:Link
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:4368 errors:0 dropped:0 overruns:0 frame:0
          TX packets:1852 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:3299370 (3.1 MiB)  TX bytes:303689 (296.5 KiB)
          Interrupt:43 Base address:0xa000 

----------
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.16.4.254    0.0.0.0         UG    0      0        0 eth0
172.16.4.0      0.0.0.0         255.255.252.0   U     1      0        0 eth0
172.16.20.0     0.0.0.0         255.255.255.0   U     0      0        0 vmnet1
192.168.48.0    0.0.0.0         255.255.255.0   U     0      0        0 vmnet8
----------
# Generated by NetworkManager
domain labs.cs.pub.ro
search labs.cs.pub.ro
nameserver 141.85.226.5
nameserver 141.85.241.113

></code>

=== Exerciții ===

<solution>

root@mjolnir:~# cat mydata.sh 
#!/bin/bash

prenume="Dorel"
nume="Zilieru"
specializare="macaragiu"

echo "$prenume\$$nume\$$specializare"

exit 0

root@pisr:~/scripts# ./mydata.sh 
Dorel$Zilieru$macaragiu
  • [02]. Scrieți și rulați un script bash numit args.sh care afișează:
  • [02].a. numărul de argumente primite în linia de comandă
  • [02].b. doar primele două argumente separate prin \ (backslash)
  • [02].c. exemplu de rezultat afișat pentru apelul args.sh a b: numarul de parametri este 2: param1=a\param2=b
  • [02].d. Ce se întamplă dacă scriptul primește mai puțin de două argumente?
  • [02].e. Hint: \, căutați “Positional Parameters” în http://tldp.org/LDP/abs/html/internalvariables.html
Rezolvare
root@mjolnir:~# cat args.sh 
#!/bin/bash

echo "numarul de parametri este $#: param1=$1\\param2=$2"

exit 0

root@pisr:~/scripts# chmod +x args.sh && ./args.sh a b
numarul de parametri este 2: param1=a\param2=b

root@pisr:~/scripts# chmod +x args.sh && ./args.sh a
numarul de parametri este 1: param1=a\param2=
  • [03]. Scrieți și rulați un script bash numit trunc.sh care primește ca parametru calea către un fișier și șterge conținutul acelui fișier (realizează operația de truncate).
  • [03].a. testați funcționarea scriptului creând un fișier cu conținut și ștergând conținutul.
Rezolvare
root@mjolnir:~# cat trunc.sh 
#!/bin/bash

> $1

exit 0

root@mjolnir:~# echo "ana are mere" > fis.txt

root@mjolnir:~# chmod +x trunc.sh 

root@mjolnir:~# ./trunc.sh fis.txt

root@mjolnir:~# ls -l fis.txt 
-rw-r--r-- 1 root root 0 Nov 16 18:49 fis.txt
  • [04]. Scrieți o comandă echo care afișează textul de mai jos. Va trebui să stabiliți ce primește echo ca parametru astfel încât output-ul să fie cel cerut.
  • [04].a. Verificați corectitudinea afișării copiind rezultatul comenzii echo într-o consolă nouă și rulând comanda rezultată. (Hint: ', ”, \)
    fis="stdio.h"; find /usr/include -type f -exec grep -H "^#include <$fis>" {} \; ; unset fis
Rezolvare
root@mjolnir:~# echo 'fis="stdio.h"; find /usr/include -type f -exec grep -H "^#include <$fis>" {} \; ; unset fis'
fis="stdio.h"; find /usr/include -type f -exec grep -H "^#include <$fis>" {} \; ; unset fis
  • [05]. Descarcați arhiva http://elf.cs.pub.ro/gsr/res/expresii_regulate.tar.gz și dezarhivați-o în /home/student. Scrieți un script numit reg.sh, care:
  • [05].a. Afișează toate fișierele din directorul ~/expresii_regulate ce încep cu litera a
  • [05].b. Afișează toate fișierele din directorul ~/expresii_regulate ce încep cu litera a și au extensia .c
  • [05].c. Afișează toate fișierele din directorul ~/expresii_regulate ce conțin cel puțin o cifră în nume
Rezolvare
student@mjolnir:~$ cat reg.sh 
#!/bin/bash

echo "fisierele ce incep cu litera a:"
ls expresii_regulate | grep ^a

echo "fisierele ce incep cu litera a si au extensia .c:"
ls expresii_regulate | grep ^a.*\.c$

echo "fisierele ce contin cel putin o cifra in nume:"
ls expresii_regulate | grep [0-9]

exit 0

2. Variabile. Expandare aritmetică (1p)

  • Comenzi/concepte/fișiere
    • expandare aritmetică
    • operatorul $(( ... ))

Tutorial

  • Rulați următoarele comenzi. Urmăriți valorile afișate:
    • echo "((5+4))"
    • echo "$((5+4))"
    • a=3
    • echo $a+4
    • b=$a+4 && echo $b
    • c=$(($a+4)) && echo $c

Exerciții

  • [01]. Scrieți și rulați un script shell numit mysum.sh care calculează suma a două numere transmise ca argumente.
  • [01].b. exemplu de rezultat pentru apelul ./mysum 5 3:
    5 + 3 = 8
Rezolvare
root@mjolnir:~# cat mysum.sh 
#!/bin/bash

echo "$1 + $2 = $(($1+$2))"

exit 0
  • [02]. Creați un script numit age.sh care primește ca parametri: prenume, nume, anul nașterii, anul curent și afișează numele, prenumele și vârsta curentă.
  • [02].a. Scrieți scriptul age.sh în mai multe variante, folosind:
  • [02].a.I. 3 comenzi echo
Rezolvare
root@mjolnir:~# cat age.sh 
#!/bin/bash

prenume=$1
nume=$2
an_nastere=$3
an_curent=$4

echo "Prenume: $prenume"
echo "Nume: $nume"
echo "Varsta: $(($an_curent - $an_nastere))"

exit 0
  • [02].a.II. 1 comandă echo
Rezolvare
root@mjolnir:~# cat age2.sh 
#!/bin/bash

prenume=$1
nume=$2
an_nastere=$3
an_curent=$4

echo "Prenume: $prenume
Nume: $nume 
Varsta: $(($an_curent - $an_nastere))"

exit 0
  • [02].b. Exemplu de output pentru apelul ./age.sh gogu sclipici 1979 2009:
    Prenume: sclipici
    Nume: gogu
    Varsta: 30

3. Structura condițională IF (2p)

  • Comenzi/concepte/fișiere
    • condiții în shell
    • if, then, else
    • test, [, [[

Tutorial

  • N/A

Exerciții

  • [01]. Realizați un script numit checkpar.sh care primește 2 parametri și îi afișează la ieșire. Dacă nu se dau exact 2 parametri, scriptul acesta afișează mesajul “Numărul de parametri este greșit”.
  • [01].a. Hint: $#, http://tldp.org/LDP/abs/html/comparison-ops.html - integer comparison
  • [01].b. Exemplu de output pentru apelul ./checkpar.sh a b:
    a
    b
  • [01].c. Exemplu de output pentru apelul ./checkpar.sh a:
    Numarul de parametri este gresit
Rezolvare
root@mjolnir:~# cat checkpar.sh 
#!/bin/bash

if [ $# -ne 2 ]
then
        echo "Numarul de parametri este gresit"
else
        echo "$1"
        echo "$2"
fi

exit 0
  • [02]. Scrieți și rulați un script numit even.sh.
  • [02].a. Scriptul primește ca argument un număr.
  • [02].b. Scriptul va afișa mesajul par sau impar în funcție de paritatea numărului primit ca argument.
  • [02].c. Scriptul se va întoarce cu eroare (exit 1) și va afișa un mesaj specific dacă se transmite un număr invalid de argumente (nici un argument sau mai mult de un argument).
  • [02].d. Hint: http://tldp.org/LDP/abs/html/arithexp.html, mergeți la exemplul 1 și căutați “modulo”
Rezolvare
root@mjolnir:~# cat even.sh 
#!/bin/bash

if [ $# -ne 1 ]
then
        echo "Numar gresit de argumente."
        exit 1
else
        mod=$(expr $1 % 2)
        if [ $mod -eq 0 ]
        then
                echo "par"
        else
                echo "impar"
        fi
fi
exit 0
  • [03]. Realizați un script numit checkfile.sh care:
  • [03].a. primește ca argument un string și verifică dacă un fișier cu acest nume există pe disc în directorul curent
  • [03].b. dacă fișierul nu există în directorul curent, acesta va fi creat cu numele dat ca argument
  • [03].c. dacă fisierul există pe disc în directorul curent, acesta va fi redenumit în <nume-fișier-initial>_exista unde nume-fisier-initial este argumentul transmis scriptului (numele fișierului)
  • [03].d. Rulați scriptul de 2 ori cu același parametru.
Rezolvare
root@mjolnir:~# cat checkfile.sh 
#!/bin/bash

if [ -e "$1" ]
then
        echo "fisierul $1 exista si a fost redenumit"
        mv $1 "$1_exista"
else
        echo "fisierul $1 nu exista dar a fost creat"
        touch $1
fi
exit 0
  • [04]. Scrieți și rulați un script shell numit user.sh care afișează:
  • [04].a. mesajul “adevarat” dacă utilizatorul curent este student;
  • [04].b. mesajul “fals” altfel.
  • [04].c. Testați în console în care sunteți autentificat ca student, respectiv root.
  • [04].d. Hint: whoami, http://tldp.org/LDP/abs/html/comparison-ops.html - string comparison
Rezolvare
root@mjolnir:~# whoami
root

root@mjolnir:~# echo $USER
root

root@mjolnir:~# cat user.sh 
#!/bin/bash

if [ "$USER" == "student" ]
then
        echo "adevarat"
else
        echo "fals"
fi
exit 0
  • [05]. Scrieți și rulați un script shell numit is_user.sh.
  • [05].a. Scriptul primește ca argument un șir de caractere reprezentând un nume de utilizator.
  • [05].b. Scriptul va afișa mesajul DA sau NU dacă șirul de caractere transmis ca argument reprezintă sau nu un nume valid de utilizator.
  • [05].c. Scriptul se va întoarce cu eroare (exit 1) și va afișa un mesaj specific dacă se transmit un număr invalid de argumente (nici un argument sau mai mult de un argument).
  • [05].d. Orice alte mesaje de ieșire/eroare trebuie suprimate.
  • [05].e. Hint: verificați codul de return, $?, al comenzii id
Rezolvare
root@mjolnir:~# cat is_user.sh 
#!/bin/bash

if [ $# -ne 1 ]
then
        echo "Numar nevalid de argumente"
        exit 1
fi 

id $1 &> /dev/null

if [ $? -eq 0 ]
then
        echo "DA"
else
        echo "NU"
fi
exit 0

4. Structuri repetitive (2p)

  • Comenzi/concepte/fișiere
    • for, do, done
    • seq

Tutorial

  • N/A

Exerciții

  • [01]. Realizați un script numit sum.sh care realizează suma primelor N numere naturale, unde N este dat ca parametru.
  • [01].a. Exemplu de output pentru apelul ./sum.sh 100:
    suma primelor 100 de numere naturale este 5050
Rezolvare
root@mjolnir:~# cat sum.sh 
#!/bin/bash

sum=0

for a in $(seq $1)
do
        sum=$(($sum + $a))
done

echo "Suma primelor $1 numere naturale este $sum."
exit 0
  • [02]. Scrieți și rulați un script shell numit ls_boot.sh
  • [02].a. Scriptul va folosi instrucțiuni repetitive pentru a afișa conținutul directorului /boot/.
  • [02].b. Scriptul va afișa pentru fiecare intrare "fisier $nume_fisier" sau "director $nume_director".
  • [02].b.I. $nume_fisier reprezintă numele fișierului (în cazul în care intrarea este fișier)
  • [02].b.II. $nume_director reprezintă numele directorului (în cazul în care intrarea este director);
  • [02].b.III. sirurile fisier și director vor fi afișate literal.
Rezolvare
root@mjolnir:~# cat ls_boot.sh 
#!/bin/bash

path=$(pwd)
cd /boot

for entry in $(ls)
do
        if [ -d "$entry" ]
        then
                echo "director $entry"
        else
                if [ -f "$entry" ]
                then
                        echo "fisier $entry"
                fi
        fi
done

exit 0

5. Filtre de text (2p)

  • Comenzi/concepte/fișiere
    • filtre de text
    • grep
    • tr
    • cut
    • wc

Tutorial

  • N/A

Exerciții

  • [01]. Scrieți un script clines.sh care primește ca parametru numele unui director și afișează numărul total de linii din toate fișierele din ierarhia de sub el.
  • [01].a. Hint: find –type f, wc -l
Rezolvare
root@mjolnir:~# cat clines.sh 
#!/bin/bash

sum=0

for file in $(find $1 -type f)
do
        filelines=$(wc -l $file)
        sum=$(($sum+$filelines))
done

echo "Suma liniilor este: $sum"
exit 0
  • [02]. Descărcați fișierul de la adresa http://elf.cs.pub.ro/gsr/res/winfile.txt. Scrieți o comandă prin care să convertiți fișierul text din format Windows (CRLF) într-unul Unix (LF) unixfile.txt.
  • [02].a. Hint: Hint: trebuie sa stergeti caracterul CR= '\015' folosind tr
  • [02].b. Pentru verificare folosiți comanda file
Rezolvare
root@mjolnir:~# file winfile.txt 
winfile.txt: ASCII English text, with CRLF line terminators

root@mjolnir:~# cat winfile.txt | tr '\015\012' '\012' > linuxfile.txt

root@mjolnir:~# file linuxfile.txt 
linuxfile.txt: ASCII English text
  • [03]. Realizați un script time.sh care, parsând comanda date, să afișeze mesajul: “Este ora X, minutul Y și secunda Z”.
  • [03].a Hint: cut
Rezolvare
root@mjolnir:~# cat time.sh 
#!/bin/bash

CURRENT_DATE=$(date)

hour=$(echo $CURRENT_DATE | cut -d " " -f 4 | cut -d ":" -f 1)
minutes=$(echo $CURRENT_DATE | cut -d " " -f 4 | cut -d ":" -f 2)
seconds=$(echo $CURRENT_DATE | cut -d " " -f 4 | cut -d ":" -f 3)

echo "Este ora $hour, minutul $minutes si secunda $seconds"

exit 0
  • [04]. Scrieți un script nousers.sh care afișează numărul de utilizatori reali din sistem. Utilizatorii reali au configurat directorul home în /home/$USER, unde $USER=numele utilizatorului.
  • [04].a. Hint: /etc/passwd, grep, wc -l.
Rezolvare
root@mjolnir:~# cat nousers.sh
#!/bin/bash

realusers=0

for line in $(cat /etc/passwd)
do
        user=$(echo $line | cut -d ":" -f 1)
        userpath="/home/$user"

        pathfield=$(echo $line | cut -d ":" -f 6)
        if [ -z $pathfield ]; then
                pathfield="."
        else
                if [ "$userpath" == "$pathfield" ]; then
                        realusers=$(($realusers + 1))
                fi
        fi
done

echo "Nr de utilizatori reali: $realusers"

exit 0
  • [05]. Scrieți un script numit getip.sh care primește numele unei interfețe de rețea și afișează adresa IPv4 alocată acesteia.
  • [05].a. Hint: ifconfig, grep -A, tr -s
Rezolvare
root@mjolnir:~# cat getip.sh 
#!/bin/bash

ifconfig $1 | grep "inet addr" | cut -d ":" -f 2 | cut -d " " -f 1

exit 0
  • [06]. Configurați variabila de mediu PATH, astfel încât să se poată rula scriptul getip.sh de oriunde din sistem, apelând doar numele acestuia în consolă.
Rezolvare
root@mjolnir:~# PATH=$PATH:/root

root@mjolnir:~# export PATH

root@mjolnir:~# echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/root

root@mjolnir:~# cd /home/student

root@mjolnir:/home/student# getip.sh eth0
192.168.145.135

6. Filtre de text avansate - sed (2p)

  • Comenzi/concepte/fișiere
    • TODO

Tutorial

  • N/A

Exerciții

  • [01]. Realizați un script bash filerename.sh care redenumeste toate fișierele din directorul curent ce respectă un anumit criteriu.
  • [01].a. Scriptul va primi 2 parametri:
  • [01].a.I. primul parametru este textul care se vrea înlocuit din numele unor fișiere
  • [01].a.II. al doilea parametru este textul cu care va fi inlocuit.
  • [01].b. Exemplu: Pentru a redenumi fișerele input1, input2, input în output1, output2, output se va folosi apelul: ./nume_script in out.
  • [01].c. Hint: se va folosi pe post de lista de parcurgere rezultatul comenzii ls dată pe directorul curent ($PWD).
Rezolvare
root@mjolnir:~# cat filerename.sh 
#!/bin/bash

in=$1
out=$2

for file in $(ls)
do
        result=$(echo $file | sed s/$in/$out/)
        mv $file $result &> /dev/null
done

exit 0
  • [02]. Folosind sed și wget realizați un script numit numlinks.sh care descarcă o pagină HTML pe stația locală și creează un nou fișier cu toate linkurile din pagina HTML descărcată. Urmăriți indicațiile de mai jos:
  • [02].a. Pentru a vedea cum arată un link în codul HTML consultați pagina http://www.w3schools.com/TAGS/tag_a.asp
  • [02].b. Pentru testare se va folosi http://elf.cs.pub.ro/gsr/res/pagina.html. Această pagină conține doar linkuri în forma cea mai simplă, pentru a nu complica scriptul. Puteți să analizati mai întâi sursa HTML a paginii din browser (View Source)
  • [02].c. Folosiți mai întâi wget pentru a descărca pagina local
  • [02].d. Parcurgeți pagina descărcată cu sed și introduceți un caracter /LF înainte și dupa fiecare link.
  • [02].e. Acum că fiecare link se află pe rândul său separat, se poate folosi grep pentru a selecta rândurile dorite.
Rezolvare
root@mjolnir:~# cat numlinks1.sh 
#!/bin/bash

wget http://elf.cs.pub.ro/gsr/res/pagina.html

cat pagina.html | sed -e 's/\(<a[^<]*<\/a>\)/\n\1\n/g' | grep href | cut -d "\"" -f 2 > linkuri.txt
cat linkuri.txt

exit 0

root@mjolnir:~# cat numlinks2.sh

wget http://elf.cs.pub.ro/gsr/res/pagina.html

cat pagina.html | sed s/"<a "/"\n<a "/g | sed s/"<\/a>"/"<\/a>\n"/g | grep http | cut -d "\"" -f 2 > linkuri.txt
cat linkuri.txt

exit 0
  • [03]. Creați un script numit fixphp.sh care primește ca argument un director și schimbă toate tag-urile <? in <?php din fișierele cu extensia php din respectivul director (TREBUIE incluse și fișierele PHP din eventuale subdirectoare ale directorului primit ca argument).
  • [03].a. Unele tag-uri sunt deja in forma <?php, acestea trebuie sa ramana la fel
  • [03].b. Pentru a testa scriptul folosiți http://elf.cs.pub.ro/gsr/res/mysite.tar.gz
Rezolvare
root@mjolnir:~# cat fixphp.sh 
#!/bin/bash

for file in $(find $1 | grep \.php$)
do
        cat $file | sed s/'<?'[^p]*$/'<?php'/ > $file.temp
        rm $file
        mv $file.temp $file
done

exit 0

7. Bonus

  • [01]. Folosiți ONE-LINER-ul de mai jos pentru a genera multe fișiere cu extensia .temp.
  • [01].a. Realizați un script numit deltmp.sh care șterge toate fișierele din directorul curent care au extensia .temp. Va trebui să folosiți comanda ls pe directorul curent ($PWD) în locul listei generate cu seq.
  • [01].b. Atentie: trebuie șterse doar fișierele ale căror nume se termină cu .temp
    for i in $(seq 1 10); do touch $i.temp; done
Rezolvare
root@mjolnir:~# cat deltmp.sh 
#!/bin/bash
for file in $(ls *.temp 2> /dev/null)
do
        rm -f $file
done

exit 0
  • [02]. Scrieți și rulați un script shell numit path.sh care:
  • [02].a. primește ca argument calea către un fișier
  • [02].b. afișează câte caractere are numele fișierului (numele fișierului, nu calea completă)
  • [02].c. afișează doar numele fișierului și doar extensia lui (Hint: http://tldp.org/LDP/abs/html/internalvariables.html)
  • [02].d. exemplu de ieșire a scriptului dacă este rulat cu parametrul resolv.conf:
    * Nume fișier: resolv.conf
    * Număr caractere: 11
    * Nume fișier: resolv
    * Nume extensie: conf
Rezolvare
root@mjolnir:~# cat path.sh 
#!/bin/bash
fileandpath=$1
name=$(basename $fileandpath)
echo "* Nume fisier si extensie: "$name
echo "* Numar caractere: "$(expr length $name)
echo "* Nume fisier: "${name%%.*}
echo "* Nume extensie: "${name#*.}

exit 0
  • [03]. Scrieți și rulați un script shell numit anotimp.sh.
  • [03].a. Scriptul primește ca argument o lună a anului în format numeric. (5, 9, 11 etc.)
  • [03].b. Scriptul va afișa anotimpul asociat acelei luni. (primavara, vara, toamna, iarna)
  • [03].c. Scriptul se va întoarce cu eroare (exit 1) și va afișa un mesaj specific dacă se transmite ca argument o lună invalidă. (număr negativ, 0 sau număr mai mare decât 12)
Rezolvare
root@mjolnir:~# cat anotimp.sh 
#!/bin/bash

if [ $# -ne 1 ]
then
        echo "Scriptul primeste doar un argument."
        exit 1
fi

if [ $1 -le 0 ]
then 
        echo "Luna nu poate fi mai mica sau egala cu 0!"
        exit 1
fi

if [ $1 -ge 13 ]
then
        echo "Luna nu poate fi mai mare sau egala cu 13!"
        exit 1
fi

case $1 in
        12|1|2)
                echo "iarna"
                ;;
        3|4|5)
                echo "primavara"
                ;;
        6|7|8)
                echo "vara"
                ;;
        9|10|11)
                echo "toamna"
                ;;
esac

exit 0
  • [04]. Se dorește crearea unui script care să adauge și să configureze un utilizator în sistem în mod non-interactiv (să nu se solicite input de la intrarea standard).
  • [04].a. Scrieți și rulați un script shell numit my_add_user.sh.
  • [04].b. Scriptul primește 3 argumente:
  • [04].b.I. un șir reprezentând numele de utilizatorul (username)
  • [04].b.II. un șir reprezentând grupul utilizatorului
  • [04].b.III. un șir reprezentând parola de acces la sistem pentru utilizator
  • [04].b.IV. Scriptul se întoarce cu eroare (exit 1) și afișează un mesaj specific în următoarele situații:
  • [04].b.IV.1 se transmit un număr necorespunzător de argumente (diferit de 3)
  • [04].b.IV.2 utilizatorul există deja în sistem
  • [04].b.IV.3 grupul nu există
  • [04].c. Scriptul adăugă în sistem utilizatorul
  • [04].c.I. cu numele de utilizator transmis ca prim argument
  • [04].c.II. în grupul transmis ca al doilea argument
  • [04].c.III. cu parola transmisă ca al treilea argument
  • [04].d. Directorul home al utilizatorului este /home/$group/$username/ unde
  • [04].d.I. $group este grupul transmis ca al doilea argument
  • [04].d.II. $username este numele de utilizator transmis ca prim argument
  • [04].e. Scriptul trebuie să fie non-interactiv.
  • [04].f. Scriptul trebuie rulat cu drepturi privilegiate.
Rezolvare
N/A
  • [05]. Scrieți 2 scripturi encrypt.sh și decrypt.sh care să facă o criptare, respectiv decriptare simple pe fișiere text folosind următorul algoritm: translatează literele mici și mari din alfabet cu 3 poziții înainte. Astfel: a → d, b → e…, x → a, y → b, z → c. Similar și pentru literele mari. Scripturile vor primi numele fișierelor de intrare și cele de ieșire ca parametri.
Rezolvare
N/A
  • [06]. Scrieți un script rename.sh care primește ca parametri două extensii și redenumește toate fișierele din directorul curent cu prima extensie, în cea de-a doua extensie.
Rezolvare
root@mjolnir:~# cat rename.sh 
#!/bin/bash

if [ $# -ne 2 ]
then 
        echo "numarul de argumente trebuie sa fie 2"
        exit 1
fi

ext1=$1
ext2=$2

for file in $(ls | grep ".$ext1$")
do
        name=${file%%.*}
        newname=$name.$ext2
        mv $file $newname
done

exit 0
laboratoare/laborator-03.txt · Last modified: 2011/11/16 19:32 by george.milescu