Es mostren els missatges amb l'etiqueta de comentaris Linux. Mostrar tots els missatges
Es mostren els missatges amb l'etiqueta de comentaris Linux. Mostrar tots els missatges

dimarts, 26 d’octubre del 2021

Gestió d'usuaris i grups en Linux

Usuaris i grups Linux 


Els comptes de Linux són com els comptes de Windows o MacOS; però els detalls no, així que cal explicar alguns detalls, com les convencions de nomenclatura d'usuaris, la naturalesa dels grups i com associa Linux els nombres que utilitza internament amb els noms d'usuari i noms de grup que la gent sol utilitzar.


En aquest article veiem com es gestionen els comptes d'usuari i de grup d'usuaris Linux usant comandaments, concretament veurem:

  • Fitxers /etc/passwd, /etc/group, /etc/shadow
  • Identificadors UID i GID
  • Comandaments:
    • chown
    • chgrp
    • newgrp
    • useradd
    • passwd
    • chage
    • userdel
    • groupadd
    • groupmod
    • usermod
    • gpasswd
    • groupdel



Els noms d'usuaris de Linux

Linux és bastant flexible en els noms d'usuari, en la majoria de distribucions poden estar construïts amb qualsevol combinació de lletres majúscules i minúscules, nombres i molts símbols de puntuació, incloent punts i espais; no obstant això, els espais i alguns altres elements causen problemes en determinades utilitats de Linux, per la qual cosa és preferible evitar-los. Els punts i els guions baixos poden utilitzar-se, doncs no causen problemes.

Els noms d'usuari poden tenir fins a 32 caràcters. A causa que Linux distingeix entre majúscules i minúscules, el mateix ordinador pot tenir dos usuaris diferents anomenats ellen i Ellen, que pot resultar confús, per la qual cosa és millor evitar crear comptes els noms dels quals d'usuari es diferenciïn solament en aquest detall; l'habitual és usar lletres minúscules. Els noms d'usuari no tenen per què estar basats en noms de pila.

Establir un mètode estàndard per crear noms d'usuari pot ajudar a localitzar un compte que pertanyi a un individu concret. No obstant això, si l'ordinador té molts usuaris, pot ser que algunes convencions de nomenclatura produeixin duplicats, en particular si l'estàndard que hem creat empra les inicials per tallar els noms d'usuari. Pot ser que hàgim de desviar-nos de l'estàndard o incorporar nombres per distingir els comptes d'usuari, ja que cada compte necessita un únic nom d'usuari.
Relacionar als usuaris mitjançant grups per millorar la productivitat.

Grups d'usuaris


Els grups d'usuaris són un mitjà per organitzar usuaris: estan definits en fitxers de configuració similars als dels usuaris, tenen noms similars als noms d'usuari i es representen internament mitjançant nombres.

Els grups no són comptes, sinó mitjans per organitzar col·leccions de comptes. Com a mesura de seguretat, Linux associa cada fitxer amb un grup específic, podent-se assignar diversos permisos als membres del grup. Com Linux proporciona accés a la majoria dels dispositius de maquinari a través de fitxers, podem utilitzar aquest mateix mecanisme per controlar l'accés al maquinari.

Cada grup pot tenir des de cap usuari fins a punts com tingui l'ordinador. També, un usuari pot estar en més d'un grup, i com a mínim ha d'estar en un grup. La pertinença als grups es controla mitjançant el fitxer /etc/group que conté una llista de grups i els membres que pertanyen a cadascun d'ells. Cada usuari posseeix un grup per defecte o primari, que es defineix en la configuració de l'usuari del fitxer /etc/passwd. Quan els usuaris creen fitxers o inicien programes, aquests fitxers i programes en execució s'associen amb el grup actual. Un usuari pot accedir a fitxers que pertanyen a altres grups sempre que ell pertanyi també a aquest grup i que estigui permès pels permisos d'accés del grup.


Canviar de grup: comandament newgrp

Utilitzarem newgrp per canviar la pertinença del grup actual, per exemple, per canviar el nostre usuari al grup project escriurem:

newgrp project

Si l'usuari ja pertany al grup project (i figura al  /etc/group) llavors després d'executar el comandament actuarem com a membre del grup project des del grup actual. Si l'usuari no hi pertany al nou grup, el sistema li demanarà contrasenya de root per afegir-lo.

Canviar un fitxer de grup i de propietari: comandaments chgrp i chown

Tots els fitxers gestionats pel sistema operatiu tenen assignat un usuari propietari i un grup d'usuaris propietari del fitxer. Podem canviar el grup associat amb un fitxer existent amb els comandos chgrp i chown. Per exemple, per canviar el grup al que pertany un fitxer anomenat dades al grup projecte:

chgrp projecte dades

En general:
chgpr grup fitxer

El comandament chown permet canviar el propietari del fitxer i també el seu grup; la sintaxi és:

chown [options] new_owner object(s)

Exemple:

chown user_pepe dades

Per canviar també al grup projecte:

chown user_pepe:projecte dades

si el grup de user_pepe és projecte, llavors no cal escriure el nom del grup.


Aquesta estructura de grups permet dissenyar un sistema de seguretat amb diferents col·leccions d'usuaris per treballar fàcilment amb els mateixos fitxers mentre evitem que altres usuaris del mateix servidor mirin en els fitxers als quals no haurien de tenir accés. És habitual utilitzar els grups per a diferents projectes, classes o grups de treball, en els quals cada usuari aquest restringit a un d'aquests grups.

Identificadors UID i GID


Linux defineix els usuaris i grups per números: ID d'usuari (UID) i ID de grup (GID), i en els fitxers /etc/passwd o /etc/group es pot localitzar el nom associat al número. 

Es reserva el primer centenar d'ID d'usuari i de grup, del 0 al 99, per a l'ús del sistema. El zero correspon a root, tant a l'usuari com al grup,  els següents nombres els utilitzen els comptes i grups que estan associats amb utilitats i funcions específiques de Linux, per exemple, UID 2 i GID 2 poden ser el compte i el grup daemon (serveis del sistema) i UID 8 i GID 12 podrien ser el compte i el grup de mail. No tots els nombres del 0 al 99 estan en ús, en general només una o dues dotzenes de comptes i una desena de grups. Podem consultar els fitxers /etc/passwd i /etc/group per determinar quins ID d'usuari i grup s'estan utilitzant.

Exemple: llistat de les 10 primeres línies del fitxer, els nombres en negreta són els UID 
$ cat /etc/passwd
root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
sync:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:/var/spool/lpd:/usr/sbin/nologin
mail:x:8:8:mail:/var/mail:/usr/sbin/nologin
news:x:9:9:news:/var/spool/news:/usr/sbin/nologin
uucp:x:10:10:uucp:/var/spool/uucp:/usr/sbin/nologin


La informació d'aquest fitxer és esquemàticament:




Exemple:
$ cat /etc/group
root:x:0:
daemon:x:1:
bin:x:2:
sys:x:3:
adm:x:4:syslog,jordi
tty:x:5:syslog
disk:x:6:
lp:x:7:
mail:x:8:
news:x:9:
uucp:x:10:


Més enllà del nombre ID = 100 les ID d'usuari i grup estan disponibles per als comptes d'usuari i grup normals. En crear comptes addicionals, el sistema localitza el següent nombre al més alt sense utilitzar. 

Quan eliminem un compte l'ID, es podrà reutilitzar, però les eines de creació automàtica de comptes no ho fan si els números subsegüents estan en ús, el que crea un salt en la seqüència. Això no és perjudicial tret que ens quedem sense números per a les ID (65536 usuaris per nuclis de 16 bits, els nuclis de 32 arriben a 4 mil milions d'usuaris). 

Reutilitzar un nombre d'ID pot provocar problemes si no eliminem els fitxers de l'antic usuari, ja que el nou usuari esdevindrà el propietari d'ells.

Configurar comptes d'usuari


En els petits equips personals no cal fer el manteniment dels usuaris, però, en els grans sistemes, on els usuaris van i vénen constantment, és possible que sigui necessari realitzar un manteniment diari. Per a això, cal conèixer les eines de configuració de comptes. Fins i tot en sistemes que canvien molt de tant en tant, és útil saber afegir, modificar o eliminar comptes d'usuari quan calgui.

Descriurem les eines de tipus comandament per a la creació i el manteniment dels comptes, tot i que la majoria de distribucions tenen eines GUI amb les mateixes funcionalitats que varien segons la distribució o l'entorn. Les eines de tipus comandament proporcionen la major flexibilitat i es poden aplicar a més llocs.

Afegir usuaris: useradd


Els usuaris es poden afegir amb la utilitat useradd. La seva sintaxi és la següent :

useradd [ -c comentari ] [ -d dir -home ] [ - i data - expiració ] [ - f dies- inactiu ] [ - g grup grup_principal ] [- G grup [ altres grups... ] ] [ - m [ - k dir - esquelet ] | -M ] [- p contrasenya ] [ -s consola ] [- o UID [- o ] ] [ -r ] [- n] nom-usuari


En la seva forma més simple , es pot escriure només useradd nom-usuari , on nom-usuari és el nom d'usuari que volem crear . La resta dels paràmetres s'utilitzen per modificar els valors per defecte del sistema , que s'emmagatzemen en el fitxer /etc/login.defs . Els paràmetres de useradd modifiquen la comanda de diverses maneres:

  • Comentari : -c comentari és el camp de comentari de l'usuari . S'hi sol guardar informació pública , com el nombre de telèfon de l'usuari . No és obligatori registrar informació en aquest paràmetre .
  • Directori home : -d permet especificar el directori home del compte . El valor per defecte sol ser / home / nom -usuari .
  • Data d'expiració del compte : - i ens permet indicar la data en què es desactivarà el compte . El format és YYYY - MM - DD , encara que hi ha sistemes que accepten la forma MM - DD - YYYY . Per defecte , els comptes no expiren .
  • Dies inactius : un compte es desactiva completament un determinat nombre de dies després d'expirar una contrasenya. - f defineix aquest nombre de dies . El valor per defecte és -1 , que desactiva aquesta funcionalitat .
  • Grup per defecte : - g permet definir la GID o el nom del grup per defecte de l'usuari .
  • Grups addicionals : - G permet definir els noms o GID d'un o diversos grups als quals pertany l'usuari, no tenen per que ser el grup per defecte i podem especificar més d'un separant-los per comes .
  • Opcions del directori home : si especifiquem -m , es crea automàticament el directori home de l'usuari. Els fitxers de configuració per defecte es copien de /etc/skel , encara que podem especificar un altre directori plantilla amb l'opció -k . Diverses distribucions Linux utilitzen -m sempre .
  • No crear directori home : -M força al sistema a no crear un directori home automàticament , fins i tot si està especificat com a acció per defecte a /etc/login.defs .
  •  Encriptació de contrasenyes : amb - p podrem passar al sistema la contrasenya de l'usuari pre - encriptada . Aquest valor s'afegeix al fitxer / etc / passwd o / etc / shadow sense modificar , per la qual cosa , si escrivim una contrasenya sense xifrar , probablement no funcionarà com esperem . Aquest paràmetre és útil en els programes de automatitizació de tasques del sistema (scripts) , on podem xifrar una contrasenya ( utilitzant crypt per exemple) i després enviar el resultat a través de useradd . El valor per defecte desactiva el compte , pel que haurem d'executar passwd per canviar la contrasenya de l'usuari .
  • Consola per defecte : -s permet especificar la consola d'accés per defecte . La consola per defecte sol ser / bin / bash , encara que podem especificar una altra consola o un programa que no sigui una consola.
  • UID : - o  crea un compte amb el valor de UID de l' usuari especificat , el valor UID ha de ser un enter positiu , normalment més de 500 per als comptes d'usuari i nombres menors de 100 per als comptes del sistema . El nombre es pot reutilitzar i podem associar dos noms d'usuari a una UID .
  • Creació d'un compte del sistema : -r especifica la creació d'un compte del sistema , és a dir , un compte amb valor inferior a UID_MIN , segons el definit a / etc / login.defs ( sol ser 100 , 500 o 1000 ) . El comandament useradd no crea un directori home per als comptes del sistema .
  • No crear el grup de l'usuari: les distribucions solen crear un grup amb el mateix nom que el nom d'usuari, - n desactiva aquest comportament .

Exemple:
. Volem crear un compte per a un usuari anomenat pedro tal que tingui el seu directori personal dintre de /home/pere, a més volem que el nou usuari sigui membre dels grups project1, project2 i project3 tenint project2 com a grup principal:

sudo useradd -d /home/pere -g project2 -G project1,project3  pedro

Aquest usuari nou encara no té contrasenya.

Definir una contrasenya

El paràmetre - p de useradd que permet definir una contrasenya no és molt útil quan s'afegeix un usuari , ja que la demana preencriptada . És més fàcil crear un compte sense utilitzar - p (de forma desactivada ) i definir la contrasenya després de crear el compte amb la comanda passwd , que té la següent sintaxi :

passwd [ - k ] [ -l ] [ - o [- f ] ] [ -d ] [- S ] [ nom -usuari ]

Els paràmetres d'aquesta comanda permeten modificar el seu comportament de les maneres següents:

  •  Actualitzar els comptes expirades : - k indica que el sistema hauria actualitzar un compte expirada .
  •  Bloquejar comptes : -l bloqueja un compte anteposant un signe d'admiració ( ! ) A la contrasenya encriptada . Com a resultat , l'usuari no pot accedir al compte , tot i que els fitxers segueixen disponibles i el canvi es pot desfer fàcilment . És un paràmetre útil quan volem suspendre temporalment l'accés de l'usuari a un compte .
  • Desbloquejar comptes : - o desbloqueja un compte eliminant el signe d'exclamació que precedeix a la contrasenya encriptada . useradd crea comptes bloquejats sense contrasenya , si utilitzem aquesta comanda en un compte nou , obtindrem un compte sense contrasenya . Normalment passwd retorna un error quan intentem això , l'opció - f obliga passwd a convertir la compte en una sense contrasenya .
  • Esborrar la contrasenya d'un compte : -d esborra la contrasenya d'un compte .
  • Mostra la informació del compte : - S mostra la informació de la contrasenya d'un compte.

Un usuari normal utilitza passwd per canviar les seva contrasenya, però molts dels seus paràmetres són només accessibles des de l'usuari root (concretament -l,-o,-fy-d). Només root pot especificar un nom d'usuari a passwd, els usuaris normals han d'ometre el nom d'usuari a executar-lo.


 Exemple: a l'usuari pedro li creem contrasenya amb el comandament passwd:

passwd pedro
Changing password for user pedro
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully

passwd sol licita dues vegades la contrasenya, però no mostra el que escrivim. D'aquesta manera evitem que algú que vegi la nostra pantalla pugui llegir la contrasenya. La contrasenya s'encripta amb un algoritme d'encriptació (anomenat funció hash) i algun mètode d'encriptació, depenent de la distribució; alguns són:


$1$=MD5 (22 caracteres)

$2$=blowfish

$5$=SHA-256 (43 Caracteres)

$6$=SHA-512 (86 Caracteres)


Després es guarda la encriptació en el fitxer /etc/shadow:



Modificar usuaris: usermod

usermod és similar a useradd , però modifica un compte existent en lloc de crear un de nou;  canvia el contingut de /etc/passwd  i/ o /etc/shadow. Algunes diferències:

  • permet l'ús del paràmetre -m quan s'utilitza amb -d . 
  •   -d, per si sol , canvia el directori home de l'usuari però no mou cap fitxer, si li afegim -m , usermod mourà els fitxers de l'usuari al nou lloc.
  • permet canviar el nom d' accés de l'usuari pel valor especificat amb el paràmetre -l .
  • -L i -U permeten bloquejar i desbloquejar la contrasenya d'un usuari. Això també és pot fer amb el comandament passwd .
  • Si usem l'opció- G per afegir l'usuari a un grup, es treu a l'usuari de la resta de grups en els que hi era inclòs el grup per defecte de l'usuari!

Caducitat de comptes: chage

chage permet modificar els paràmetres relacionats amb l'expiració dels comptes . A Linux , els comptes es poden configurar per que expirin automàticament en complir qualsevol d'aquestes condicions :

    1. La contrasenya no ha canviat en un període de temps específic .

    2. La data del sistema ha sobrepassat un temps predeterminat.

Aquests paràmetres es controlen amb chage , que té la següent sintaxi :


chage [ -l ] [- m mindias ] [ -M maxdias ] [ -d ultimodia ] [- I diasinactivo ] [- E fechaexpiración ] [- W diasaviso ] nom_usuari


Els paràmetres del programa que modifiquen les accions de la comanda són:


  • Mostrar informació : -l mostra informació del període d'expiració del compte i la contrasenya d'un usuari concret .
  • Definir el temps mínim entre canvis de contrasenya: -m mindias defineix el nombre mínim de dies entre canvis de contrasenya. El valor zero ( 0 ) permet a l'usuari una contrasenya diverses vegades al dia , un ( 1) que pot canviar un cop al dia , dos (2 ) permet canviar un cop cada dos dies i així successivament .
  • Definir el temps màxim entre canvis de contrasenya: -M maxdias defineix el nombre màxim de dies que poden passar entre canvis de contrasenya, per exemple , 30 requereix que es canviï la contrasenya aproximadament un cop al mes , si l'usuari canvia la contrasenya abans de la data límit, el comptador es reinicializará amb la data de canvi de contrasenya.
  • Definir la data de l'últim canvi de contrasenya: -d ultimodía defineix l'últim dia que es canvi una contrasenya. Aquest valor el sol mantenir Linux , però podem manipular per alterar el comptador de canvis de contrasenya. ultimodía utilitza el format YYYY / MM / DD des l'1 de gener de 1970.
  • Definir el màxim de dies inactiu : -I díasinactivo defineix el nombre de dies entre l'expiració de la contrasenya i la desactivació del compte . Els comptes expirades poden no utilitzar o poden obligar l'usuari a canviar la contrasenya després d'accedir . Un compte desactivada , ho està completament .
  • Definir la data d'expiració : - E fechaexpiración permet definir una data d'expiració absoluta . Utilitza el format YYYY / MM / DD o el nombre de dies des l'1 de gener de 1970. -1 (Menys un) indica l'absència de data d'expiració .
  • Definir el nombre de dies d'avís: - W diasaviso permet indicar el nombre de dies previs a l'expiració en què el sistema avisarà a l'usuari de l'expiració imminent del compte , una opció recomanable quan s'utilitzen intensivament les expiracions en relació als canvis de contrasenya. També hem de tenir en compte que aquests avisos només es mostren als usuaris que accedeixen en mode text i no als que accedeixen per GUI , els que comparteixen fitxers i altres.


Només root pot utilitzar la comanda chage , però si només amb l'opció -l , qualsevol usuari normal pot consultar la informació d'expiració del seu compte.

Exemple
chage -l jordi
Últim canvi de contrasenya                              : de juny 17, 2021
La contrasenya caduca                                   : mai
Contrasenya inactiva                                    : mai
El compte caduca                                        : mai
Número mínim de dies entre canvis de contrasenya                : 0
Número màxim de dies entre canvis de contrasenya                : 99999
Número de dies d'avís abans que la contrasenya caduqui  : 7

Eliminar comptes: userdel

És una tasca fàcil elimina comptes i les seves entrades en / etc / passwd , i , si n'hi ha, de / etc / shadow .  userdel només admet tres paràmetres :


  1. Esborrar fitxers d'usuari : - r --remove eliminen tots els fitxers de la cua de correu i directori home de l'usuari, així com el seu contingut . Si ometem -r preservarem els fitxers de l'usuari . 
  2. Forçar l'esborrat : -f --force esborrat d'un compte mentre l'usuari està actiu dins del sistema . També esborra la cua del correu , tot i que el propietari sigui un altre usuari , i força l'esborrat del directori home encara l'utilitzi un altre usuari .
  3. Obtenir ajuda : -h -- help resumeixen les opcions de userdel .

Exemple: Eliminar el compte de pedro i els seus correus i directori home :

sudo userdel -r pedro
[sudo] contrasenya per a jordi:  
userdel: pedro no s'ha trobat la cua de correu (/var/mail/pedro)
userdel: /home/pere no és propietat de pedro, no s'elimina

Veiem que l'usuari pedro tenia assignat com a directori home un del que no era propietari i per tant no s'eliminen els fitxers. Ho comprovem:

ls /home/pere -l -d
drwxr-xr-x 3 pereg pere 4096 d’oct.   26 12:10 /home/pere

Efectivament, el propietari és pereg.

Eliminació dels fitxers de l'usuari que no estan en el seu home

Quan eliminem un compte , haurem de recordar que sovint els usuaris creen fitxers fora del seu directori home. Per exemple hi ha programes que utilitzen / tmp com emmagatzematge temporal, lloc on poden trobar-se fitxers de l'usuari . Aquest directori s'esborra periòdicament de tant en tant i no resulta un problema, però , potser hi ha altres directoris on els usuaris hagin guardat fitxers . Per localitzar-los podem utilitzar la comanda find amb el paràmetre - uid o -user si encara no hem esborrat el compte . Per exemple, si pedro tenia la UID 529 , localitzarem tots els seus fitxers amb la següent comanda :

find / - uid 529

El resultat és una llista de fitxers el propietari dels quals és UID 529 . Ara podrem recórrer aquesta llista i fer alguna cosa amb aquests fitxers , ja que es podrien acabar assignant a un altre usuari diferent de pedro que torni a utilitzar la UID 529 , cosa que pot tenir conseqüències com l'excés de la quota de disc del nou usuari o la transmissió d'informació sensible al nou usuari.


Configurar grups

Les eines de configuració de grups s'assemblen a les de comptes d'usuari , encara que els grups no són comptes el que fa que les característiques d'aquestes eines siguin diferents. Podem crear o modificar grups editant els fitxers de configuració que tenen una estructura similar a la dels fitxers de control de comptes , encara que difereixen en els detalls .

Afegir grups: groupadd

La comanda groupadd afegeix nous grups , és similar a useradd , però amb menys opcions . La seva sintaxi és la següent :


groupadd [ - g GID [- o ] ] [ -r ] [- f ] nom_grup

Els paràmetres ajusten el funcionament de la següent manera :

  • Especificar un GID : - g GID permet utilitzar una GID específica . Si ometem aquest paràmetre , s'utilitzarà la següent GID disponible . El paràmetre - o invalida que no es pugui utilitzar una GID que ja estigui en ús , el que permet crear diversos grups que comparteixen una GID .
  • Crea un GID per sota de 500 : -r li indica a groupadd que creï un grup amb una GID per sota de 500, opció que no admeten totes les distribucions . Va ser incorporada per RedHat .
  • Forçar la creació: - f suprimeix el missatge d'error quan intentem crear un grup que ja existeix . No totes les versions de groupadd ho permeten .
Normalment els grups es creen sense especificar paràmetres , excepte el propi nom del grup. Exemple:

groupadd project

Aquesta comanda crea el grup project amb la GID que el sistema trobi convenient, normalment la més alta existent més un. Un cop creat podrem afegir usuaris al grup amb els paràmetres – g  i - G de la comanda useradd


Modificar la informació del grup

Podem modificar la informació del grup emprant utilitats o editant el fitxer / etc / group . Hi ha menys opcions per a modificar grups que per modificar comptes , encara que les seves utilitats i els seus fitxers de configuració són similars , de fet , usermod s'utilitza també per modificar grups .

Ús de groupmod i usermod

groupmod modifica els paràmetres d'un grup existent :


groupmod [ - g GID [- o ] ] [- n nombre_nuevo_grupo ] nombre_antiguo_grupo


Les opcions són les següents :


  • Especificar una GID : - g GID permet indicar una GID específica . Si la GID ja està en ús, groupmod retornarà un error. El paràmetre - o anul·la aquest comportament , permetent crear 2 grups o més que comparteixin la mateixa GID .
  • Especificar un nom de grup : especificarem un nou nom de grup amb l'opció - n nombre_nuevo_grupo .

Les manipulacions de grups més habituals no es controlen des groupmod , sinó des de usermod , que permet afegir un usuari a un grup amb el paràmetre - G . 

Exemple: definir pere com a membre dels grups users , project i project2 , i l'elimina de tots els altres grups on hi era:

usermod - G users , project , project2 pere


Per afegir a un usuari a altres grups a més dels que ja té, haurem d'assegurar-nos de llistar els grups actuals de l'usuari, ja que si ometem algun dels grups actuals , l'usuari serà eliminat d'ells . Una forma d'evitar l'omissió accidental d'un grup és modificar directament el fitxer / etc / group o utilitzar gpasswd . Ambdues opcions permeten afegir usuaris a nous grups sense haver d'especificar tots els grups als que pertanyen.

Modificar grups amb gpasswd

gpasswd és l'equivalent a passwd per als grups. Permet modificar característiques dels grups i assignar administradors als grups , que són usuaris que poden realitzar algunes funcions administratives pròpies dels grups. La seva sintaxi és la següent :


gpasswd [ - a usuari ] [ -d usuari ] [ -R ] [ -r ] [ -A usuari [ ... ] ] [- M usuari [ ... ] ] grup


 Les opcions són les següents :

    •     Afegir un usuari : - a usuari afegeix un usuari especificat al grup especificat .

    •     Esborrar un usuari : -d usuari elimina l'usuari especificat del grup especificat .

    •     Rebutjar incorporacions des newgrp : -R "tanca" el grup perquè no es permeti a ningú convertir-se en membre d'ell a través de newgrp .

    •     Esborrar la contrasenya : -r esborra la contrasenya d'un grup .

    •     Afegir administradors al grup : root pot emprar el paràmetre -A usuari [ ... ] per especificar els administradors del grup . L'administrador pot afegir i esborrar membres d'un grup a més de canviar la contrasenya. Aquest paràmetre sobreescriu la llista d'administradors, per la qual cosa haurem d'indicar tota la llista més el nou administrador que volem afegir quan vulguem que s'uneixi un nou administrador .

    • Afegir usuaris : -M usuari [ ... ] afegeix els usuaris especificats a la llista de membres del grup .


Si introduïm gpasswd només amb el nom del grup canviarem la contrasenya. La contrasenya permet controlar qui és membre d'un grup segons el assignat per newgrp . Si definim una contrasenya, fins i tot qui no sigui membre d'un grup es pot canviar a ell utilitzant newgrp. El grup ens sol·licitarà una contrasenya que farà que pertanyem temporalment a aquest grup. Aquestes funcionalitats no estan totalment implementades en totes les distribucions: en certs casos si algú no és membre d'un grup i introdueix la contrasenya el sistema pot respondre amb un missatge de " Accés Denegat ".

Eliminar grups: groupdel

Els grups s'eliminen amb la comanda groupdel , que només rep el nom del grup com a paràmetre . També podem eliminar un grup directament en el fitxer / etc / group , i / etc / gshadow si està present, esborrant la línia corresponent al grup . La millor solució és groupdel , ja que verifica si el grup és el grup primari d'algun usuari, en aquest cas haurem de canviar primer el grup primari de l'usuari o esborrar el seu compte. Igual que l'esborrat d'usuaris, l'esborrat de grups pot deixar fitxers orfes a l'ordinador que podrem localitzar amb la comanda find igual que amb els fitxers d'un usuari. 
Podem localitzar els fitxers d'un ordinador amb una GID determinada de la següent manera :

find / - gid 503

Aquesta comanda localitza tots els fitxers pertanyents al grup amb la GID 503 . Un cop localitzats els fitxers , haurem de decidir què fer amb ells perquè si es reutilitza l' GID, pot derivar en un risc per a la seguretat. El millor sol ser esborrar els fitxers o assignar-los a un altre grup amb les ordres chown o chgrp .












dimarts, 6 de juliol del 2021

Introducció al treball amb el shell bash

Hi han dos tipus de interfície d'usuari del sistema operatiu: l’anomenada shell («closca») del sistema i els entorns d’escriptori gràfic. El shell en realitat és un programa que espera ordres (comandaments) de l’usuari; aquest escriu el comandament, el shell interpreta el que ha escrit, i si és la sintaxi és correcte l’executa.

La interfície tipus shell és freqüent en servidors dedicats: un administrador expert en shell pot ser molt més ràpid i eficient fent tasques concretes que no pas usant un entorn d’escriptori.  Els entorns gràfics es caracteritzen per ser fàcils d’utilitzar ... aparentment, doncs sovint es carreguen amb molts objectes, menús dintre de menús i finestres farcides d’opcions, i acaba sent difícil de trobar el que busques. 

Avantatges del shell sobre l’escriptori gràfic:

    • És complert: qualsevol cosa que l’usuari pugui fer amb el sistema es pot fer des del shell, en canvi hi ha operacions que no es poden fer des de l’entorn gràfic

    • És potent: amb una única instrucció es pot fer el mateix que obrint diverses finestres i menús i clicant diverses opcions

    • És flexible: els comandaments es poden combinar entre sí i personalitzar per formar comandaments complexes, sense límit algun; això no es pot fer amb les finestres i menús 

    • És estable: sovint les interfícies gràfiques canvien entre versions del sistema operatiu fent perdre temps buscant allò que ja no està on estava; en canvi els comandaments del shell varien poc, de fet hi ha comandaments tant en Windows com en Linux que tenen més de 30 anys d’existència i segueixen funcionant perfectament.

    • És automatitzable: les tasques repetitives d’administració, com ara crear diversos usuaris nous del sistema (per exemple quan entren nous contractats a la organització) en l’entorn gràfic obliguen a usar repetidament les mateixes opcions de menús, en canvi els comandaments equivalents es poden guardar en un fitxer de text i executar-se tots alhora. Aquest fitxer el podem guardar per reutilitzar-lo en un futur.

En aquest article fem una breu introducció al treball des del shell més conegut de Linux: el bash. 

Introduir comandaments

Quan tenim el shell del sistema obert podem començar a escriure comandaments, que podem veure com sol·licituds per que el sistema executi alguna acció,  en realitat cada comandament crida a un programa del sistema. 

En la imatge veiem que el shell mostra un text (en verd) que s'anomena el prompt que varia segons la versió del sistema, en aquest dóna: el nom de l'usuari que té oberta la sessió (jordi), separat pel caràcter @ el nom de la màquina (jordi-SVE1513CSE), després dels ":" es mostra el caràcter ~ que indica que dintre del sistema de fitxers estem situats en l'arrel dels directoris de l'usuari (que per norma és /home/usuari, en l'exemple /home/jordi) i després el caràcter $ que indica que l'usuari no és administrador que en Linux sempre s'anomena usuari root. A continuació del prompt escrivim el comandament date i fem <Intro>, el shell interpreta l'ordre, veu que és simplement executar el comandament date, ho fa mostrant el resultat, i torna a mostrar el prompt esperant la següent ordre:


El shell quan s'inicia sempre ens situa en l'arrel del directori de l'usuari; si ens movem de directori usant comandaments, el prompt canvia:


En el darrer prompt ja no es mostra el caràcter  ~ doncs em sortit de l'arrel del directori de l'usuari. Si entrem com administradors el prompt també canvia:

jordi@jordi-SVE1513C5E:/home$ sudo su
[sudo] contrasenya per a jordi:  
root@jordi-SVE1513C5E:/home#

El caràcter $ ha estat substituit pel # que està reservat per l'administrador. Si l'ordre que escrivim no existeix, el shell ens ho diu i ens proposa comandaments semblants:

jordi@jordi-SVE1513C5E:/home$ whi

No s'ha trobat l'ordre 'whi', volíeu dir:

 l'ordre 'hi' de l'snap hi (1.1)

 l'ordre 'ghi' del deb ghi (1.2.0-1)

 l'ordre 'who' del deb coreutils (8.30-3ubuntu2)

Vegeu 'snap info <nom de l'snap>' per a versions addicionals.


De vegades ens cal escriure com a part del comandament una paraula que conté espais en blanc; per defecte el shell interpreta els espais en blanc com a separadors d'ordres diferents, o de dades diferents; l'ordre cat mostra el contingut d'un fitxer de text, si tenim un que s'anomena "resum Azure AD" i fem:

jordi@jordi-SVE1513C5E:~$ cat resum Azure AD
cat: resum: El fitxer o directori no existeix
cat: Azure: El fitxer o directori no existeix
cat: AD: El fitxer o directori no existeix
jordi@jordi-SVE1513C5E:~$

el shell interpreta que són tres fitxers independents; una solució és escriure cat "resum Azure AD", una altre utilitza el caràcter d'escapament \ que indica que el següent caràcter és "especial" i el shell no l'ha de interpretar, cat resum\ Azure\ AD funcionarà bé doncs cada espai en blanc va precedit de la barra invertida i el shell no la interpreta com separador. 

La combinació de tecles Control + C s'interpreta com ordre d'aturar el comandament en curs; per exemple si llancem el comandament sleep 60 que simplement deixa esperant al shell 60 segons, podem interrompre la espera amb Control + C, que el shell visualitza com ^C:

jordi@jordi-SVE1513C5E:~$ sleep 60
^C
jordi@jordi-SVE1513C5E:~$ 

La combinació de tecles Control + D tanca el shell i acaba la sessió.

El comandament man obre el manual de qualsevol altre comandament, per exemple el manual de date:

jordi@jordi-SVE1513C5E:~$ man date

DATE(1)                                             User Commands                                             DATE(1)

NAME
      date - print or set the system date and time

SYNOPSIS
      date [OPTION]... [+FORMAT]
      date [-u|--utc|--universal] [MMDDhhmm[[CC]YY][.ss]]

DESCRIPTION
      Display the current time in the given FORMAT, or set the system date.

      Mandatory arguments to long options are mandatory for short options too.

      -d, --date=STRING
             display time described by STRING, not 'now'

      --debug
             annotate the parsed date, and warn about questionable usage to stderr

      -f, --file=DATEFILE

Es poden executar diversos comandaments en una única línia, separant-los per punt i coma; el següent exemple primer espera 6 segons (sleep 6) i després llista el contingut del directori actual

Jordi@jordi-SVE1513C5E:~$ sleep 6; ls
Baixades    Escriptori   Imatges                     Música       Públic            snap    'VirtualBox VMs'
Documents   hola.txt    'Mòduls específics de DAW'   Plantilles  'resum Azure AD'   Vídeos
jordi@jordi-SVE1513C5E:~$





dilluns, 8 de març del 2021

El shell bash per usuaris avançats i administradors de sistemes

El shell és la capa més externa del sistema operatiu, on l'usuari pot interactuar usant comandaments; aquest comandaments són interpretats per un intèrpret, que en el cas de Linux pot ser un de diversos disponibles, essent l'anomenat bash el més usat, i el que tractem a continuació no des de el punt de vista de l'usuari habitual, més acostumat a treballar amb entorns gràfics d'escriptori,si no de l'usuari avançat i dels administradors de sistemes.

Execució de comandaments múltiples amb connectors

Podem unir comandament en una única línia usant el ;com a connector:

root@jordi-sve1513c5e:/media/jordi# who; date
jordi    tty1         2021-03-06 12:29 (:0)
jordi    pts/0        2021-03-06 12:29 (:0)
jordi    pts/1        2021-03-06 13:15 (:0)
dissabte, 6 de març de 2021, 19:50:09 CET

Els espais en blanc abans o després del ; són indiferents. L'operador barra vertical | serveix per connectar el resultat d'un comandament amb l'entrada de dades d'un altre comandament, com ara:

root@jordi-sve1513c5e:/media/jordi# who | wc
     3      15     132

wc ha comptat el nombre de línies, paraules i lletres del resultat de who.  Ara bé, què passa si li enviem dos comandaments a wc?

root@jordi-sve1513c5e:/media/jordi# who; date | wc
jordi    tty1         2021-03-06 12:29 (:0)
jordi    pts/0        2021-03-06 12:29 (:0)
jordi    pts/1        2021-03-06 13:15 (:0)
     1       8      43

Veiem que wc només té en compte el darrer comandament dels dos que hem executat; això és per que el shell tracta a ; i | com a operadors, i el darrer operador té més precedència que el primer. Podem modificar aquest comportament usant parèntesi:

(who; date) | wc
     4      23     175

Ara sí, el resultat con junt dels dos comandaments es passa a wc.  En aquestes interconnexions ens pot interessar guardar resultats intermitjos en un fitxer, ho podem fer amb tee:

root@jordi-sve1513c5e:/media/jordi# (who; date) | tee qui_data | wc
     4      23     175
root@jordi-sve1513c5e:/media/jordi# cat qui_data
jordi    tty1         2021-03-06 12:29 (:0)
jordi    pts/0        2021-03-06 12:29 (:0)
jordi    pts/1        2021-03-06 13:15 (:0)
dissabte, 6 de març de 2021, 19:59:28 CET

Un altre operador de connexió de comandaments és l'ampersand & que uneix comandaments en una única línia com el ; però amb la diferència de que no espera que un acabi per llençar el següent: s'executen els comandaments en paral·lel. Una forma fàcil de provar-ho és amb el comandament sleep, que és un temporitzador que espera els segon que li diem:

sleep 5; vi

esperarà cinc segons i després executar l'editor del sistema; en canvi

sleep 5 & vi

deixarà al bash cinc segons en espera però l'editor vi s'obrirà immediatament. Un altre exemple:

root@jordi-sve1513c5e:/media/jordi# (sleep 5; date) & date
[1] 15926
dissabte, 6 de març de 2021, 20:09:48 CET
[1]  
Done                    ( sleep 5; date )
root@jordi-sve1513c5e:/media/jordi# dissabte, 6 de març de 2021, 20:09:53 CET

El primer agrupament entre () s'executa simultàniament amb el segon date, aquest darrer es mostra de seguida en pantalla, però el primer ha d'esperar els 5 segons marcats en sleep.  Fixem-nos que el procés que espera queda en segon pla (en background) amb el número de procés 15926, és com si el procés quedes en espera, es pot comprovar que està en segon pla usant jobs:

root@jordi-sve1513c5e:/media/jordi# jobs
[1]+  Running                 ( sleep 20; date ) &

Per aquest motiu un altre ús de l'operador & és enviar un procés a 2n pla, com ara:

wget http://prdownloads.sourceforge.net/lam/ldap-account-manager_6.8-1_all &
[1] 16494

En el cas de connexions amb | els comandament connectats es consideren un únic procés encadenat, i si afegim el & afecta a tot plegat:

Metacaràcters dels shell

 Els "metacaràcters" són caràcters amb significat especial, com ara * que el shell interpreta com "qualsevol caràcter":

jordi@jordi-sve1513c5e:~$ ls d*
dashboard-cluster-role-binding.ym  dashboard-cluster-role-binding.yml  dashboard-service-account.yml  data.txt

Si volem usar un metacaràcter com a caràcter normal el posem entre cometes simples, o bé el precedim per la barra invertida \ : Així, ls * mostrarà tots els fitxers del directori actual, mentre que 'ls *' només mostrarà el fitxer anomenat * si existeix. Què creieu que mostrarà ls '*'*  ?   I què mostrarà ls \**     ?

Alguns metacaràcters interessants:

> >> < >>

Redireccions d’entrada i sortida estàndar



; & |


Connectors de comandaments en línia



* ?


Caràcters «comodí»



$


Prefix de les variables d’entorn




\





Prefix per anul·lar un metacaràcter com a tal

‘ ‘


No interpretat el contingut



&&


Connector: executar un comandament, si acaba bé, executar el següent


||


Connector: executar un comandament, si no acaba bé, executar el següent


Alguns exemples:

jordi@jordi-sve1513c5e:~$ (ls -d Baixades) && (ls -d samba)  
Baixades
samba            --> Baixades existeix, es motra també samba


jordi@jordi-sve1513c5e:~$ (ls -d Downloads) && (ls -d samba)            
ls: cannot access 'Downloads': No such file or directory

--> Downloads no existeix, el comandament dóna error, no es mostra samba


jordi@jordi-sve1513c5e:~$ (ls -d Downloads) || (ls -d samba)   
ls: cannot access 'Downloads': No such file or directory
samba

--> Downloads no existeix, el comandament dóna error, sí es mostra samba

Variables d'entorn i variables del shell

Tot sistema operatiu manté una llista de variables anomenades "d'entorn" que són útils per recuperar informació de configuració de l'entorn de l'usuari; en el shell aquestes variables estan en majúscules i poden accedir-se amb el prefix $, exemples:

jordi@jordi-sve1513c5e:~$ echo $HOME
/home/jordi
jordi@jordi-sve1513c5e:~$ echo $USER
jordi
jordi@jordi-sve1513c5e:~$ echo $PATH
/home/jordi/.local/bin:/home/jordi/.local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
:/usr/local/games:/snap/bin

També es poden crear variables d'usuari, que poden ser en minúscules, o no, però el shell les distingirà:

jordi@jordi-sve1513c5e:~$ x=10
jordi@jordi-sve1513c5e:~$ X=100
jordi@jordi-sve1513c5e:~$ echo $x,$X
10,100

Per assignar valor no es posa el prefix $, però per accedir a la variable ja creada, llavors sí.

Les cometes invertides es poden usar per deixar en una variable el resultat d'un comandament:

pwd
/home/jordi/snap/docker
carpeta=`pwd`
echo $carpeta
/home/jordi/snap/docker

Una forma alternativa és usant el prefix $ i tancat el comandament entre ():

root@jordi-sve1513c5e:/home/jordi# carpeta=$(pwd)
root@jordi-sve1513c5e:/home/jordi# echo $carpeta

Si canviem el valor d'una variable d'entorn del sistema, només tindrà validesa en la sessió actual, quan iniciem una altre, el sistema carrega de nou el valor anterior; es pot fer un canvi permanent canviant els valors en el fitxer .profile de l'usuari.  D'altre banda quan executem un comandament dins d'un fitxer de text (és a dir, un shell script), el shell obre una còpia de sí mateix (un subshell) on s'executa l'script, de forma que els canvis en les variables només afecten al subshell. Per veure-ho estudiem el següent exemple:


Aquestes línies estan en  el fitxer variables.sh que té drets d'execució. Fixeu-vos en l'ús que fa de les cometes simples, dobles i invertides: quan són simples vol dir que el contingut entrecomillats es rpen tal qual, literalment, quan són dobles vol dir que el shell interpreta el contingut entrecomillat.  Mostrem ara la variable $HOME i executem l'script:

echo $HOME      
/home
./variables.sh  
\home\jordi
echo $HOME
/home

Fixeu-vos que mentre s'executa l'script el contingut de $HOME ha variat, però en acabar l'execució, es recupera el valor inicial. Si volem que l'script no s'executi en un subshell si no en el shell actual, ho podem indicar usant un punt i un espai abans del nom de l'script:

. ./variables.sh  
\home\jordi
echo $HOME
\home\jordi

Ara sí que l'script modifica la variable del shell. Observem que usem el punt dues vegades, amb significats diferents:

  • el primer punt, separat per espai, indica executar l'script en el mateix shell i no en un subshell
  • el segon punt, que té a continuació la barra, indica al shell que l'script està situat en el directori actual

El segon punt-barra és prescindible si l'script està situat en una carpeta llistada en la variable PATH; si afegim aquesta carpeta, per exemple així:

PATH=$PATH:`pwd`

Llavors ja no ens cal el punt-barra:

. variables.sh    
\home\jordi

L'altre manera de comunicar valors de variables a subshells és usant el comandament export. Estudiem el següent exemple:

root@jordi-sve1513c5e:/home# x=100
root@jordi-sve1513c5e:/home# echo $x
100
root@jordi-sve1513c5e:/home# bash
root@jordi-sve1513c5e:/home# echo $x

root@jordi-sve1513c5e:/home# exit
exit
root@jordi-sve1513c5e:/home# echo $x
100


Veiem que quan executem un shell dintre de l'actual, la variable x no es reconeix en el subshell; en canvi si la "exportem" llavors sí:

root@jordi-sve1513c5e:/home# x=100
root@jordi-sve1513c5e:/home# export x
root@jordi-sve1513c5e:/home# bash
root@jordi-sve1513c5e:/home# echo $x
100

Entrades, sortides i errors estàndard

Tot programa té associat pel sistema operatiu tres fitxers especials: la entrada estàndard, la sortida estàndard i la sortida d'error estàndard, amb uns números associats, anomenats descriptors de fitxers, que són el 0, 1 i 2 respectivament. Per defecte el 0 s'assigna al teclat i els 1 i 2 a la pantalla, però tots es poden redigir.

La redirecció de la sortida d'error estàndard pot ser útil en encadenaments de comandaments on algun de intermig dóna missatges d'error que no es interessen:

root@jordi-sve1513c5e:/home/jordi# ls -l | find "samb" | wc
find: ‘samb’: No such file or directory
     0       0       0

Si redigirim l'error ja no el veiem per pantalla:

root@jordi-sve1513c5e:/home/jordi# ls -l | find "samb" 2>/dev/null | wc            
     0       0       0

També pot passar al revés, que en un encadenament de comandaments algun de entre mig no mostri cap error. Un altre ús seria redirigir els errors a un fitxer de log, per exemple:

find trash 2>> error.log

Qualsevol missatge d'error s'escriu en el fitxer error.log, com usem  l'operador >> s'afegirà a l final del contingut del fitxer.

Iteracions de comandaments

El shell bash és pràcticament un llenguatge de programació, amb comandaments i variables, i també estructures iteratives i condicionals. Repetir una acció sobre un conjunt de fitxers és molt usual en administració de sistemes, i ho podem fer amb la sentencia for. 

 for x in *
> do
>  echo $x
> done

La x és la variable, que pren tots els noms de fitxers del directori actual (recordem que el metacaràcter * significa això), el for recorre tots aquests noms i els mostra amb echo.  

Com a exemple més pràctic suposem que volem comparar uns fitxers amb la seva còpia de seguretat, per saber si han hagut canvis; el comandament diff compara fitxers línia a línia, si són iguals no diu res, i si són diferents indica la línia on està la diferencia 

diff error.log backup/error.log                            no diu res: iguals

echo "hola" >> backup/error.log                            modifiquem un fitxer

diff error.log backup/error.log  
1a2                                                        en la fila 1
> hola


Suposem que volem comparar els fitxers anomenat error1.log, error2.log, etc amb les seves còpies en el directori backup, podem fer-ho així:

fitxers=$(ls error*.log)        generem la llista de fitxers

for x in $fitxers               recorrem la llista

do

    diff $x backup/$x           comparem un a un

done


Si resulten tots iguals l'script no genera cap sortida per pantalla, altrament mostrarà les diferencies. Potser només ens interessa saber quants fitxers han canviat, sense mostrar res més. Sabem que diff mostra la línia on hi ha diferencia, i a continuació, un ">" seguit de la diferencia

jordi@jordi-sve1513c5e:~/Documents$ ./diff.sh  
1a2
> hola

Per tant si encadenem l'script amb una cerca del caràcter ">", per exemple amb grep, obtindrem només les diferències:

./diff.sh | grep ">"
> hola

Per aquest motiu al comandament grep se l'anomena un filtre, doncs filtra la sortida d'un programa; hi han diversos comandaments del bash que funcionen com a filtres, alguns fent un processament programat sofisticat usant les anomenades expressions regulars.  Si tornem a encadenar-ho amb el comandament wc amb el paràmetre -l (comptar només línies) obtenim un comptador de diferencies trobades en els fitxers

./diff.sh | grep ">" | wc -l
1

En realitat podem incloure l'encadenament dintre del text de l'script:

fitxers=$(ls error*.log)

for x in $fitxers

do

    diff $x backup/$x    

done | grep ">" | wc -l


El Bash també disposa de les repeticions while

read a

while [ $a -gt 0 ] 

do 

  echo "més gran que zero"

  read a

done


Execució condicional

El comandament if del bash selecciona si cal executar o no comandaments depenent d'una condició; tenim vàries possibilitats.

1. La condició és que un comandament no doni error. Per exemple el comandament ls lmv* el podem incloure'l com a condició en el if:

if $(ls lmv*); then

si dóna error,

ls lmv*
ls: cannot access 'lmv*': No such file or directory

llavors NO és compleix la condició del if:

if $(ls lmv*); then  echo "trobats"; else  echo "cap valor"; fi      
ls: cannot access 'lmv*': No such file or directory
cap valor

Com el missatge d'error no ens interessa, el redirigim:

if $(ls lmv* 2>/dev/null); then  echo "trobats"; else  echo "cap valor"; fi  
cap valor

Un cas especial és comprovar si un fitxer o carpeta existeix amb el comandament test:

if test -f pepe.txt; then  echo "existeix"; else  echo "no hi és"; fi    
no hi és

2. La condició compara uns valors amb altres. Per exemple per comparar dues variables numèriques usem el comparador -eq

x=1;y=2
if [ $x -eq $y ]; then  echo "iguals"; else echo "diferents";fi
diferents

si les variables contenen text usem els operador "=":

x="hola";y="adeu"
if [ $x = $y ]; then  echo "iguals"; else echo "diferents";fi    
diferents

3. La condició comprova alguna cosa. Com ara que existeixi un fitxer usant l'operador -e

if [ -e pepe.txt ]; then echo "trobat"; fi

O el contrari, que no existeixi, usant l'operador de negació !

if [ ! -e pepe.txt ]; then echo "no trobat"; fi

Amb l'operador -d verifica si existeix una carpeta. L'operador negació es pot aplicar a qualsevol condició, com ara

if [ ! $x -eq $y ]; then  echo "diferents"; else echo "iguals";fi 

Per comparacions numèriques tenim també els operadors -gt (més gran que) i -lt (més petit que).

Podem incloure sentències if dins d'altres if, i també usar la condició case; veure per exemple https://ryanstutorials.net/bash-scripting-tutorial/bash-if-statements.php

Exercicis

Exercici 1. La majoria d'scripts del sistema estan en el directori /usr/bin. D'altre banda, el comandament file mostra el tipus de fitxer, com ara:

file /usr/bin/bash  
/usr/bin/bash: ELF 64-bit LSB shared object, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linu
x-x86-64.so.2, BuildID[sha1]=a6cb40078351e05121d46daa768e271846d5cc54, for GNU/Linux 3.2.0, stripped

Escriviu un script llistascript.sh que mostri tots els scripts situats en /usr/bin/

$ ./llistascript.sh  
/usr/bin/7z: POSIX shell script, ASCII text executable
/usr/bin/7za: POSIX shell script, ASCII text executable
/usr/bin/7zr: POSIX shell script, ASCII text executable

Ajuda: useu els comandaments ls, grep i file aquest darrer ens dirà de quin tipus és cada fitxer:

file /usr/bin/xzmore

/usr/bin/xzmore: POSIX shell script, ASCII text executable

Podeu usar un for per recórrer tots els fitxers del directori i per cada un executar el comandament file, comprovant que és un script. 

Exercici 2. Molts dels executables de /usr/bin en realitat són vincles simbòlics a altres fitxers; escriviu un altre script  que a més a més de llistar els scripts, mostri aquells que són vincles:

$ ./script2.sh  
/usr/bin/7z: POSIX shell script, ASCII text executable
/usr/bin/7za: POSIX shell script, ASCII text executable
/usr/bin/7zr: POSIX shell script, ASCII text executable
/usr/bin/add-apt-repository: Python script, ASCII text executable
/usr/bin/addr2line: symbolic link to x86_64-linux-gnu-addr2line
/usr/bin/addr2line: symbolic link to x86_64-linux-gnu-addr2line
































Gestió d'usuaris i grups en Linux

Usuaris i grups Linux  Els comptes de Linux són com els comptes de Windows o MacOS; però els detalls no, així que cal explicar alguns detall...