Me preguntaba cómo ejecutar un comando como otro usuario desde un script.
Tengo el propietario del script establecido como root. También tengo el siguiente comando ejecutándose dentro del script para ejecutar el comando como el usuario de Hudson:
su -c command hudson
¿Es esta la sintaxis correcta?
Respuesta aceptada:
Sí. Aquí está la --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
Y algunas pruebas (utilicé sudo
como no sé la contraseña de nobody
cuenta)
$ sudo su -c whoami nobody
[sudo] password for oli:
nobody
Cuando su comando toma argumentos, debe citarlo. Si no lo hace, ocurrirán cosas extrañas. Aquí estoy —como root— tratando de crear un directorio en /home/oli (como oli) sin citando el comando completo:
# su -c mkdir /home/oli/java oli
No passwd entry for user '/home/oli/java'
Solo se lee mkdir
como el valor para -c
flag y está tratando de usar /home/oli/java
como nombre de usuario. Si lo citamos, simplemente 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: -