it-swarm.it

Come determinare da dove proviene una variabile d'ambiente?

Ho un'istanza di Linux che ho configurato qualche tempo fa. Quando lo accendo e accedo come root ci sono alcune variabili di ambiente che ho impostato ma non riesco a ricordare o trovare da dove provengono.

  • Ho controllato ~/.bash_profile, /etc/.bash_rc e tutti gli script di avvio.
  • Ho eseguito find e grep senza alcun risultato.

Mi sento come se stessi dimenticando di guardare in qualche posto ovvio. C'è un trucco per capirlo?

177
Joel

Se si utilizza il comando env per visualizzare le variabili, queste dovrebbero apparire all'incirca nell'ordine in cui sono state create. Puoi usarlo come guida se sono stati impostati dal sistema molto presto nel boot, o da un successivo .profile o altro file di configurazione. Nella mia esperienza, i comandi set e export ordineranno le loro variabili in ordine alfabetico, quindi l'elenco non è altrettanto utile.

63
Ben Combee

Se zsh è la shell di accesso:

zsh -xl

Con bash:

PS4='+$BASH_SOURCE> ' BASH_XTRACEFD=7 bash -xl 7>&2

Ciò simulerà una shell di login e mostrerà tutto ciò che viene fatto (tranne nelle aree in cui stderr viene reindirizzato con zsh) insieme al nome del file attualmente interpretato.

Quindi tutto ciò che devi fare è cercare il nome della variabile di ambiente in quell'output. (puoi usare il comando script per aiutarti a memorizzare l'intero output della sessione Shell, oppure per l'approccio bash, usa 7> file.log invece di 7>&2 per memorizzare l'output xtrace su file.log anziché sul terminale).

Se la tua variabile non è presente, probabilmente Shell l'ha ereditata all'avvio, quindi è stata impostata prima come nella configurazione PAM, in ~/.ssh/environment o cose lette all'avvio della sessione X11 (~/.xinitrc, ~/.xsession) o impostare la definizione del servizio che ha avviato il gestore degli accessi o anche prima in alcuni script di avvio. Poi un find /etc -type f -exec grep -F THE_VAR {} + posso aiutare.

158

Alcuni posti in cui guardare prima:

Sistema

  • /etc/environment: specifico per le variabili di ambiente
  • /etc/env.d/*: variabili di ambiente, suddivise in più file
  • /etc/profile: tutti i tipi di script di inizializzazione
  • /etc/profile.d/*: script di inizializzazione
  • /etc/bashrc, /etc/bash.bashrc: pensato per funzioni e alias

Specifico per l'utente

  • ~/.bash_profile: inizializzazione per shell di login (bash-)
  • ~/.bashrc: inizializzazione per tutte le shell interattive (bash-)
  • ~/.profile: utilizzato per tutte le shell
  • ~/.cshrc, ~/.zshrc, ~/.tcshrc: simile per shell non bash
65
beetstra

@Cian è corretto. Oltre a usare find e grep, non c'è molto che puoi fare per scoprire da dove proviene. Sapendo che è davvero una variabile d'ambiente, proverei a focalizzare la tua ricerca in/etc/e nella tua home directory. Sostituisci VARIABLE con la variabile appropriata che stai cercando:

$ grep -r VARIABLE /etc/*

$ grep -r VARIABLE ~/.*

34
Aaron Toponce

Se inserisci set -x nella tua .profile o .bash_profile, tutti i comandi Shell successivi verranno registrati nell'errore standard e puoi vedere se uno di questi imposta queste variabili. Puoi mettere set -x in cima a /etc/profile anche per rintracciarlo. L'output può essere molto dettagliato, quindi potresti voler reindirizzarlo su un file con qualcosa come exec 2>/tmp/profile.log.

Se il tuo sistema utilizza PAM, cerca pam_env carica richieste in /etc/pam.conf o /etc/pam.d/*. Questo modulo carica le variabili di ambiente dai file specificati o da un valore predefinito di sistema se non viene specificato alcun file (/etc/environment e /etc/security/pam_env.conf su Debian e Ubuntu). Un altro file con definizioni delle variabili di ambiente su Linux è /etc/login.defs (cerca le righe che iniziano con ENV_).

Controlla i tuoi script di avvio per i file che loro fonte usando . (punto) o source. Tali file potrebbero trovarsi in altre directory oltre a /etc e $HOME.

Per gli utenti zsh, può essere utile tracciare i file a cui si accede (durante l'avvio), non sono troppi e si può guardare uno ad uno per trovare dove è stato definito qualcosa.

zsh -o SOURCE_TRACE
4
Erik Zivkovic

le variabili d'ambiente sono memorizzate nel file/etc/profile quindi fai più/etc/profile e controlla solo le variabili env che vuoi e se/etc/profile non è presente, allora cerca il file .profile nella tua home directory

0
Sarvesh Pawar