eseguire lo script come utente con nologin shell


88

Tutto quello che devo fare è eseguire uno script specifico come un particolare utente a cui è nologin/falseindicata la shell /etc/passwd.

Vorrei eseguire lo script come root e questo dovrebbe essere eseguito come un altro utente. In esecuzione:

~# su -c "/bin/touch /tmp/test" testuser

funzionerebbe, ma ho bisogno di una shell valida per il testuser. So che posso disabilitare la password con passwd -d testusere lasciare la shell in /bin/bashquesto modo sarebbe sicuro un po ', ma ho bisogno di avere la nologin/falseshell.

Fondamentalmente ciò di cui ho bisogno è cosa crontabfa quando impostiamo i lavori per essere eseguiti come un particolare utente, indipendentemente dal fatto che questo abbia nologin/falseshell.

ps Ho trovato questo thread Eseguendo un comando come utente nologin , ma non ho idea di come eseguire concatenateil comando su -s /bin/sh $userdello script.

Risposte:


119

È possibile utilizzare l'opzione -s su su per eseguire una shell particolare

su -s /bin/bash -c '/path/to/your/script' testuser

(Preparati sudoa quanto sopra se testuserè un utente senza password.)


E se su fosse root:root -rwsr-x---?
Patryk,

1
Cosa succede se l'utente non ha una password?
CMCDragonkai,

3
@Wesley Ho scoperto che devi essere root per eseguire quel comando per utenti senza password.
CMCDragonkai,

1
@lain, se l'utente non dovrebbe avere una shell, il processo relativo al comando non dovrebbe essere figlio di un processo bash. Quindi, dovresti anche usare exec per sostituire la shell con lo script. E se ti piace rendere lo script un figlio di init, basta usare &, ad esempiosu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor,

1
Da quando ho trascorso gli ultimi 20 minuti a capire come ottenere lo stesso risultato usando runuser, vorrei sottolineare che il su -s SHELLparametro rende il comando runuser praticamente inutile :) Grazie Jan!
Jirka,

12

Puoi farlo con sudo -use lo hai installato:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin

Come si passano i parametri a sudo -u apache whoami?
CMCDragonkai,

@CMCDragonkai Eventuali parametri dopo il comando verranno passati. Puoi pensarlo come "sudo [-u apache] [whoami <param1> <param2>]".
Tuttofare5,

Penso che usare sudo -uprobabilmente non sia una buona idea per eseguire comandi come utente nologin, perché espone SUDO_USERnell'ambiente chi è quello reale che invoca il comando. Forse sto solo pensando troppo.
Meow,

5

Fornendo lo script come argomento da eseguire su / bin / sh:

su -s "/bin/sh /your/script/location" username

2

appena reso conto :

su -s "/ bin / bash" -c "/ bin / touch / tmp / testuser" testuser

forse c'è un modo migliore ?!


0

in realtà, il modo migliore per farlo è tramite runuser

vedere la pagina man per i dettagli

questo strumento viene utilizzato per gestire la situazione, come ha affermato lo sviluppatore nel suo bolg

Ogni volta che un servizio è in esecuzione come root e vuole cambiare UID usando la shell, dovrebbe usare runuser.

http://danwalsh.livejournal.com/55588.html

ho pubblicato questa risposta in molti palazzi, perdonami se lo trovi fastidioso


Si prega di non pubblicare risposte di soli collegamenti per prevenire la putrefazione dei collegamenti. Invece, aggiungi le informazioni più pertinenti dal link alla tua risposta o, in alternativa, pubblica il link come commento anziché come risposta. Vedere questo serverfault.com/help/how-to-answer articolo del centro assistenza per ulteriori informazioni.
Federico Galli,

@FedericoGalli sono già state aggiunte le informazioni più rilevanti, non è necessario copiare e incollare l'utilizzo, la pagina man fornisce informazioni sufficienti
Z-Y00,

-1

Utilizzare sudo -u per specificare l'utente. Utilizzare anche il flag -i per impostare anche le variabili di ambiente dell'utente di destinazione.

sudo -i -u user command

1
questo dàThis account is currently not available.
knocte il

-3

Usa il comando su con shell -s e il comando -c. Come mostrato di seguito

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash

2
Questa è esattamente la soluzione dalla risposta più votata.
Gerald Schneider,
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.