sudo come un altro utente con il loro ambiente


56

$ whoami
admin
$ sudo -S -u otheruser whoami
otheruser
$ sudo -S -u otheruser /bin/bash -l -c 'echo $HOME'
/home/admin

Perché non $HOMEè impostato su /home/otheruseranche se bash è invocato come shell di login?

In particolare, /home/otheruser/.bashrcnon viene fornito. Inoltre, /home/otheruser/.profilenon viene fornito. - ( /home/otheruser/.bash_profilenon esiste)


Una soluzione a questa domanda risolverà anche l'altra domanda, potresti voler eliminare l'altra domanda in questa situazione.
Pavel Šimerda,

Risposte:


83

Per invocare una shell di accesso, sudobasta usare -i. Quando il comando non viene specificato, verrà visualizzato un prompt della shell di accesso, altrimenti verrà visualizzato l'output del comando.

Esempio (shell di login):

sudo -i

Esempio (con un utente specificato):

sudo -i -u user

Esempio (con un comando):

sudo -i -u user whoami

Esempio (utente di stampa $HOME):

sudo -i -u user echo \$HOME

Nota: il carattere barra rovesciata assicura che il simbolo del dollaro raggiunga la shell dell'utente di destinazione e non sia interpretato nella shell dell'utente chiamante.

Ho appena controllato l'ultimo esempio con strace che ti dice esattamente cosa sta succedendo. Il muggito di output mostra che la shell viene chiamata con --logine con il comando specificato, proprio come nella tua chiamata esplicita a bash, ma in più sudo può fare il suo lavoro come impostare il file $HOME.

# strace -f -e process sudo -S -i -u user echo \$HOME
execve("/usr/bin/sudo", ["sudo", "-S", "-i", "-u", "user", "echo", "$HOME"], [/* 42 vars */]) = 0
...
[pid 12270] execve("/bin/bash", ["-bash", "--login", "-c", "echo \\$HOME"], [/* 16 vars */]) = 0
...

Ho notato che stai usando -Se non penso che sia generalmente una buona tecnica. Se si desidera eseguire comandi come utente diverso senza eseguire l'autenticazione dalla tastiera, è possibile utilizzare SSH. Funziona localhostsia per altri host sia per l'autenticazione con chiave pubblica che funziona senza input interattivi.

ssh user@localhost echo \$HOME

Nota: non è necessaria alcuna opzione speciale con SSH poiché il server SSH crea sempre una shell di accesso a cui il client SSH può accedere.


2
sudo -i -u user echo \$HOMEnon funziona per me. Uscita: $HOME. strace fornisce lo stesso output del tuo. Qual è il problema?
John_West,

Non ne ho idea, funziona ancora per me, dovrei vederlo o forse anche toccare il sistema.
Pavel Šimerda,

10

Stai dando troppo credito a Bash. Tutta la "shell di accesso" significa che Bash è quello che i file provengono all'avvio e allo spegnimento. La $HOMEvariabile non ci figura.

I documenti di Bash spiegano ancora cosa significa shell di accesso: https://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html#Bash-Startup-Files

In effetti, Bash non fa nulla da impostare $HOME. $HOMEè impostato da qualunque cosa invochi la shell (login, ssh, ecc.) e la shell la eredita. Qualunque cosa abbia avviato la shell come set di amministrazione $HOMEe quindi eseguita bash, in sudobase alla progettazione non modifica l'ambiente a meno che non venga richiesto o configurato per farlo, così bashcome altri utenti l'hanno ereditato dalla shell.

Se vuoi sudogestire più ambiente nel modo che ti aspetti, guarda l' -iinterruttore per sudo. Provare:

sudo -S -u otheruser -i /bin/bash -l -c 'echo $HOME'

La pagina man di sudo la descrive in modo più dettagliato, anche se non proprio bene, penso: http://linux.die.net/man/8/sudo


4
$ HOME non è impostato da bash - Grazie, non lo sapevo.
user80551

Cerca un passo nella mia risposta. Indica che non è necessario creare la /bin/bash -l -c 'echo $HOME'riga di comando durante l'utilizzo -i.
Pavel Šimerda,

1
Quella sudosintassi ha generato un errore sulla mia macchina. ( suusa l' -copzione, ma non credo sudo.) Ho avuto più fortuna con:HomeDir=$( sudo -u "$1" -H -s echo "\$HOME" )
palswim

sì, @palswim ha ragione. Non sono sicuro di -S(non ne avevo bisogno, quindi l'ho lasciato fuori), ma -cnon funziona qui, è necessario -sinvece.
polynomial_donut
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.