basi di amministrazione di sistema linux

creazione utenti e gruppi

creiamo un utente con il comando

useradd -s /bin/bash -m nuovoutente

oppure con

adduser nuovoutente2

per una creazione interattiva. i due comandi hanno (grosso modo) lo stesso effetto, e il motivo per preferire useradd è solo la mancanza di interattività, che lo rende più adeguato all'utilizzo per via programmatica.

con il primo comando abbiamo selezionato la shell di default (in questo caso /bin/bash), salvata nella variabile d'ambiente $SHELL e nel file /etc/passwd. con il flag -d possiamo anche sepcificare la home directory, anch'essa salvata in /etc/passwd/ e nella variabile d'ambiente $HOME.

possiamo cambiare la password del nostro nuovo utente con il comando

passwd nuovoutente

così facendo, l'hash della nuova password verrà salvato nel file /etc/shadow. se non vogliamo conoscere la password dell'utente possiamo farci dare da lui direttamente l'hash, che potrà generare con il comando openssl passwd -1.

creiamo un nuovo gruppo

groupadd nuovogruppo

e aggiungiamo i due utenti appena creati

usermod -a -G nuovogruppo nuovoutente
usermod -a -G nuovogruppo nuovoutente2

creiamo un file di testo

echo ciao > myfile.txt

assegnamone la proprietà a nuovoutente

chown nuovoutente myfile.txt

e diamo permessi di lettura e scrittura all'utente, sola lettura al gruppo, e nessun permesso a tutti gli altri utenti (-rw-r-----)

chmod 640 myfile.txt

perché 640? per rispondere dobbiamo dividere -rw-r----- in 4 parti:

  1. il primo -, in cui c'è una d se il file è una directory (o altre lettere in caso di file speciali, tipo socket o link)
  2. i successivi rw-, di cui i due bit più a sinistra sono "accesi" e quello più a destra "spento", che possiamo tradurre in binario come 110, ossia 6 (il primo 6 di 640)
  3. i successivi r--, di cui il bit più a sinistra è "acceso" e i due più a destra sono "spenti", che possiamo tradurre in binario 100, ossia 4 (il secondo numero di 640)
  4. gli ultimi ---, che traduciamo in 000, ossia 0 in binario

da cui 640.

fatto ciò, verifichiamo:

  1. che nuovoutente può leggere e scrivere
  2. che nuovoutente2 può leggere, ma non scrivere
  3. che un qualunque altro utente non può né leggere né scrivere

adesso modifichiamo il gruppo assegnato al file myfile.txt

chgrp nuovogruppo myfile.txt

e verifichiamo che l'utente nuovoutente2 adesso può leggere il file myfile.txt

se vogliamo che il nuovo utente (o in generale qualunque utente) abbia privilegi di amministratore sulla macchina e possa eseguire qualunque comando utilizzando sudo, aggiungiamolo al gruppo di sistema sudo eseguendo

usermod -a -G sudo nuovoutente2

i gruppi e gli utenti possono essere cancellati con i comandi groupdel e userdel, rispettivamente.

se abbiamo bisogno di creare un numero elevato di utenti possiamo farlo programmaticamente:

for i in {1..30}; do useradd -s /bin/bash -m mynewuser-$i; done

se abbiamo bisogno di configurare regole di accesso più complesse ci conviene usare il comando setfacl (non trattato qui).

osserviamo i file /etc/group, /etc/passwd e il loro contenuto.

task periodici

i task periodici possono essere eseguiti tramite cron, un demone che esegue dei job, detti cronjob, ad orari o confrequenza predefiniti.

creiamo (come utente root) il file /etc/cron.d/prova con contenuto

*/2 * * * * root /usr/bin/touch /root/prova_$(date +\%Y-\%m-\%d:\%H:\%M:\%S)

la struttura è

m h dm mo dw <USER> <COMMAND>

dove:

  • m è il minuto
  • h è l'ora
  • dm è il giorno del mese
  • mo è il mese
  • dw è il giorno della settimana
  • <USER> è l'utente con cui si esegue il comando
  • <COMMAND> è il comando da eseguire

il nostro cron job crea ogni 2 minuti un file chiamato prova_<TIMESTAMP>

notiamo che il simbolo % è preceduto da \ (escape) perché ha un significato particolare per cron:

man (5) crontab:

Percent-signs (%) in the command, unless escaped
with backslash (\), will be changed into newline
characters, and all data after the first % will
be sent to the command as standard input.

dopo poco tempo possiamo verificare con il comando

ls -hlF /root

che alcuni file sono stati creati.

gestione pacchetti

eseguendo il comando

python3 -c "import igraph"

e osservando l'output

Traceback (most recent call last):
  File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'igraph'

notiamo che la libreria python che ci interessa, igraph, non c'è sul nostro sistema.

Quando abbiamo bisogno di un tool o un software non installato, possiamo utilizzare apt, il gestore di pacchetti delle distribuzioni debian-like.

possiamo cercare se c'è quello che ci interessa con il comando

apt search <PATTERN_MATCHING_PACKAGE>

e filtrare i risultati, se serve

# apt search igraph | grep python

WARNING: apt does not have a stable CLI interface. Use with caution in scripts.

python-igraph/bionic 0.7.1.post6-5 amd64
python3-igraph/bionic 0.7.1.post6-5 amd64

trovato il pacchetto che ci interessa, possiamo installarlo con il comando

apt install <PACKAGE_NAME>

nel nostro caso

apt install python3-igraph

e riprovando ad eseguire il comando di prima

python3 -c "import igraph"
echo $?

notiamo che non c'è nessun errore (il pacchetto è installato).

i comandi usati più di frequente nella gestione dei pacchetti tramite apt sono

  • apt update per aggiornare i repository
  • apt upgrade per aggiornare tutti i pacchetti all'ultima versione (non rimuove pacchetti installati)
  • apt full-upgrade per aggiornare tutti i pacchetti all'ultima versione (rimuove pacchetti installati se necessario)
  • apt autoremove per rimuovere pacchetti non più necessari
  • apt install <PACKAGE> per installare un pacchetto, se non installato , o per aggiornarlo, se già installato
  • apt remove <PACKAGE> per disinstallare un pacchetto
  • apt purge <PACKAGE> per disinstallare un pacchetto rimovendo ogni traccia, inclusi eventuali file di configurazione

interfacce di rete

per visualizzare le interfacce di rete (attive) disponibili sulla nostra macchina usiamo il comando

ifconfig

il cui output tipico è

enp2s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 193.206.185.119  netmask 255.255.255.0  broadcast 193.206.185.255
        inet6 fe80::6c37:5ca7:3d93:80f8  prefixlen 64  scopeid 0x20<link>
        ether f0:4d:a2:da:e4:81  txqueuelen 1000  (Ethernet)
        RX packets 127877801  bytes 68410740495 (68.4 GB)
        RX errors 0  dropped 170330  overruns 0  frame 0
        TX packets 74308541  bytes 39630834876 (39.6 GB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0
        device interrupt 16

da cui possiamo ricavare l'indirizzo IP tramite cui la nostra macchina è raggiungibile sulla rete

inet 193.206.185.119

il MAC address associato all'interfaccia

ether f0:4d:a2:da:e4:81

oltre alla quantità di pacchetti ricevuti (RX) e trasmessi (TX), e gli errori

il comando ifconfig è compatibile con la quasi totalità dei sistemi unix-like (anche quelli più vecchi), ma spesso gli viene preferito il più moderno ip. ad esempio, possiamo utilizzare quest'ultimo per visualizzare le interfacce come abbiamo fatto con ifconfig

ip address

oppure

ip a

ottenendo come output

2: enp2s0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether f0:4d:a2:da:e4:81 brd ff:ff:ff:ff:ff:ff
    inet 193.206.185.119/24 brd 193.206.185.255 scope global noprefixroute enp2s0
       valid_lft forever preferred_lft forever
    inet6 fe80::6c37:5ca7:3d93:80f8/64 scope link noprefixroute
       valid_lft forever preferred_lft forever

un altro comando utile è host, con il quale possiamo ottenere informazioni su un indirizzo IP

host 8.8.8.8
8.8.8.8.in-addr.arpa domain name pointer google-public-dns-a.google.com.

o su un nome DNS

host www.google.com
www.google.com has address 216.58.205.68
www.google.com has IPv6 address 2a00:1450:4002:807::2004

results matching ""

    No results matching ""