su options - executando o comando como outro usuário

75

Eu queria saber como executar um comando como outro usuário a partir de um script.

Eu tenho o proprietário do script definido como raiz. Também tenho o seguinte comando sendo executado no script para executar o comando como o usuário hudson:

su -c command hudson

Essa é a sintaxe correta?

coletor de lixo
fonte
Para outros googlers: alguns usuários podem ter essa capacidade desativada de propósito. Você pode correr sudo cat /etc/passwd | grep user-abc. Se você user-abc:x:994:994::/home/user-abc:/bin/falsevir algo assim: não funcionará. Isso porque a última parte " /bin/false" significa que não há shell para esse usuário.
Alexander Bird

Respostas:

78

Sim. Aqui está o --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 alguns testes (usei sudocomo não sei a senha da nobodyconta)

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

Quando seu comando recebe argumentos, você precisa citá-lo. Caso contrário, coisas estranhas ocorrerão. Aqui estou eu - como root - tentando criar um diretório em / home / oli (como oli) sem citar o comando completo:

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

Ele é lido apenas mkdircomo o valor do -csinalizador e está tentando usar /home/oli/javacomo nome de usuário. Se citamos, simplesmente funciona:

# 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: -
Oli
fonte
52

Nota: "Eu tenho o proprietário do script definido como raiz" não faz nada; mesmo se você tiver definido o bit setuid, ele ainda não funcionará


Supondo que você esteja executando o script como root, no entanto, você pode usá-lo sudo. sué principalmente para alternar usuários, enquanto sudopara executar comandos como outros usuários. O -usinalizador permite especificar qual usuário executar o comando como:

sudo -u hudson command
Michael Mrozek
fonte
1
Muitas vezes eu ter enfrentado (nos sistemas onde sudoers é bem administrada) que a tentativa de usar sudovocê pode simplesmente obter este: root is not in the sudoers file. O que torna su - <username> -c "command to run"a única opção.
RAM237
As cotações não são necessárias ao executar um comando não trivial. (Eg sudo -u kilgore mv this that)
toraritte