su options: esegue il comando come un altro utente


76

Mi chiedevo come eseguire un comando come un altro utente da uno script.

Ho il proprietario dello script impostato come root. Ho anche il seguente comando in esecuzione all'interno dello script per eseguire il comando come utente hudson:

su -c command hudson

È questa la sintassi corretta?


Per altri googler: alcuni utenti potrebbero avere questa capacità disabilitata di proposito. Puoi correre sudo cat /etc/passwd | grep user-abc. Se vedi qualcosa del genere: user-abc:x:994:994::/home/user-abc:/bin/falsenon funzionerà. Questo perché l'ultima parte " /bin/false" indica che non esiste alcuna shell per quell'utente.
Alexander Bird,

Risposte:


80

Sì. Ecco il --help:

$ su --help
Usage: su [options] [LOGIN]

Options:
  -c, --command COMMAND         pass COMMAND to the invoked shell
  -h, --help                    display this help message and exit
  -, -l, --login                make the shell a login shell
  -m, -p,
  --preserve-environment        do not reset environment variables, and
                                keep the same shell
  -s, --shell SHELL             use SHELL instead of the default in passwd

E alcuni test (ho usato sudoperché non conosco la password per l' nobodyaccount)

$ sudo su -c whoami nobody
[sudo] password for oli: 
nobody

Quando il tuo comando accetta argomenti, devi citarlo. In caso contrario, accadranno cose strane. Eccomi —come root— cercando di creare una directory in / home / oli (come oli) senza citare il comando completo:

# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'

Viene letto solo mkdircome valore per il -cflag e sta tentando di utilizzare /home/oli/javacome nome utente. Se lo citiamo, funziona e basta:

# su -c "mkdir /home/oli/java" oli
# stat /home/oli/java
  File: ‘/home/oli/java
  Size: 4096        Blocks: 8          IO Block: 4096   directory
Device: 811h/2065d  Inode: 5817025     Links: 2
Access: (0775/drwxrwxr-x)  Uid: ( 1000/     oli)   Gid: ( 1000/     oli)
Access: 2016-02-16 10:49:15.467375905 +0000
Modify: 2016-02-16 10:49:15.467375905 +0000
Change: 2016-02-16 10:49:15.467375905 +0000
 Birth: -

52

Nota: "Ho il proprietario dello script impostato come root" non fa nulla; anche se hai impostato il bit setuid , non funziona ancora


Supponendo che tu stia effettivamente eseguendo lo script come root, tuttavia, puoi usarlo sudo. suserve principalmente per cambiare utente, mentre sudoper eseguire comandi come altri utenti. Il -uflag ti consente di specificare quale utente eseguire il comando come:

sudo -u hudson command

1
Molte volte ho affrontato (nei sistemi in cui sudoers è ben amministrati-) che provare a utilizzare sudosi può solo ottenere questo: root is not in the sudoers file. Il che rende su - <username> -c "command to run"l'unica opzione.
RAM237,

Virgolette non necessarie quando si esegue un comando non banale. (Ad es. sudo -u kilgore mv this that)
Toraritte
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.