GNU/Linux >> Tutoriales Linux >  >> Linux

¿Puede un programa decir que se está ejecutando bajo sudo?

Solución 1:

Sí, hay 4 variables de entorno configuradas cuando un programa se ejecuta bajo sudo:

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20

Tenga en cuenta que estos pueden falsificarse simplemente configurándolos. No confíes en ellos para nada crítico.

Por ejemplo:En este programa necesitamos decirle al usuario que ejecute algún otro programa. Si el actual se ejecutó con sudo, el otro también lo hará.

#!/bin/bash

echo 'Thank you for running me.'

if [[ $(id -u) == 0 ]]; then
  if [[ -z "$SUDO_COMMAND" ]]; then
    echo 'Please now run: next_command'
  else
    echo 'Please now run: sudo next_command'
  fi
else  echo 'Error: Sadly you need to run me as root.'
  exit 1
fi

Tenga en cuenta que solo prueba una variable SUDO_* si primero puede probar que se está ejecutando como root. Incluso entonces, solo lo usa para cambiar algún texto útil.

Solución 2:

Esto no responde la pregunta directamente, pero no creo que se esté haciendo la pregunta correcta aquí. Me parece que el autor de la pregunta quiere un programa que actúe de manera diferente presumiblemente si tiene ciertos permisos o no, sin embargo, diría que verificar sudo no es la forma de hacerlo. En primer lugar, es posible que muchos sistemas no implementen un "sudo", de ninguna manera se requiere en Linux o muchos Unixes.

Por ejemplo, es posible que un usuario ya haya iniciado sesión como root, lo que hace que el sudo no tenga sentido o quizás el sistema tenga usuarios no root que aún tengan capacidades para realizar la tarea administrativa que el programa desee realizar. Finalmente, quizás el sistema no tenga root o sudo en absoluto y en su lugar use un sistema de control de acceso obligatorio con diferentes capacidades y no atrapar a todos los superusuarios para sudo. O el usuario podría ser sudoeado, pero en una cuenta que tiene -menos- permisos que su propia cuenta por razones de seguridad (a menudo ejecuto código que no es de confianza con un usuario temporal sin privilegios que solo puede escribir en ramdisks para eliminar, no aumentar mis permisos ). En general, es una mala idea asumir un modelo de permisos específico como sudo o la existencia de root o asumir que un usuario sudoed tiene privilegios particulares.

Si desea averiguar si tiene permisos para realizar una operación, la mejor manera suele ser simplemente intentar hacerlo y luego verificar errno para ver si hay problemas de permisos si falla o si es una operación de varias etapas que debe fallar o tener éxito. puede verificar si una operación funcionará con funciones como la función de acceso POSIX (tenga cuidado con las posibles condiciones de carrera aquí si los permisos se están cambiando activamente)

Si además necesita conocer al usuario real detrás de sudo, puede usar la función getlogin que debería funcionar para cualquier sesión interactiva con un terminal subyacente y le permitiría, por ejemplo, encontrar quién está "realmente" ejecutando el comando para auditar o encontrar el directorio de inicio del usuario real para guardar registros.

Finalmente, si lo que realmente quiere es averiguar si un usuario tiene acceso de root (todavía es una mala idea pero menos específica de la implementación), puede usar getuid para buscar un uid de 0 y, por lo tanto, root.

Solución 3:

Hay dos mecanismos que se pueden utilizar.

  • La verificación de las variables de entorno se puede falsificar de cualquier manera, pero es la más fácil de hacer. growisofs no le gusta ejecutar bajo SUDO, así que deshabilité las variables SUDO en los scripts donde lo uso. Se puede falsificar al revés. (La variable SUDO también se incluye en el entorno para los scripts que se ejecutan con los comandos at y batch).
  • Otra forma de ver si está ejecutando sudo es recorrer la lista de procesos desde su proceso principal hacia arriba en busca de sudo. Sería difícil ocultar que estaba ejecutando sudo de esta manera, pero es más complejo. Todavía es posible fingir que está ejecutando sudo.

Es más común verificar si se está ejecutando como el usuario apropiado. El id El comando se puede usar para hacer esto. El script de TomOnTime usa el id comando para determinar si sudo podría ser necesario para ejecutar el siguiente comando.

Solución 4:

Puede comparar la identificación de usuario efectiva con la real.

Esto no significa estrictamente que se esté ejecutando undo sudo (también se podría configurar), pero indica que el programa tiene más derechos de los que el usuario puede esperar (por ejemplo, en un programa que normalmente se ejecuta sin tales derechos, pero necesita ejecutar con ellos durante la instalación o para instalar actualizaciones. Luego, puede usar esto para dar algunos comentarios de advertencia al respecto).

Solución 5:

Puede verificar la variable UID (EUID) efectiva de la siguiente manera:

if [[ $EUID -eq 0 ]]; then
    echo "running as root"
else
    echo "not running as root"
fi

Linux
  1. ¿Cómo ejecutar un programa específico como root sin una solicitud de contraseña?

  2. Ssh:¿necesito un Tty para ejecutar Sudo si puedo Sudo sin contraseña?

  3. ¿Está ejecutando una aplicación de 32 bits en Linux de 64 bits?

  4. ¿Cómo puedo saber si estoy en una pantalla?

  5. Ejecutar script de shell en paralelo

¿Puede GDB cambiar el código ensamblador de un programa en ejecución?

¿Cómo puedo configurar y ejecutar PhantomJS en Ubuntu?

sudoers NOPASSWD:sudo:no hay tty presente y no se especificó ningún programa askpass

No se puede ejecutar Sonar Server debido a que Elasticsearch no se puede ejecutar como root

Ejecutar ifconfig sin sudo

¿Puedo hacer que SSH use un programa askpass incluso si se ejecutó desde una terminal?