In che modo sudo è impostato per non modificare $ HOME in Ubuntu e come disabilitare questo comportamento?


39

Su Ubuntu 12.04, quando I sudo -sla variabile $ HOME non viene modificata, quindi se il mio utente normale lo è regularuser, la situazione si presenta così:

$ cd
$ pwd
/home/regularuser
$ sudo -s
# cd
# pwd
/home/regularuser

Ho abbandonato Ubuntu molto tempo fa, quindi non posso esserne sicuro, ma penso che questo sia il comportamento predefinito. Quindi, le mie domande sono:

Q1. Come si fa? Dov'è la configurazione?

Q2. Come lo disabilito?

Modifica: grazie per le risposte, che hanno chiarito un po 'le cose, ma credo di dover aggiungere un paio di domande, per ottenere la risposta che sto cercando.

Q3. In Debian sudo -s, cambia la variabile $ HOME in /root. Da quello che ottengo dalle risposte e man sudola shell con cui correva sudo -sè quella data /etc/passwd, giusto?

Q4. Tuttavia, sia su Ubuntu sia su Debian la shell fornita /etc/passwdper root è /bin/bash. Inoltre, in entrambi i sistemi, non riesco a trovare la differenza tra i file .profileo .bashrc, per quanto riguarda $ HOME, il comportamento di sudo -sdifferisce. Qualche aiuto su questo?


Hai risposto a una parte della tua domanda in un commento sulla mia risposta, ma ho pensato di inserire qui il link unix.stackexchange.com/questions/38175/… . Penso che il tuo reclamo in Q3 sia perché alcune persone impostano il loro profilo e i file rc in modo che agiscano allo stesso modo indipendentemente dal fatto che siano o meno in una shell di login. Penso che sia improbabile che sudosi comporti diversamente tra Debian e Ubuntu.
msw,

@msw Per quanto riguarda la differenza tra Debian e Ubuntu (12.04) sudo, penso che effettivamente ci sia una differenza di default. Tuttavia, non ci scommetto, dal momento che sono su una scatola che è stata configurata da qualcun altro e funziona da un po 'di tempo. In ogni caso, per chiunque fosse interessato, ho trovato security.stackexchange.com/questions/18369/… e bugs.launchpad.net/ubuntu/+source/sudo/+bug/760140 .
alxs

Risposte:


51

Sudo ha molte opzioni di configurazione in fase di compilazione. Puoi elencare le impostazioni nella tua versione con sudo -V. Una delle differenze tra la configurazione in Debian wheezy e in Ubuntu 12.04 è che la HOMEvariabile d'ambiente è conservata in Ubuntu ma non in Debian; entrambe le distribuzioni cancellano tutte le variabili d'ambiente tranne alcune che sono esplicitamente contrassegnate come sicure da conservare. Quindi sudo -sconserva HOMEsu Ubuntu, mentre su Debian HOMEviene cancellato e sudoquindi lo imposta sulla home directory dell'utente di destinazione.

È possibile ignorare questo comportamento nel sudoersfile. Esegui visudoper modificare il sudoersfile. Esistono diverse opzioni pertinenti:

  • env_keepdetermina quali variabili di ambiente vengono conservate. Utilizzare Defaults env_keep += "HOME"per conservare la HOMEvariabile di ambiente del chiamante o Defaults env_keep -= "HOME"per cancellarla (e sostituirla con la home directory dell'utente di destinazione).
  • env_resetdetermina se le variabili di ambiente vengono resettate affatto. Il ripristino delle variabili di ambiente è spesso necessario per le regole che consentono l'esecuzione di un comando specifico, ma non presenta un vantaggio diretto in termini di sicurezza per le regole che consentono comunque l'esecuzione di comandi arbitrari.
  • always_set_home, se impostato, fa sì HOMEche venga sovrascritto anche se è stato conservato a causa della env_resetdisabilitazione o HOMEdell'essere env_keepnell'elenco. Questa opzione non ha alcun effetto se HOMEnon viene comunque conservata.
  • set_homeè come always_set_home, ma si applica solo a sudo -s, non quando si chiama sudocon un comando esplicito.

Queste opzioni possono essere impostate per un determinato utente di origine, un determinato utente di destinazione o un determinato comando; vedere il sudoersmanuale per i dettagli.

Puoi sempre scegliere di eseguire l'override HOMEdi una determinata chiamata sudopassando l'opzione -H.

La shell non sovrascriverà mai il valore di HOME. (Impostarebbe HOMEse non fosse impostato, ma sudoimposta sempre in HOMEun modo o nell'altro.)

Se si esegue sudo -i, sudosimula un accesso iniziale. Ciò include l'impostazione HOMEdella home directory dell'utente di destinazione e il richiamo di una shell di accesso .


17

Utilizzare sudo -H -iinvece di sudo -sottenere una shell root di accesso interattiva:

sudo -H -i
cd
pwd -P  #  /private/var/root  (on Mac OS X 10.6.8)

Da man sudo:

-H      The -H (HOME) option sets the HOME environment variable to
        the homedir of the target user (root by default) as
        specified in passwd(5).  By default, sudo does not modify
        HOME (see set_home and always_set_home in sudoers(5)).

-iimplica -H.
X-yuri,

5

Questo ha poco a che fare con il comportamento sudoe molto a che fare con la differenza tra una "shell di login" e una "shell non di login". La soluzione rapida è

$ sudo -i

come si può vedere con:

$ sudo -s
# id
uid=0(root) gid=0(root) groups=0(root)
# echo $HOME
/home/msw
# exit
$ sudo -i
# echo $HOME
/root
# pwd
/root

Come notato nel manuale sudo:

L'opzione -i (simula il login iniziale) esegue la shell specificata dalla voce del database delle password dell'utente di destinazione come shell di login. Ciò significa che i file di risorse specifici per l'accesso come .profile o .login verranno letti dalla shell. Se viene specificato un comando, viene passato alla shell per l'esecuzione tramite l'opzione -c della shell. Se non viene specificato alcun comando, viene eseguita una shell interattiva.


Grazie per i dettagli extra, mi hanno chiarito un po 'di più le cose. Immagino che devo controllare la differenza tra le conchiglie. Per chiunque legga questo, nella stessa situazione con me, controlla questo: unix.stackexchange.com/questions/38175/…
alxs

1
No, se sudo cambia HOMEo meno ha tutto a che fare con la configurazione di sudo.
Gilles 'SO- smetti di essere malvagio' il

@Gilles: Allora, come si configura sudo? In /etc/sudoers, non c'è nulla di diverso tra Debian e Ubuntu per quanto riguarda $ HOME.
alxs

1
@alxs IIRC Debian e Ubuntu hanno impostazioni predefinite di compilazione diverse. Puoi sovrascriverli con le opzioni always_set_homee set_homein sudoers.
Gilles 'SO- smetti di essere malvagio' il

@Gilles: grazie. Questa è esattamente la risposta che sto cercando, sia sul perché ciò accada sia su come ripristinarlo. Se non ti dispiace pubblicarlo, lo accetterò come risposta. Potrei farlo da solo, ma non voglio prendermi il merito.
alxs

2

Un modo abbastanza popolare per ottenere la shell di root sta usando anche:

 $ sudo su - 
 # id
 uid=0(root) gid=0(root) groups=0(root)
 # pwd
 /root

Uso per usarlo sudo -i -H, ma non è riuscito con l'installazione di un pacchetto npm globale da Git. Con sudo su -funziona! Grazie.
Laurent,

0

Per sbarazzarsi del diverso comportamento di rispettivamente sudo -ssu Ubuntu e Debian, è possibile utilizzare un sudowrapper (risposta a Q4):

sudos() {
   local PATH="$(getconf PATH)" root_homedir
   root_homedir="$(sudo -H sh -c 'printf "%s" "$HOME"')"
   sudo sh -c 'export HOME="$0"; exec sh -i' "$root_homedir"
   return 0
}

sudo -k
sudos
{
logname
whoami
id -un
id -ur
echo "PATH: $PATH"
}
exit
echo "PATH: $PATH"
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.