Cheatsheet per bash in italiano. Realizzato per l'esame di gestione sistemi IT Cloud @ UniPR 2019-20
- Parentesi quadre [] accerchiano elementi opzionali
- Qualsiasi cosa seguita da ... rappresenta una lista di lung. arbitraria
- I | indicano una scelta multipla
- Gli angle brackets <> rappresentano dati variabili
Enter + ~ + .
ctrl+ainizio della command linectrl+efine della command linectrl+ucancella fino all'inizioctrl+kcancella fino alla finectrl+sxvai alla parola precedentectrl+dxvai alla parola seguentectrl+rcerca nella history
-
usrsoftware installati, librerie.bincomandi utentesbincomandi adminlocalsoftware localmente customizzato
-
etcfile di configurazione specifici al sistema -
varDati variabili al sistema che dovrebbero rimanere tra boots, come DB, cache... -
runDati di runtime per i processi avviati since boot, come ID, lock... -
homeDirs per il salvataggio dei dati per gli utenti -
rootHome per root -
tmpSpazio temporaneo dalla durata di 10 gg (per 30gg, /var/tmp) -
bootFile necessari per il boot -
devContiene file speciali per accedere ai device
Un path assoluto comincia alla / root
Un path che non comincia per / specifica il path partendo dalla dir in cui siamo.
Processo per il pattern matching/wildcards.
*ogni stringa di 0+ caratteri?ogni carattere singolo~home dello user corrente~user home dell'utente user~+directory corrente~-directory precedente[abc]un carattere tra abc[!abc]un carattere esclusi abc[^abc]un carattere esclusi abc[[:alpha:]]ogni carattere alfabetico[[:lower:]]ogni carattere lower-case[[:upper:]]ogni carattere upper-case[[:alnum:]]un carattere alfanumerico[[:punct:]]ogni carattere di punteggiatura[[:digit:]]ogni numero[[:space:]]ogni carattere di whitespace (tabs, newline, cr)
- Utilizzata per generare stringhe arbitrarie di caratteri
- contengono una lista comma-separated o una sequenza.
- es.
{Sunday,Monday,Thursday} {1..10}
- Sostituiamo l'espressione $(comando) con l'output del comando.
- Si possono usare anche i backticks
comando, ma ha due svantaggi: fa confusione, e non è nestable
$escapa un singolo carattere''escapa un'espressione sempre""escapa espressioni ma permette command e variable substitution
- Tramite
>possiamo redirectare un output a file. >sovrascrive>>appende2specifica stderr&specifica entrambi- es.
>file 2>&1=&>file
Una pipeline | permette di passare l'output di un comando all'input di un altro
datemostra i correnti data/ora. Puoi specificare con + il formato desideratopasswdpasswd modifica la password dell'utente corrente. root può modificarle tutte.filesu linux le estensioni sono inutili. file analizza l'header di un file per vedere l'estensioneheadPrende le prime 10 linee di un file. Con argomento -n specifichi il numero.tailvedi head, ma alla fine del file.wcconta linee, parole, caratteri. Prende parametro -l, -l, -c per mostrarne solo uno dei tre.historymostra una lista dei comandi già eseguitipwdmostra il full path name correntelsmostra i contenuti della directory corrente-amostra tutti i file-Rè ricorsivo
cdcambia directory,..indica la directory padretouchupdata il timestamp di un file al tempo corrente. Possiamo usarlo per creare files.cpcopia un file. Per file multipli, l'ultima deve essere la directory.mvsposta o rinomina un file.rmelimina un file.-relimina ricorsivamente directories-fforza l'operazione suddetta.
rmdirelimina una directory vuotamkdircrea una directory-pcrea le subdirectories necessarie
manmostra la pagina di manuale per il comando specificato, è diviso in 9 categoriestdinbuffer che legge dalla tastierastdoutbuffer che invia output al terminarestderrinvia messaggi di errore al terminaleteepermette di creare una pipeline mantenendo l'output a terminale o a un file specificato come argomentoyumpermette di installare pacchetti da una repo. La configurazione è in/etc/yum.confo/etc/yum.repos.d- Comandi:
- repolist elenca le repo, pacchetti, gruppi
- help aiuto
- list pacchetti installati/disponibili
- search cerca pacchetti per nome/summary
- search all cerca anche nella description
- info restituisce informazioni su un pacchetto
- provides pacchetti che matchano il pathname
- install installa il pacchetto
- update updata pacchetti
Mantiene le informazioni sugli utenti.
nome:x(era la pwd un tempo, ora /etc/shadow):UID:GID:Nome:homepath:shell
- Hanno un nome e un GID, ogni user ha un gruppo principale.
- Il gruppo primario possiede i file creati dall'utente
- Solitamente il primary group è un gruppo con il nome dell'utente
- L'utente può essere in altri gruppi salvati in
/etc/group
L'utente root ha potere sul sistema, con privilegi massimi. La maggior parte dei device devono essere controllati da root, tranne i removibili.
- 0 sempre assegnato a root
- 1-200 assegnato ai system users (processi)
- 201-999 system users senza file
- 1000+ utenti regolari
Le password sono salvate in questo formato:
$hash_algorithm_index$random_encription_salt/hash/
Contiene le password:
login_name:password:data_di_modifica_since1970:giorni_minimi_cambio:giorni_massimi_cambio:giorni_warning:giorni_eccezione:scadenza_account_since1970:blank
Contiene le location contenenti eseguibili
Contiene la home dir
supermette di cambiare utente-setta l'environment a quello dell'utente nuovo, senza rimane uguale
sudopermette di eseguire un comando come rootuseraddcrea un utente con i campi di default (specificati in /etc/login) se non specificato diversamenteusermodmodifica un utente-cAggiunge un campo al GECOS field, es. nome completo-gSpecifica il gruppo primario-GSpecifica i gruppi aggiuntivi-aUsato con-G, appende i gruppi senza rimuoverlo da altri-dSpecifica l'home dir-mSposta la home a una nuova location, va usato con-d-sSpecifica una nuova login shell-LBlocca l'utente-USblocca l'utente
userdelelimina l'utente da /etc/passwd, ma lascia la home dir-relimina anche la home
groupaddcrea un gruppo-gspecifica il GID-rcrea un system group con un GID disponibile
groupmodmodifica un GID o un nome-nspecifica il nuovo nome-gspecifica il nuovo GID
groupdelelimina un gruppo
Possiamo settare impostazioni diverse per il creatore, il gruppo creatore, e gli altri. Abbiamo tre permessi: read 4, write 2, execute 1 Un file appena creato è di proprietà del creatore, con gruppo primario del creatore.
I permessi default per i file sono settati dai processi che li creano. Ma per file/dir creati da shell? Essi vengono filtrati dalla umask della shell, che rimuove i campi specificati
-
chmodmodifica i permessi di di un file (-R per directory ricorsivamente) WhoWhatWhich- Who u(ser), g(roup), o(ther), a(ll)
- What +, -, =
- Which r, w, x
-
chownmodifica il possessore del file (il possessore solo root, il gruppo anche user che vi appartengono) : specifica il gruppo -
setuid/setgidpermesso di execution che esegue il comando come se fosse l'utente possessore, s. S se l'owner non ha x -
In visualizzazione l, saranno t/T.
-
Se è specificato su una dir, i file creati all'interno avranno il creatore uguale alla dir e non l'effettivo
-
Specifichiamo setuid con un 4 prima del chmod, setgid con un 2, o con u+s e g+s
-
umaskmodifica la umask della shell.
- Running
RTASK_RUNNING: sta eseguendo sulla CPU o attendendo di eseguire
- Sleeping
STASK_INTERRUPTIBLE: sta aspettando qualche condizione hw/swDTASK_UNINTERRUPTIBLE: non risponde ai segnali. condizioni eccezionali.KTASK_KILLABLE: identico a D, ma risponde ai SIGKILL
- Stopped
TTASK_STOPPED: il processo è stato stoppato e può essere ripristinatoTTASK_TRACED: appare durante le pause di debug
- Zombie
ZEXIT_ZOMBIE: segnala al parent mentre esce. Tutte le risorse eccesso il PID rilasciateXEXIT_DEAD: una volta che il parent ha pulito, il processo è rimosso del tutto. Transitorio.
- Associato ad ogni pipeline, tutti i processi della pipeline sono parte del job.
- Un terminale supporta un job alla volta.
- Un processo in background di un terminale è membro di un altro job di quel terminale.
- I processi background non possono ricevere input ma possono scrivere.
- Un job bg può essere interrotto, se prova a leggere l'input avviene in automatico.
- Ciascun terminale può avere un foreground e più background.
HUP 1Hangup: reporta la terminazione del processo controllante di un terminaleINT 2Keyboard: causa il termine con ctrl+cQUIT 3Come INT ma produce un dump del processo. Ctrl+DKILL 9Termina il programma forzatamenteTERM 15Causa il termine. Può essere però bloccato, ignorato.CONT 18Resuma il processoSTOP 19Sospende il processo forzatamente.TSTP 20Uno STOP più educato, bloccabile, ignorabile... Ctrl+Z
Per mandare un processo in background, Ctrl+z
Rappresenta il carico del sistema negli ultimi 1,5,15 minuti, sulla base dei running e uninterruptible Tutte le CPU sono sommate, in quanto i processi si potrebbero spostare da una all'altra Linux conta ogni core/hyperthread come una CPU a parte, con request queues separate Possiamo ottenere i load averages tramite top, uptime e w Una CPU idle ha load 0; ogni processo aggiunge 1.
psmostra i processi correnti.-aprocessi associati al terminale-umostra l'utente collegato al processoauxmostra tutti i processi, con user e processi senza terminalelaxmostra tutti i processi con dettaglijmostra i jobs--sortsorta i processi
&Possiamo avviare un comando in background inserendo una & alla fine. Ci verrà mostrato il PID.jobsPermette di vedere i jobs della sessionefgPermette di portare un job in foreground tramite il suo id (%ID)bgPermette di avviare un job stoppato, in backgroundkillInvia un segnale a un processo selezionato da IDkillallInvia un segnale a tutti i processi che matchano unpatternpkillCome killall ma con filtri più avanzati-killa tutti i processi di un utente
wlista gli utenti correntemente loggati e le loro attività cumulative.- Tutti hanno un terminale principale, listato come pts/N per GUI o ttyN per terminali.
-fmostra il connecting systemtopmostra i processi di sistema dinamicamente, con un refresh continuo- Dati mostrati:
PIDProcess IDUSERusernameVIRTmemoria virtuale utilizzata, includendo il resident set, shared libs, swapRESmemoria fisica utilizzataSProcess state: D (uninterruptable), R (running), S (sleeping), T (stopped/traced), Z(zombie)TIMETempo di processo CPUCOMMANDcommand name
systemdfornisce un metodo per attivare risorse di sistema, daemons...systemctlgestisce gli oggetti di systemd, detti units. Alcune tipologie di units:.servicerappresenta un system service -> avvia frequently accessed daemons.socketrappresenta socket di comunicazione inter-processo..pathutilizzati per ritardare l'attivazione di un servizio finché avviene uno specifico cambiamento di file
- Opzioni:
statusMostra lo status di un servizio--typeMostra lo status di determinato type (service/socket/path)is-activeis-enabledlist-unitslist-unit-files--failed
- Comandi:
maskmaschera un servizio per impedirne l'avviounmaskunmascheradisabledisabilita a bootenableavvia a bootstopstartrestartreloadricarica configlist-dependencies
Processo che gira in background, avviato al boot, funziona fino allo shutdown. Per convenzione, finiscono per d
Canale di comunicazione con client locali e remoti. Creabile da daemons, o separati. Passato al daemon quando viene istanziata una connessione.
Si riferisce di solito a uno o più daemon, ma avviare/stoppare un servizio fa un one-time change allo stato del sistema, che non richiede un daemon.
grep permette di utilizzare RegEx per isolare dati matchanti
- utilizzo basic: grep 'RegEx' /file
- utilizzo piped: ps aux | grep '^student'
- Opzioni:
- -i disattiva case sensitivity
- -v Inverti la ricerca
- -r ricerca ricorsiva
- -A mostra n linee dopo il match
- -B mostra n linee prima del match
- -e multiple regex con or
whichmostra il path dell'eseguibile di un comando
È un commento per script bash, a meno che non sia escapato
Possiamo creare variabili con l'uguale, referenziarle con $ oppure ${}, preferibile in caso di ambiguità
Possiamo anche eseguire arithmetic expansion grazie alle doppie parentesi, come $((2+2)). Gli operatori sono i soliti.
il for scorre gli argomenti di uno ad uno. for in ; do done
Aggiungiamo -x a #!/bin/bash per attivare il debug, o -x all'esecuzione Possiamo anche usare l'istruzione "set +x" e "set -x" nello script
I parametri posizionali salvano i valori degli argomenti command-line
0 contiene lo script name, i seguenti gli argomenti
Possiamo uscire dallo script con codice. 0 è tutto ok, gli altri no. L'exit code viene salvato nella variabile $? Usciamo dallo script con exit n
è good practice verificare gli input con le espressioni
["$a" -eq "$b"]
- Opzioni:
-
-equguale -
-nediverso -
-gtmaggiore -
-ltminore -
-gemaggiore uguale -
-leminore uguale
-
- Opzioni per stringhe:
-
=uguale a -
==uguale a -
!=diverso
-
- Opzioni unary:
-
-zlunghezza zero -
-nnot null
-
- Opzioni unary per file:
-
-bil file esiste ed è block special -
-cil file esiste ed è char special -
-desiste ed è una directory -
-eesiste -
-ffile regolare -
-Lesiste ed è un symbolic link -
-resiste ed è permessa la lettura -
-sesiste ed ha size > 0 -
-wesiste ed è permessa la scrittura -
-xesiste ed è permessa l'esecuzione
-
- Opzioni binarie per file:
-
-efstesso device ed inode -
-ntmodification date più nuova -
-otmodification date più vecchia
-
- Leganti:
$$ and|| or
if permette di definire le condizioni così:
if <CONDITION>; then <COMMAND> fi
Possibile anche l'else:
if <CONDITION>; then <COMMAND> else <COMMAND> fi
Possibile l'else if
if <CONDITION>; then <COMMAND> elif <CONDITION>; then <COMMAND> else <COMMAND> fi
Possibile il multi condizionale:
case <VALUE> in <PATTERN1>) <COMMAND> ;; <PATTERN2>) <COMMAND>;; *) <DEFCOMMAND> ;; esac
Permette di esportare variabili all'environment
Solitamente, usiamo profile per settare ed esportare l'environment, RC per eseguire comandi profile è eseguito alla login shell, RC ogni volta che una shell è creata, login o non login
alias permette di definire comandi personalizzati Per renderli permanenti, li aggiungiamo a .bashrc
possiamo definire semplici funzioni con la notazione classica di C
Definirle in .bashrc equivale ad usarle come comandi
- firewalld è il metodo di default di CentOS7 per gestire host-level firewalls.
- Separa l'incoming traffic in zone, ognuna avente il suo set di regole.
- In ordine, matcha: indirizzo source, interfaccia, default.
- La zona di default è di solito la zona public.
- Configurazioni di default:
trustedhomeinternalworkpublicexternaldmzblockdropModifichiamo firewalld confirewall-cmdo con i file/etc/firewalld. (meglio la prima)
- Opzioni:
--get-default-zoneauto-explainatory--set-default-zone=ZONE cambia sia runtime che permanent--get-zoneslista tutte le zone disponibili--get-serviceslista i servizi predefiniti--add-source=<CIDR>routa tutto il traffico dall'ip alla zona specificata con--zone=<>, o default--remove-source=<CIDR>rimuove la rule legata al CIDR. possiamo specificare la zona da rimuovere--add-interface=<INT>routa tutto il traffico dall'interfaccia alla zona, se non spec. default--change-interface=<INT>associa l'interfaccia con la zona specificata al posto di quella di ora--list-alllista tutte le interfacce, source, servizi, porte per--zone=<ZONE>--list-all-zoneslista tutto per tutte le zone--add-service=<SERV>permette il traffico a<SERV>, possibile specificare--zone--add-port=<PORT>permette traffico alla porta/protocollo. Permette--zone--remove-service=<SERV>rimuove il servizio dai permessi della zona specificata--remove-port=<PORT>rimuove la porta/protocollo dai permessi della zona specificata--reloaddroppa la configurazione runtime e carica la persistent--add-rich-rule='RULE'aggiunge una rich rule--remove-rich-rule='R'rimuove una rich rule--query-rich-rule='RULE'ritorna 0 se la rule è presente nella zona, 1 se no--list-rich-rulesoutputta tutte le tule nella zona specificata
Le rich rules permettono sintassi più complesse per le rules del firewall.
- Struttura:
rule[source][destination]service|port|protocol|icmp-block|masquerade|forward-port[log][audit][accept|reject|drop]Per altre regole, firewalld.richlanguage(5) Possiamo usare le rich rules anche per loggare roba
L'ordinamento basic prevede
[port farwarding/masquerading][logging][deny][allow]Il primo match vince. Se un pacchetto non matcha nulla, di solito è denied. Le direct rules vengono parsate prima di tutte.
- Possiamo loggare le connessioni a syslog o al kernel audit.
- La sintassi basic per syslog è
log [prefix=""] [level=<LEV>] [limit value="<RATE/DURATION>"] - Con loglevel= emerg, alert, crit, error, warning, notice, info, debug
- duration in s, m, h, d (es. 3/m è 3 al minuto) *
- Sintassi simile è usabile con audit:
audit [limit value="<RATE/DURATION>"]
firewalld supporta due tipi di NAT: masquerading (IPv4 only) e port forwarding.
Col primo inoltriamo pacchetti non diretti a noi ad un altro IP, modificandone la source. Quando la risposta arriva, li modifichiamo di nuovo con la destination giusta.
attiviamo con firewall-cmd --permanent --zone=<ZONE> --add-masquerade o con rich rules.
Questo, invece, inoltra il traffico di una porta ad un'altra porta, interna o esterna
Per attivarlo, firewall-cmd --permanent --zone=<ZONE> --add-forward-port=port=<PORTNO>:proto=<PROTOCOL>[:toport=<PORTNO>][:toaddr=<IPADDR>]
Uno dei due tra toport e toaddr va messo.
Il webserver Apache implementa un server con supporto http, estensibile con moduli.
Una volta installato httpd-manual (incluso in httpd), e httpd.service avviato, basta vedere localhost/manual
La configurazione default è in /etc/httpd/conf/httpd.conf. Questa serve i contenuti di /var/www/html
Per attivare apache systemctl enable httpd.service, poi systemctl start httpd.service
Bisogna poi aprire firewalld:firewall-cmd --permanent --add-service=http --add-service https e ricaricarlo firewall-cmd --reload
I virtual hosts permettono di hostare più domini sullo stesso apache, in base a ip o nome.
Per comodità, definiamo i virtual hosts in file a parte in /etc/httpd/conf.d/site1.conf
- genera un set di chiavi per TLS con il parametro obbligatorio , il nome di dominio completo.
- chiede inoltre una lunghezza della chiave (scegliere minimo 2048 bits)
- sputa fuori 3 file:
<fqdn>.key(chiave privata, deve avere perm 0600 o 0400)<fqdn>.csrfile necessario per richiedere la firma a una CA<fqdn>.crtil certificato pubblico per i self-signed. Permessi 0644
Dobbiamo prima installare il modulo mod_ssl, che genererà una configurazione default ssl.conf
run <IMAGE>esegue un'image in un container, pullandola se necessario. Dopo, esegue il comando scritto, se non c'è nulla esce subito.-itcrea una shell interattiva-eaggiunge un'env-Ppubblica a porte random-ppubblica a porte arbitrarie--namesceglie un nome-vbinda un volume (-v local/folder:container/folder oppure /contfolder per Docker volume)
psvisualizza tutti i container attivi-amostra anche i non attivi
imagesmostra le images salvate localmentesearchcerca images su docker hubrm <HASH/NAME>elimina un container stoppatormi <IMAGE>elimina un'imagestopstoppa un containerrename <NOME1> <NOME2>rinomina un containerpullpulla un'immagine da registrysave -o <filename>.tar <NOMECONT>esporta l'image ad un archivioportmostra le porte associate
Per avviare nginx: docker run --detach -p 80:80 --name web nginx:latest