Tengo un programa que debería comportarse de manera diferente si se ejecuta bajo "sudo". ¿Hay alguna manera de saber si se ejecutó bajo sudo?
Actualización: Alguien preguntó por qué querría hacer esto. En este caso, en una Mac que usa MacPorts, hay una salida que le indica que corte y pegue un comando en particular. Si el comando MacPorts se ejecutó con "sudo", debe incluir sudo en el comando de muestra:
$ sudo port selfupdate
---> Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
---> Updating the ports tree
---> MacPorts base is already the latest version
The ports tree has been updated. To upgrade your installed ports, you should run
port upgrade outdated
^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead. It would be even better if it just did it for you :-)
Respuestas:
Sí, hay 4 variables de entorno establecidas cuando un programa se ejecuta en sudo:
Tenga en cuenta que estos pueden ser falsificados 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 será.
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.
fuente
Esto no responde la pregunta directamente, pero no creo que se haga la pregunta correcta aquí. Me parece que el autor de la pregunta quiere un programa que presumiblemente actuará de manera diferente si tiene ciertos permisos o no, sin embargo, diría que buscar sudo no es la forma de hacerlo. En primer lugar, muchos sistemas pueden no implementar un "sudo", de ninguna manera se requiere en Linux o en muchos Unix.
Por ejemplo, un usuario puede haber iniciado sesión como root ya, lo que hace que el sudo sea absurdo o tal vez el sistema tenga usuarios no root que aún tengan capacidades para realizar la tarea administrativa que el programa desee realizar. Finalmente, tal vez el sistema no tiene root o sudo en absoluto y en su lugar utiliza un sistema de control de acceso obligatorio con diferentes capacidades y no atrapa a todos los superusuarios en los que sudo. O el usuario podría suudirse, pero en una cuenta que tiene permisos sin su propia cuenta por razones de seguridad (a menudo ejecuto código no confiable con un usuario temporal sin privilegios que solo puede escribir en ramdisks para cancelar, 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 es simplemente intentarlo y luego verificar si no hay problemas de permisos si falla o si se trata de 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 cambian activamente)
Si además necesita conocer al usuario real detrás del 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 (sigue siendo una mala idea pero menos específica de implementación) puede usar getuid para verificar un uid de 0 y, por lo tanto, root.
fuente
Hay dos mecanismos que se pueden usar.
growisofs
no le gusta correr bajo SUDO, así que desarmado las variables SUDO en los scripts donde lo uso. Se puede falsificar a la inversa. (Las variables SUDO también se llevan al entorno para los scripts que se ejecutan bajo los comandos at y batch).Es más común verificar si se está ejecutando como el usuario apropiado. El
id
comando se puede usar para hacer esto. El script de TomOnTime usa elid
comando para determinar sisudo
es necesario ejecutar el siguiente comando.fuente
sudo
binario a otra cosa? ¿O nombrar algún otro ejecutablesudo
para fingir lo contrario? No es que realmente esperara que alguien cuerdo hiciera eso ...root
acceso para cambiar el nombre delsudo
ejecutable. Un usuario normal no podría hacer esto. Noté que puedes fingir que te estás quedando sinsudo
. Cambiar el nombre de un programa existente funcionaría. El código requerido para unsudo
programa falso dedicado es trivial.Puede comparar la identificación de usuario efectiva versus la real.
Esto no significa estrictamente que se está ejecutando deshacer sudo (también se puede configurar), sino que 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 dichos derechos, pero que debe ejecutarse con ellos durante la instalación o para instalar actualizaciones. Luego, puede usar esto para dar algunos comentarios de advertencia al respecto).
fuente
sudo
establece tanto la identificación efectiva como la real. A diferencia de suid, que no lo hace. Aquí hay un programa trivial en C que puede usar para probar (lo siento, el comentario eliminará las nuevas líneas, tendrá que agregarlas nuevamente):#include <stdio.h> #include <unistd.h> #include <sys/types.h> int main() { printf("real = %i, effective = %i\n", getuid(), geteuid()); return 0; }
perl -E 'say $<, "\n", $>'
Puede verificar la variable efectiva de UID (EUID), de la siguiente manera:
fuente
sudo echo $USER
imprime el nombre de usuario sin privilegios (la variable se sustituye ANTES del sudo). De hecho, terminé usando tu código en mi script. ¡Gracias!Puede tocar un archivo
/root
y luegoif -e
. Y si -e es verdaderorm
(verificando el código de error), entonces su prueba funciona la próxima vez.Verificar el código de error (o el código de retorno) después de que el rm evita que alguien use fácilmente los poderes de sudo para crear el archivo para jugar una broma sobre usted.
fuente
/root
(que no es necesariamente lo mismo que ejecutar como UID 0), pero no verifica si obtuvo esos permisos usandosudo
.Descubrí que esto funciona bien para esto
fuente