opciones de su - ejecutar el comando como otro usuario

76

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 usuario hudson:

su -c command hudson

¿Es esta la sintaxis correcta?

recolector de basura
fuente
Para otros googlers: algunos usuarios pueden tener esta capacidad deshabilitada a propósito. Puede ejecutar sudo cat /etc/passwd | grep user-abc. Si ve algo como esto: user-abc:x:994:994::/home/user-abc:/bin/falseentonces no funcionará. Esto se debe a que la última parte " /bin/false" significa que no hay shell para ese usuario.
Alexander Bird

Respuestas:

80

Si. Aquí está el --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é sudoya que no sé la contraseña de la nobodycuenta)

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

Cuando su comando toma argumentos, necesita citarlo. Si no lo haces, ocurrirán cosas extrañas. Aquí estoy, como root, tratando de crear un directorio en / home / oli (como oli) sin citar el comando completo:

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

Solo se lee mkdircomo el valor de la -cbandera y está tratando de usarlo /home/oli/javacomo 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: -
Oli
fuente
52

Nota: "Tengo el propietario del script configurado como root" no hace nada; incluso si tiene el bit setuid establecido, todavía no funciona


Sin embargo, suponiendo que realmente esté ejecutando el script como root, puede usarlo sudo. sues principalmente para cambiar de usuario, mientras que sudoes para ejecutar comandos como otros usuarios. El -uindicador le permite especificar qué usuario ejecutar el comando como:

sudo -u hudson command
Michael Mrozek
fuente
1
Muchas veces me he enfrentado (en los sistemas en los que se administraron bien-sudoers) que tratar de usar sudosólo se puede conseguir esto: root is not in the sudoers file. Lo que hace que su - <username> -c "command to run"la única opción.
RAM237
Las citas no son necesarias al ejecutar un comando no trivial. (Ej. sudo -u kilgore mv this that)
toraritte