ejecutar script como usuario que tiene shell nologin

87

Todo lo que necesito hacer es ejecutar un script específico como un usuario particular que tiene el nologin/falseshell indicado /etc/passwd.

Ejecutaría el script como root y esto debería ejecutarse como otro usuario. Corriendo:

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

funcionaría, pero necesito un shell válido para el usuario de prueba. Sé que puedo deshabilitar la contraseña passwd -d testusery dejar el shell de /bin/bashesta manera aseguraría un poco, pero necesito tener un nologin/falseshell.

Básicamente, lo que necesito es qué crontabhace cuando configuramos trabajos para que se ejecuten como un usuario en particular, independientemente de que este tenga nologin/falseshell.

ps Encontré este hilo Ejecutando un comando como usuario nologin , pero no tengo idea de cómo ejecutar concatenateel comando su -s /bin/sh $userpara el script.

Tommaso
fuente

Respuestas:

119

Puede usar el modificador -s para su para ejecutar un shell particular

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

(Anteponga sudolo anterior si testuseres un usuario sin contraseña).

Iain
fuente
¿Qué pasa si su es root:root -rwsr-x---?
Patryk
1
¿Qué pasa si el usuario no tiene una contraseña?
CMCDragonkai
3
@Wesley Descubrió que debe ser root para ejecutar ese comando para usuarios sin contraseña.
CMCDragonkai
1
@lain, si se supone que el usuario no tiene un shell, el proceso relacionado con el comando no debe ser hijo de un proceso bash. Por lo tanto, también debe usar exec para reemplazar el shell con el script. Y si desea hacer que el guión sea un hijo de init, simplemente use &, como ejemplosu -s /bin/bash -c 'exec /path/to/your/script &' test
Facundo Victor el
1
Como he pasado los últimos 20 minutos trabajando en cómo lograr el mismo resultado runuser, me gustaría señalar que el su -s SHELLparámetro hace que el comando runuser sea bastante inútil :) ¡Gracias Jan!
jirka
12

Puede hacer esto sudo -usi lo tiene instalado:

# whoami
root
# sudo -u apache whoami
apache
# getent passwd apache
apache:x:48:48:Apache:/var/www:/sbin/nologin
Manitas5
fuente
¿Cómo pasas los parámetros sudo -u apache whoami?
CMCDragonkai
@CMCDragonkai Cualquier parámetro después del comando se pasará. Puedes pensarlo como "sudo [-u apache] [whoami <param1> <param2>]".
Handyman5
Creo que usar sudo -uprobablemente no sea una buena idea para ejecutar comandos como usuario nologin, porque expone SUDO_USERen el entorno quién es el verdadero que invoca el comando. Tal vez solo lo estoy pensando demasiado.
Miau
5

Al proporcionar el script como argumento para ejecutar en / bin / sh:

su -s "/bin/sh /your/script/location" username
Adaptador
fuente
2

me acabo de dar cuenta :

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

tal vez hay una mejor manera?

Tommaso
fuente
0

en realidad, la mejor manera de hacerlo es a través de runuser

vea la página del manual para más detalles

esta herramienta se usa para lidiar con la situación como dijo el desarrollador en su bolg

Cada vez que un servicio se ejecuta como root y quiere cambiar el UID usando el shell, debe usar runuser.

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

He publicado esta respuesta en muchos palacios, perdóname si encuentras esto molesto

Z-Y00
fuente
No publique respuestas de solo enlace para evitar la descomposición del enlace. En su lugar, agregue la información más relevante del enlace a su respuesta o, alternativamente, publique el enlace como un comentario en lugar de una respuesta. Consulte este artículo del centro de ayuda serverfault.com/help/how-to-answer para obtener más información.
Federico Galli
@FedericoGalli la información más relevante ya está agregada, no hay necesidad de copiar y pegar el uso, la página del manual proporciona suficiente información
Z-Y00
-1

Use sudo -u para especificar el usuario. Utilice también el indicador -i para establecer las variables de entorno del usuario objetivo también.

sudo -i -u user command
Wayne Shelley
fuente
1
esto daThis account is currently not available.
knocte
-3

Utilice su comando con shell -s y -c comando. Como se muestra abajo

 su  exec -l -c '/bin/bash /etc/update_conf.sh' -s /bin/bash
chetan
fuente
2
Esa es exactamente la solución de la respuesta mejor calificada.
Gerald Schneider