M06 UF2:  Automatització de tasques i llenguatges de guió
ASIX-2
GNU/Linux
Scripts de l'interpret d'ordres bash de GNU/Linux (I)
09/02/17

Scripts o arxius de guió de de l'interpret d'ordres bash de GNU/Linux(I)

Documentació
1- http://www.tldp.org/LDP/abs/html/
2- http://tldp.org/HOWTO/Bash-Prog-Intro-HOWTO.html
3- http://linuxconfig.org/bash-scripting-tutorial
4- Exemples

0- El  "shebang"

El shebang en linux correspon a el conjunt de caràcter #! el quals són utlitzats pel sistema per saber que el fitxer és un script (arxiu de guió) i que a continuació s'indica quin és l'interpret utilitzat per executar el script. El shebang s'ha d'escriure sempre al principi de qualsevol script. Així doncs, pel cas de scripts que han de ser executats per bash (interpret d'ordres de Debian, Ubuntu, Red Hat....) qualsevol arxiu de guió hauria de començar per:

#! /bin/bash

1- Definició de variables del shell
a) Són variables definides per l'usuari des del shell de Linux, i que poden ser utilitzades en qualsevol moment per desarr dades. Una variable no és res més que una paraula (cadena de caràcters) a la qual assignem un valor que podria ser un nombre, nom de directori, nom de fitxer, nom de dipositiu, un caràcter, una cadena de caràcters i qualsevol altre tipus de dada.

b)
Una variable ha de definir-se abans de poder ser utilitzada, donant-li un nom i indicant a que és igual. El nom d'una variable ha de complir les següents normes:
     *Ha de incloure lletres o nombres o _
     *No pot començar amb un nombre
     *No admet els caracters &, ! i espai en blanc
     *No pot tenir més d'una paraula.

c)
Una variable es defineix així:
    nom_variable=valor_variable


d)
Exemples:
    cadena=hola
    dada=5
    nom="Joan Pérez"

e)
Per cridar al contingut d'una variable s'ha posar al davant el signe $. Si ara escrivim echo $nom, veurem per pantalla la paraula hola.Si fem que dirusr=/home/usuari, llavors cd $dirusr ens portarà al directori /home/usuari.

2- Varables de sistema i delimitadors de cadenes.
A una variable de sistema li podem passar qualsevol cadena de caracters, que pot tenir com origen tant el fitxer standard d'entrada (el teclat) com el resultat d'una ordre. Alguns d'aquests caracters són especials i cal delimitar-los, i d'altra banda cal també delimitar quan estem passant una ordre o una simple cadena de caracters (no és el mateix voler igualar una variable al resultat que dóna la instrucció ls que voler igualar la mateixa variable a la cadena ls tractada simplement com una paraula de dues lletres). Els delimitadors utilitzats són els següents: a) Cometes b) Apòstrof( invertits i no invertits) c) Contrabarra \.
Els caracters especials amb els quals podem tenir problemes i cal delimitar són els següents: ? * . [] & $ i l'espai en blanc.

a) Delimitació de caracters amb Cometes.

Poden delimitar tots els caracters especials, menys $.Exemple:
name=Pere
nom="Hola, soc $name"
echo $nom

Per pantalla sortirà => Hola, soc Pere

b) Apòstrof no invertit.

Delimiten tots els caracters, inclòs $. Exemple:
name=Pere
nom='Hola, soc en $name'
echo $nom

Per pantalla sortirà => Hola, soc en $name

c) Contrabarra \

Delimita només un carácter especial (el que troba després de la contrabarra). Exemple:
name=Pere\ Carbonell (delimita l'espai en blanc)
premi=1000\$ (delimita $)
missatge="En $name ha guanyat $premi"
echo $missatge

El resultat serà => En Pere Carbonell ha guanyat 1000$.

d) Apòstrof invertits.

Serveixen per delimitar el resultat d'una ordre, es a dir, fan que la variable s'iguali al resultat de l'execució d'una ordre. Exemple:
listusr=`ls  -ls  /home/usr`
echo $listusr

Sortirà per pantalla => Llistat dels fitxers que hi han al directori /home/usr.
Veiem doncs, que els apòstrofs invertits forcen a executar primer l'ordre i després a igualar el resultat a la variable de sistema.

3-  Els arxius de guió o scripts del shell.
Un arxiu de guió o script és un arxiu de texte on s'han escrit i agrupat una o més ordres del shell de Linux en l'ordre que utilitzariem si les executessim una per una des del shell. La finalitat d'utilitzar arxius de guió és la de crear programes que ens permetin automatitzar treballs, de manera que puguem estalviar temps i disminuir el risc d'quivocació.  Creant un arxiu de guio, de fet, estem definint una nova ordre del Linux.
Un arxiu de guió és equivalent a un arxiu de processament per lots (arxius BAT) del dos, tot i que no cal que tingui obligatoriament una determinada extensió (de fet, no cal que tingui extensió, si així ho desitgem). D'altra banda els arxius de guió són la base de la configuració d'un sistema amb Linux i per tant molt més importants que els fitxers BAT.
Per crear un arxiu de guió del shell, tenim dos camins: a) Utilitzar l'ordre cat b) Treballar amb un editor de texte (ASCII). La primera opció només es vàlida per arxius de guió molt petits i senzills. Pels casos més complexes i llargs, hem d'utilitzar un editor de texte, com per exemple els editors nano, joe, vi o emacs que sempre es troben presents a totes les distribucions Linux. Tot i que vi o emacs són més complets, nano és ideal per la seva senzillesa de manegament per crear arxius de guió del bash. Les seves principals ordres es poden veure permanentment a la pantalla, utilitzant la comanda Ctrl+K H un cop hem entrat dins de l'editor. Per cridar a aquest editor simplement hem d'utilitzar la comanda joe. Des de l'entorn gràfic podem utilitzar els editor kate, kedit, gedit o geany.

3.1- L'ordre chmod

Un cop hem creat un arxiu de guió, l'hem de fer executable perquè realment s'utilitzi com una ordre del Linux. Això es fa amb l'ordre chmod de la següent manera:

chmod +x nom_arxiu_guió

3.2- Pas de paràmetres en línia
Si volem passar un paràmetre en línia a un arxiu de guió, hem d'utilitzar l'argument $ seguit de la posicío del paràmetre dins de la línia ($1 pel primer paràmetre, $2 pel segon i així succesivament). Per exemple, el següent fitxer de nom lstusr imprimeix per pantalla els fitxers del directori /home/nom_directori amb l'extensió indicada, passant com a paràmetres el nom del directori i l'extensió:
cd /home/$1
ls *.$2

Si volem veure tots els fitxers amb extensió gz del directori /home/pere, hauria de fer la crida: lstusr  pere  gz

4- echo

Escriu a continuació la cadena de caràcters que li passem com a paràmetre i fa el canvi de línia. Especialment útil per treballar amb fitxers de guió. Les " i ' són caràcters delimitadors que s'utilitzen normalment amb echo.

Exemples:

echo Hola  ---> retorna Hola
echo "Hola món" 
---> retorna Hola món
nom_usuari=Pere
echo "Hola $nom_usuari"
---> retorna Hola Pere
echo 'Hola $nom_usuari' ---> retorna Hola $nom_usuari

Si no volem realitzar canvi de línia hauriem d'utilitzar el paràmetre -n. Exemple:

echo -n "Dóna el primer valor de la multiplicació: "

5- Variables especials del shell: # * ?


#  
Nº d'arguments passats a un arxiu de guió.
*   Cadena d'arguments passats a un arxiu de guió.
? Codi de retorn de l'última ordre executada. Si val zero, vol dir que no s'ha produit cap error executant l'ordre. Si és diferent de zero, és que s'ha produït un error.

Exemple. Si fem un programa de nom lstusr1,amb les següents instruccions:

ls -$1 /home/$2/*$3
echo $#
echo $*
echo $?

Quan faci la crida lstusr1  s  pere  gz llavors, sortirà un llistat de tots els fitxers amb extensió gz del directori home/pere, amb la seva mida, i a continuació el nombre 3, i després s pere gz, o sigui una cosa com:

lstusr s pere gz

29 /home/pere/index.gz
25 /home/pere/fitx0_comp_gz.gz
38 /home/pere/fitx1_comp_gz.gz
29 /home/pere/SCSI-HOWTO.gz
0
3
s pere gz

però, si el directori pere no existís, o l'opció fos incorrecta, llavors en comptes del 0, sortiria un 1. 

6- read
Tot allò que s'introdueixi des de teclat serà assignat a una variable. És equivalent a fer un cin o un scanf del llenguatge C. Si volem tractar els caràcters especials com per exemple $, *, ? / [ \ ] ( ) < > >>, com a caràcters normals , llavors els hem de delimitar amb cometes o cometes dobles. En cas contrari seran considerats com a caràcters especials. L'ordre read s'utilitza bàsicament dins d'arxius de guió del shell, tot i que també pot ser cridat directament des del shell.

Si volem executar un arxiu de guió que faci el mateix que hem vist a l'apartat anterior, però que demani a l'usuari les dades per teclat, farem el següent:

echo "Dona opció:"
read opcio
echo "Dona directori:"
read directori
echo "Dona extensió:"
read extensió
ls -$opcio /home/$directori/*.$extensio
echo $?
echo $#
echo $*

Si volem utilitzar l'ordre read per introduir una contrasenya, hem d'utilitzar l'opció -s de l'ordre. Per exemple:

echo -n "Escr
iu la contrasenya de l'usuari: "
read -s CTSNYA

7- Avaluació aritmètica amb expr

Amb l'ordre expr podem fer les operacions +   -   /   "*"  "<"  ">"  "<="  ">="  "!="  "==". Quan es fan comparacions el valor de $? serà 1 si és veritat i 0 si és fals.

Exemple 1
a=4
b=5
c=`expr $b + $a`
echo $c

9

Exemple 2
a=4
b=5
c=`expr $b ">=" $a`
echo $c

1 (és veritat)


8-  Comparació de cadenes de caràcters, de nombres i  comprovacions sobre fitxersi directoris amb l'ordre test o [ ]


Amb l'ordre test o [  ] podem  comparar cadenes de caràcters o fer  avaluacions (existeix, no existeix, permisos, mida, etc...) de  fitxers (o carpetes).

8.1- Avaluació directa de cadenes
Compara dues cadenes, i si el resultat de la comparació demanada és cert, dins de la variable $? tindrem un 0, i si no és cert, tindrem un 1.
Tipus de comparacions: " <"   ">"   "= ="  "!="

Exemples:

a=hola

b=adeu

c=hola

test   $a   ==   $b
o també   [  $a  ==  $b ]

echo $?

1

a=hola

b=adeu

c=hola

test   $a   "<"   $b
o  també [  $a  "<"  $b  ]

echo $?

1

a=hola

b=adeu

c=hola

test   $a   ">"   $b
o també   [  $a  ">"  $b  ]

echo $?

0

a=hola

b=adeu

c=hola

test   $a   ==   $c
o també   [  $a  ==  $b  ]

echo $?

0

a=hola

b=adeu

c=hola

test   $a   !=   $b
o també   [  $a  !=  $b  ]

echo $?

0

a=hola

b=adeu

c=hola

test   $a   !=   $c
o també   [  $a  !=  $b  ]

echo $?

1


8.2- Avaluació de fitxers

Té moltes opcions. Millor anar a el manual amb man test. Una de les opcions més important és -e que ens permet saber si un fitxer existeix o no.
Exemple: test  -e  /camí_al_fitxer/nom_fitxer o també  [   -e  
/camí_al_fitxer/nom_fitxer   ]
Si existeix, ens retorna 0 dins de la variable ?, i un 1 si no existeix.

Una altra opcio important és -s que retorna un 0 dins de la variable ? si un fitxer existeix i té una mida diferent a zero bytes.
Amb l'opció -d, ens diu si existeix el fitxer o no existeix, i si és un directori o no. Ens diu que és veritat (0 a la variable ?)si existeix i és directori.

8.3- Avaluació de nombres
Compara dos nombres, i si el resultat de la comparació demanada és cert, dins de la variable $? tindrem un 0, i si no és cert, tindrem un 1.
Tipus de comparacions:  -lt, -gt, -le, -ge,  -eq, -ne
Exemple: 
x=6
y=8
[  $x  -ne  $y  ]
echo $?
0

8.4- Opcions -a, -o i !
Fan les operacions lògiques AND (-a), OR (-o) i NOT (!) amb els resultat de dues avaluacions.

Exemple:

x=5

y=6

z=7

[  $x  -ge  $y  -a  $z  -gt  $x  ]

1

x=5

y=6

z=7

[  $x  -ge  $y  -o  $z  -gt  $x  ]

0

9- Ordre if-then-else-fi

Comprova si una ordre ha estat executada amb èxit o si una expressió és correcta. En cas de que el resultat de la comprovació sigui veritat, executa una sèrie d'ordres, i si és falsa, n'executa unes altres. Funciona bàsicament igual que if-else de C. L'ordre then és equivalent a i  l'ordre  fi  }. També permet avaluar l'èxit o fracàs de l'execució d'una ordre del bash shell.

Estructura:
if ordre_o_expressió_linux
then
    ordre_linux_1
    ordre_linux_2
    ordre_linux_3
    ....................

else
    ordre_linux_N
    ordre_linux_N+1
     ....................

fi

Exemple 1:
Fes un arxiu de guió que ens permeti fer un llistat del directori en el qual es troba l'usuari, amb dues opcions: a) Veure mida dels fitxers b) Veure totes les característiques dels fitxers.
echo "Escriu s per llistar el directori amb la mida dels arxius"
echo "Escriu l per llistar totes les característiques dels arxius"
read opc
if  [  $opc  ==  "s"  ]
then
    ls -s
else
    ls -l
fi

Exemple 2:
Fes un arxiu de guió que ens permeti comprova si un fitxer existeix o no.
echo "Escriu el nom del fitxer: "
read nom
if  [  -e  $nom  ]
then
    echo "El fitxer $nom existeix"
else 

    echo "El fitxer $nom no existeix"
 fi

Exemple 3:
Fes el mateix programa que el de l'exemple 2 però canviant test per [  ].
echo "Escriu el nom del fitxer: "
read nom
if  [ -e  $nom ]
then
    echo "El fitxer $nom existeix"
else 

    echo "El fitxer $nom no existeix"
 fi

Exemple 4:
Fes un arxiu de guió que ens permeti fer un llistat del directori en el qual es troba l'usuari, amb dues opcions: a) Veure mida dels fitxers b) Veure totes les característiques dels fitxers.
echo "Escriu s per llistar el directori amb la mida dels arxius"
echo "Escriu l per llistar totes les característiques dels arxius"
read opc
if  [  $opc  ==  "s"  ]
then
    ls -s
else
    ls -l
fi

Exemple 5:
Fes un arxiu de guió que mostri el missatge "Valor negatiu" si un nombre donat per l'suari és menor a 0 i que mostri el missatge "Valor positiu" si el valor donat és més gran o igual a 0
echo "Escriu el nombre:"
read num
if   test  $num  -ge  0
then
    echo "El valor és positiu"
else
   
echo "El valor és negatiu"
fi

10- Ordre case-in-esac

a)
Permet escollir entre des o mes camins d'execució d'ordres alternatius.
b)
La selecció es fa comparant un valor_comparat amb diversos valors_de_comparació. Quan el valor_comparat coincideix amb un valor_de_ comparació, llavors, s'executen les ordres associades a aquest valor_de_comparació.
c)
L'equivalent a default de C, és *
d)
Sempre finalitza amb esac.

Estructura: 
case valor_comparat in
    valor_de_comparació_1)  ordre
                                                    ordre;;

    valor_de_comparació_2) ordre
                                                    ordre
                                                  ordre;;

    valor_de_comparació_3) ordre;;

    ..........................................
    ..........................................

    *)  ordre_per_defecte
        ordre_per_defecte;;
esac

Exemple 1:
echo " a) Llistat del directori /home/pere"
echo " b) Llistat del directori /home/joan"
echo " c) Llistat del directori /home/anna"
echo " d) Llistat del directori /home/maria"
read opc
case $opc in
    a) ls -ls /home/pere;;
    b) ls -ls /home/joan;;
    c) ls -ls /home/anna;;
    d) ls -ls /home/maria;;
    *) echo "Opció incorrecta";;
esac

Exemple 2:
case "$1" in
     'start')
         /usr/app/startup-script
         ;;
     'stop')
         /usr/app/shutdown-script
         ;;
     'restart')
         echo "Usage: $0 [start|stop]"
         ;;
esac

11- Ordre while-do-done

Estructura:
while ordre_o_expressió_linux
do
    ordres_linux
done

Executa ordres_linux mentre es compleixi ordre_o_expressió_linux. Sempre acaba amb done. Abans d'entrar en el llaç s'avalua la condició d'entrada.

Exemple:
<Fitxer_càlcul_doble>
a=1
while
test $a -le 4
do
    b=`expr $a "*" 2`
echo $b
a=`expr $a +1`

done
echo "Adéu i fins una altra ocasió"

El resultat serà:
2
4
6
8
Adéu i fins una altra ocasió

Exemple 2
verifica="n"
while [ "$verifica" != y ]
do
    echo "Entra opció: "
    read opció
    echo "Has entrat l'opció  $option.  És correcte? (s/n)"
    read verifica
done

12- Ordre until-do-done

Estructura:
until condició
do
    ordres_linux
done

Executa ordres_linux, i s'executarà fins que no es compleixi condició no sortirem del llaç. Sempre acaba amb done. Abans d'entrar en el llaç no s'avalua la condició d'entrada.

Exemple:
a=5
until
test $a -le 4
do
    b=`expr $a "*" 2`
    echo $b
    a=`expr $a +1`

done
echo "Adéu i fins una altra ocasió"

a diferència de while, que no faria res en un cas com aquest, until s'executarà i no s'aturarà fins que $a sigui més petit o igual a 4, cosa que aquí no pot passar mai.

13- Ordre for-in do-done

Estructura:
for variable in llista
do
    ordres_linux
done

Funciona de la següent manera:
1r) Assigna a variable al primer valor de llista
2n) Executa ordres_linux
3r) Assigna variable al següent valor de la llista
4t) Executa ordres_linux
5è) Torna al 3r pas fins que s'acabin les variables de la llista.

Exemple 1:


for 
in  script.sh  dades.pdf   document.odt
do
    gzip $a
done
echo "Fitxers comprimits"

Comprimeix tots els fitxers que hi ha  a la llista i que es trobin al directori de treball actual.

Exemple 2:


for  in  *.gz
do
    gzip  -d  $a
done
echo "Fitxers descomprimits"

Descomprimeix tots els fitxers amb extensió .gz que es trobin al directori de treball actual.


Exemple 3

for a in 1 2 3 4
do
    b=`expr $a "*" 2`
echo $b
done

El resultat serà:
2
4
6
8                                                                        

Exemple 4


for 
in  {1..5}   #
{START..END}
do
    b=`expr $a "*" 2`
echo $b
done

El resultat serà:
2
4
6
8       
10                                                                                 

Exemple 5


for 
in  {1..5..2}  #
{START..END..INCREMENT}
do
    b=`expr $a "*" 2`
echo $b
done

El resultat serà:
2
6
10


Exemple 6


for 
in  {1..10..4} 

do
    b=`expr $a "*" 2`
echo $b
done

El resultat serà:
2
10
18

Nota: Només farà 1, 5 i 9.                                     


Exemple 7

#!/bin/sh
logfile="/var/log/messages"
for mon in Sun Mon Tue Wed Thu Fri Sat
do
   grep $mon $logfile > $logfile.$mon
done


El resultat serà un fitxer de log diferent per cada dia de la setmana, a partir del fitxer de log general /var/log/messages

14- Ordres break, continue i exit
a) break:
Finalitza un llaç until, while o for, i passa el control a primera ordre que es trobi després de la paraula clau done.
b) continue:
Atura until, while o for, i torna a començar de nou.
c) exit n:
Finalitza l'execució de l'arxiu de guió del bash shell, i assigna el valor n com a codi de retorn (que normalment serà un zero si tot ha anat bé, i diferent de zero en cas contrari).

PRÀCTICA


1- S'ha de fer un script per l'usuari root, en el qual se li demanin totes les dades necessàries per crear un usuari (1). Un cop donades les dades, el programa crearà l'usuari. L'arxiu de guió mostrarà per pantalla la nova entrada per l'usuari creat dins del fitxer /etc/passwd. Si l'arxiu de guió no pot crear l'usuari, ha de finalitzar la seva execució enviant al sistema el valor 1 com a codi de retorn. Si l'arxiu de guió finalitza correctament i amb èxit,  assignarà el valor 0 com a codi de retorn. El nom del script serà crtusr.sh.

2-
S'ha de fer un script per l'usuari root, en el qual se li demanin totes les dades necessàries per esborrar un un usuari (1).  L'arxiu de guió ha de demanar-nos si volem esborrar completament l'usuari o si només volem esborrar el compte però no el seu directori personal. Un cop donades les dades, el programa esborrarà l'usuari. Si l'arxiu de guió no pot esborrar l'usuari, ha de finalitzar la seva execució enviant al sistema el valor 1 com a codi de retorn i enviant a la pantalla el missatge "L'usuari no ha estat esborrat".  Si l'arxiu de guió finalitza correctament i amb èxit,  assignarà el valor 0 com a codi de retorn i enviarà a la pantalla el missatge "L'usuari ha estat esborrat correctament". El  nom del script serà esbrrusr.sh.

3-
S'ha de fer un script per l'usuari root, en el qual se li demanin totes les dades necessàries per crear un grup d'usuaris (1). Un cop donades les dades, el programa crearà l'usuari. El programa mostrarà per pantalla la nova entrada per l'usuari creat dins del fitxer /etc/group. Si l'arxiu de guió no pot crear el grup, ha de finalitzar la seva execució enviant al sistema el valor 1 com a codi de retorn. Si l'arxiu de guió finalitza correctament i amb èxit,  assignarà el valor 0 com a codi de retorn. El nom del script serà crtgrp.sh.

4- S'ha de fer un script per l'usuari root, en el qual se li demanin totes les dades necessàries per esborrar un grup d'usuaris (1).  Un cop donades les dades, el programa esborrarà l'usuari. Si l'arxiu de guió no pot esborrar el grup, ha de finalitzar la seva execució enviant al sistema el valor 1 com a codi de retorn i enviant a la pantalla el missatge "El grup  no ha estat esborrat".  Si l'arxiu de guió finalitza correctament i amb èxit,  assignarà el valor 0 com a codi de retorn i enviarà a la pantalla el missatge "El grup ha estat esborrat correctament". El  nom del script serà esbrrgrp.sh.

5- Realitza un script de nom opc.sh que mostri per pantalla un menú que doni l'opció d'escollir entre les opcions:
a) Executa crtusr.sh
b)
Executa sbrrusr.sh
c)
Executa crtgrp.sh
d)
Executa esbrrgrp.sh
En cas de no escollir cap opció el programa finalitzara mostrant el missatge "Opció escollida incorrecta".

6- S'ha de fer un script per l'usuari root, en el qual se li demanin totes les dades necessàries per configurar una interfície de xarxa de manera manual. L'arxiu de guió demanarà a l'usuari la interfície que vol configurar, l'adreça IP que vol donar-li, la màscara de subxarxa, l'adreça IP del router i les adreces dels servidors DNS primari i secundari (2)  i (3).  A continuació el script executarà les ordres adequades per fer la configuració de xarxa, i mostrarà per pantalla la configuració de manera que l'usuari pugui comprovar que la configuració s'ha realitzat amb èxit. Abans de finalitzar l'arxiu de guió preguntarà si està segur d'haver finalitzat correctament la configuració. En cas de que respongui amb n tornarà a començar el procès de configuració. Si escriu s l'arxiu de guió finalitzarà la seva execució assignant el valor 0 com a codi de retorn si ha arribar al final amb èxit. El nom de l'arxiu de guió serà ifconf.sh.

7- S'ha de fer un script per l'usuari root que faci la configuració d'una interfície de xarxa. Les dades han de passar-se com a paràmetres en línia. El primer paràmtre és la interfície, el segon l'adreça IP, el tercer paràmetre és la màscar, el quart l'adreça IP del router, el cinquè el servidor DNS primaria i el sisè el servidor DNS secundari. El sisè paràmetre és opcional de manera que el programa ha de controlar si l'hem passat 5 o 6 paràmetres.  El programa finalitza mostrant la nova configuració i assignant el valor 0 com a codi de retorn. El nom de l'arxiu de guió serà ipconf.sh.

8-
S'ha de fer un programa que ha de baixar-se un fitxer de no usuaris.ods d'aquest enllaç: http://www.collados.org/asix2/m06/uf2/usuaris.ods. A continuació el programa ha de convertir el fitxer .ods en un fitxer de texte pla .csv amb l'ajut que trobaràs a (4) o també a (6). Amb la llista d'usuaris en format .csv i l'ajut que trobaràs a (5), has de crear un usuari del sistema per cada usuari de la llista amb un nom d'usuari igual al de la llista i que sigui membre per defecte del grup users.  Comença  el número UID a partir del 3001 per seguretat. La resta de dades és al teu criteri personal. Si l'arxiu de guió finalitza correctament i amb èxit,  assignarà el valor 0 com a codi de retorn. El nom del script serà mltusr.sh.

9-  S'ha de fer un script per l'usuari root que faci la configuració bàsica d'un servidor DHCP. El programa ha de fer les següents tasques:

El nom de l'arxiu de guió serà dhcpd.sh.

10- Primer de tot instal·la el paquet del programa pwgen (generador de passwords aleatori). A continuació crea un script per l'usuar root, en el qual se li demanin totes les dades necessàries per crear un nombre N d'usuaris. El programa ha de:
11- Fes un arxiu de guió de l'interpret d'ordres bash shell per l'usuari root que copiï el fitxer resolv.conf que es troba a /etc  dins d'una carpeta del directori personal de root, el nom de la qual, has de passar com a paràmetre. Si la carpeta no existeix, l'arxiu de guió ha d'enviar un missatge a root, avisant-lo de que la carpeta no existeix, i preguntar-li si està segur de crear la carpeta. En el cas de que l'usuari root confirmi  la creació de la carpeta, l'arxiu de guió haurà de crear-la i continuarà la seva execució. En el cas de que l'usuari root no  ho confirmi, l'arxiu de guió deixarà d'executar-se, i tornarà a l'interpret d'ordres, assignant el valor 1 com a codi de retorn. Si l'arxiu de guió continua la seva execució, llavors farà una còpia de seguretat de resolv.conf amb el nom resolv.conf.backup.data a on data és el any, mes, dia, hora i minut de la realització de la còpia de seguretat (7). A continuació, el fitxer serà comprimit i s'btindrà el fitxer resolv.conf.backup.data.gz, i l'original resolv.conf.backup.data serà esborrat i també la còpia de resolv.conf que hi ha dins de la carpeta de l'usuari. L'arxiu de guió ha de finalitzar assignant el valor 0 com a codi de retorn si ha arribar al final amb èxit. El nom de l'arxiu de guió serà resolv.sh.

12- Fes un arxiu de guió de l'interpret d'ordres bash shell que pugui executar qualsevol usuari del sistema i que tingui les següents caracterísitiques:
Si escollim l'opció -e amb l'extensió i carpeta llavors, tots els arxiu que tingui la extensió indicada dins de la carpeta escollida seran moguts a una carpeta de nom paperera dins del directori personal de l'usuari. Si la carpeta paperera no existeix, l'arxiu de guió crearà la carpeta sense haver de donar cap avís a l'usuari. Si no hi ha cap fitxer amb l'extensió indicada llavors el programa enviarà a l'usuari el missatge "Els fitxers amb l'extensió indicada no existeixen", no farà res més, i finalitzarà de manera normal. Si la carpeta indicada no existeix, llavors el programa enviarà a l'usuari el missatge  "La carpeta indicada no existeix" , no farà res més, i finalitzarà de manera normal.

Si escollim l'opció -r, llavors
el programa esborrarà tots els arxius de la paperera (però, no esborrarà la carpeta). Si escollim l'opció -r i la paperera no existeix, llavors el programa enviarà a l'usuari el missatge "La paperera encara no existeix", no farà res més i finalitzarà de manera normal.

Un cop finalitzat el programa, s'eviarà al sistema el codi de retorn 0.
El nom de l'arxiu de guió serà
esb.sh.

13- Fes un arxiu de guio per treballar amb openLDAP i crear unitat organitzatives.  L'arxiu de guió ha de demanar el nom de la unitat organitzativa que es vol crear dins d'un domini ja existent el nom del qual també s'ha de demanar. Amb aquesta informació ha de crear un fitxer de tipus LDIF i de nom ou.ldif. Amb el fitxer ou.ldif i l'ordre ldapadd el fitxer haurà d'afegir la nova unitat organitzativa a la base de dades LDAP. Si no es pot crear la unitat organitzativa, el programa finalitzarà la seva execució enviant al sistema un codi de retorn igual a 1 i el missatge "LA UNITAT ORGANITZATIVA NO HA ESTAT CREADA".  Un cop creada la unitat organitzativa, el sistema hauria de mostrar la base de dades LDAP per comprovar que s'ha creat amb èxit.
Un cop finalitzat el programa, s'eviarà al sistema el codi de retorn 0. El nom del programa serà ouldap.sh.

14- Fes un arxiu de guio per treballar amb openLDAP i crear usuaris.  L'arxiu de guió ha de demanar:
    a) El nom de identificador de l'usuari que es vol crear
    b) El nom d'un domini ja existent
    c) El nom d'una unitat organitzativa  ja existent
    d) L'atribut cn de l'usuari
    e) L'atribut sn de l'usuari
    f) El número identificador d'usuari
    g) El número identificadot del grup per defecte de l'usuari
    h) El directori personal de l'usuari
    i) El shell de l'usuari
Amb aquesta informació ha de crear un fitxer de tipus LDIF i de nom user.ldif per poder. Amb el fitxer user.ldif i amb l'ordre ldapadd el fitxer haurà d'afegir el nou usuari a la base de dades LDAP. Si no es pot crear l'usuari, el programa finalitzarà la seva execució enviant al sistema un codi de retorn igual a 1 i el missatge "L'USUARI NO HA ESTAT CREAT". Un cop creat  l'usuari, el sistema hauria de mostrar la base de dades LDAP per comprovar que s'ha creat amb èxit.
Un cop finalitzat el programa, s'eviarà al sistema el codi de retorn 0. El nom del programa serà userldap.sh.

15- Fes un arxiu de guio per treballar amb openLDAP i afegir/modificar la contrasenya a un usuari.  L'arxiu de guió ha de demanar les dades de l'usuari:
    a) El nom identificador de l'usuari
    b) La unitat organitzativa a la qual pertany
    c) El domini de nivell superior
    d) El domini de nivell secundari
    e) La contrasenya (no s'ha de veure per pantalla)
Amb aquesta informació ha d'afegir/modificar el password de l'usuari a la base de dades LDAP. Si no es pot afegir/modificar el password de l'usuari, el programa finalitzarà la seva execució enviant al sistema un codi de retorn igual a 1 i el missatge "NO S'HA CREAT O MODIFICAT LA CONTRASENYA DE L'USUARI". Un cop afegida/modifcada la contrasenya de   l'usuari, el sistema hauria de mostrar la base de dades LDAP per comprovar que s'ha creat amb èxit. Un cop finalitzat el programa, s'eviarà al sistema el codi de retorn 0. El nom del programa serà pwdldap.sh.

LLIURAMENTS
LLiurament 1
LLiurament 2

NOTES

eh1)
Documentació sobre administració d'usuaris i grups
(2) En Debian, el fitxer a on es troba la llista dels servidors DNS és /etc/resolv.conf. Hauries de fer una còpia de seguretat del fitxer amb la data, hora i minut de creació. A continuació hauries d'esborrar el fitxer i després crear-ne un de nou.
(3)
Recordeu  l'utilitat dels símbols
> i >> .
(4)  Utilitza les opcions --headless i --convert-to de l'ordre libreoffice. En l'opció --convert-to no cal posar cap filtre. El filtre per defecte funciona. Per internet trobaràs exemples de conversió. També al man de l'ordre libreoffice.
(5)
https://shapeshed.com/unix-cut/ --> Compte amb els espais en blancs dels exemples!!!!!!
(6)
http://www.unix.com/shell-programming-and-scripting/154969-access-ods-files.html

(7) És fàcil afegir la data (any, mes, dia, hora, minut) al nom d'un fitxer. Si volem crear una variable de sistema que tingui el nom d'un fitxer  la data del moment de creació, podem fer això:
 data=`date +20%y%m%d%H%M`

 nom_fitxer=etcssh.$data
Si executem aquestes ordres el 20 d'octubre del 2009 a les 17h 45, llavors es crearà una variable de sistema de nom nom_fitxer, i el seu contingut serà etcssh.200910201745.