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:
- il primo
-
, in cui c'è unad
se il file è una directory (o altre lettere in caso di file speciali, tipo socket o link) - i successivi
rw-
, di cui i due bit più a sinistra sono "accesi" e quello più a destra "spento", che possiamo tradurre in binario come110
, ossia6
(il primo6
di640
) - i successivi
r--
, di cui il bit più a sinistra è "acceso" e i due più a destra sono "spenti", che possiamo tradurre in binario100
, ossia4
(il secondo numero di640
) - gli ultimi
---
, che traduciamo in000
, ossia0
in binario
da cui 640
.
fatto ciò, verifichiamo:
- che
nuovoutente può leggere e scrivere
- che
nuovoutente2
può leggere, ma non scrivere - 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 minutoh
è l'oradm
è il giorno del mesemo
è il mesedw
è 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 repositoryapt 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ù necessariapt install <PACKAGE>
per installare un pacchetto, se non installato , o per aggiornarlo, se già installatoapt remove <PACKAGE>
per disinstallare un pacchettoapt 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