Ejecute el script como root al iniciar sesión (sin usuario sudoer, sesión de shell)

8

Muy parecido /etc/profiley ~/.profileejecutado por root en lugar de que el usuario esté haciendo inicio de sesión. /etc/rc.localse ejecuta después del arranque, pero necesito ejecutar el script antes de iniciar sesión. El usuario no es un sudoer.

¡Gracias!

Antonio Sánchez
fuente
Puede haber una manera de hacer esto, pero no sería así /etc/profileo ~/.profileporque la ejecución del código en esos scripts es realizada por el shell del usuario y está sujeta al control del usuario, mientras que si no desea que el usuario tenga poder ejecutar programas como rootellos mismos, entonces esto tendrá que hacerlo algún servicio en ejecución externo a los procesos del usuario. ... Puede ser útil que nos diga el propósito del script que desea ejecutar.
Eliah Kagan
Necesito realizar un montaje específico (--bind) para un usuario específico. He intentado fstab con opciones de propietario y usuario, pero no funciona. /etc/rc.local es una opción, pero siempre realiza el montaje tanto si el usuario inicia sesión como si no. Actualmente he otorgado privilegios de sudoer para 'montar' al usuario, pero esta es una solución alternativa y no me gusta otorgar ningún privilegio a los usuarios estándar. Creo que usaré rc.local en su lugar. ¡Gracias!
Antonio Sánchez
Puede crear un script raíz solo con ese mountcomando en particular y otorgar al usuario el privilegio de ejecutar solo ese script (configuración /etc/sudoers). Un comando con opciones dadas se puede configurar directamente en sudoers.
enzotib
Ya lo he intentado de esa manera. El caso es que cuando llega el momento de ejecutar 'mount' dentro del script, nuevamente 'sudo' es obligatorio, porque el script se ejecuta por 'user' y no por 'root', por lo que al final del día 'mount' debe otorgarse también para 'usuario' y en lugar de solo una regla de sudoers ahora tengo dos. Esta es mi experiencia, así que por favor, tenga en cuenta que no soy un experto y tal vez he hecho algo mal. ¡Gracias!
Antonio Sánchez

Respuestas:

3

Solo para volver al método de los sudoers, creo que ya casi había llegado antes de darse por vencido. Mirando sus últimos comentarios, me gustaría abordar algo que probablemente arregle las cosas por usted:

Si ejecuta un script como root, no necesita llamar a sudo desde dentro.

Tengo un script como este:

#! /bin/bash

echo $USER
whoami

Si corro sudo ./myscriptveo rootdevuelto para ambos. La sesión en la que se ejecuta el script es un shell raíz.

En resumen, eso significa que todo lo que haces en tu script ya tiene permisos de root. No necesita llamar sudo(no es que deba doler, por lo rootgeneral tiene sudopermisos).

Así que escribir su guión, chownque a rooty chmodque 700(por lo que sólo root puede ejecutar, leer, editar o ella) y luego simplemente permitir que su usuario [s] para ejecutarlo a través sudoers. Eso debería funcionar.

Si no funciona, es probable que sea un problema mayor con el script, no con el marco de permisos. Sugeriría darle a un usuario sudoacceso completo (agregar al grupo de administración es la forma más fácil) y luego ejecutar su script.

Oli
fuente
2

Paso 1. crea un script con el comando bind usando cualquier editor. Por ejemplo:

sudo emacs bind_user_directories.sh

contenido:

#!/bin/bash

#NOTE: this file would be placed in /usr/local/sbin/ folder as bind_user_directories.sh
#alternatively it could be placed in /etc/init.d/ ... (I guess)

### BEGIN INIT INFO
# Provides:          bind_user_directories
# Required-Start:    
# Required-Stop:     
# Should-Start:      $named
# Default-Start:     0 2 3 4 5 6 (I guess...)
# Default-Stop:      1
# Short-Description: mount --bind for a user
# Description:       runs mount --bind command for certain pre-defined directories for a specific user
### END INIT INFO

# What is this?
DESC="bind_user_directories"

# See how we were called.
case "$1" in

    start)
        log_progress_msg "bind directories for user..."
        sudo mount --bind /source/path /target/path
        log_progress_msg "done: bind directories for user"
        ;;

    stop)
        log_progress_msg "umount --bind directories for user..."
        sudo umount /target/path
        log_progress_msg "done: unbind directories for user"
        ;;

    restart)
        $0 stop
        sleep 1
        $0 start
        ;;

    *)
        #log_success_msg "Usage: bind_user_directories {start|stop|restart}"
        log_success_msg "Usage: service bind_user_directories <start|stop|restart>"
        exit 1
        ;;
esac

exit 0

Paso 2. guardar bind_user_directories.sh y hacerlo ejecutable:

chmod a+x bind_user_directories.sh

Paso 3. vincúlelo a una ubicación adecuada como / usr / local / sbin:

sudo ln -s bind_user_directories.sh /usr/local/sbin/bind_user_directories.sh

Paso 4. crea el script de inicio:

sudo emacs /etc/init/bind_user_directories.conf

contenido:

description "runs mount --bind command for certain pre-defined directories for a specific user"

start on filesystem and net-device-up IFACE!=lo

stop on runlevel [!023456]
console output
respawn
respawn limit 10 5

exec /usr/local/sbin/bind_user_directories.sh start

Si esto funciona para usted, hágamelo saber. Puede verificar si hay mensajes en el registro del sistema después de iniciar sesión. (Todavía no lo probé y nunca he implementado algo como esto antes). Si mejora la solución, comparta su solución final aquí. Gracias.

MountainX
fuente
¡Si, funciona! Es una gran alternativa a los mdms de /etc/mdm/PostLogin/secuencias de comandos en el mundo de Ubuntu !!
Adam Ryczkowski
¿Tiene alguna solución similar en systemd? ... Cf. askubuntu.com/questions/847930/…
Adam Ryczkowski
0

Para ejecutar un script como root antes del inicio de sesión

  1. Podrías iniciar el script con Upstart .

  2. Puede agregar la llamada de secuencia de comandos a las secuencias de comandos de inicio kdm / gdm / etc existentes .

Ejemplos: Tema: Preguntas frecuentes: Inicio automático / ejecución automática, ejecución periódica .

usuario26687
fuente
Pero lo que Antonio Sánchez está buscando es cómo hacer que se ejecute un script root en el momento en que un usuario en particular inicia sesión .
Eliah Kagan
El script debe ejecutarse independientemente, la sesión es gráfica o shell estándar. He actualizado el título para comentar esto. He leído algo sobre Upstart, pero parece complicado para la tarea (aparentemente) simple que es. De todos modos y hasta ahora Upstart parece ser la única forma de hacerlo. Si conoces Upstart, ¿sería difícil aprender lo suficiente como para hacer este trabajo? ¡Gracias!
Antonio Sánchez