2 votos

¿Cómo puedo devolver el usuario conectado desde dentro de un paquete que se ejecuta como Root?

Estoy usando el Aplicación de paquetes para crear un instalador que incluya, entre otras cosas, un trabajo launchd.

El Bash post-instalación script necesita dirigirse al usuario conectado como sigue:

launchctl bootstrap gui/$UID ~/Library/LaunchAgents/com.mycompany.myproduct.plist

El problema es que $UID devuelve 0 cuando se ejecuta desde el paquete.

El siguiente ajuste funciona como se espera en mi máquina, pero los usuarios del despliegue de destino no utilizan cuentas 501 sino móviles, por lo que el UID difiere con cada cuenta AD

launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.mycompany.myproduct.plist

He probado todo tipo de cosas:

$SUDO_USER
$LOGNAME
$(who -m | awk '{print $1;})
$(logname 2>/dev/null || $SUDO_NAME)

Todos devuelven el usuario 0/Root.

Este parece funcionar, en mi máquina, cuando se ejecuta Terminal después de sudo su. Pero, como no entiendo la parte de /dev/console (o el parámetro %Su), ¿es 100% fiable?

id -P $(stat -f%Su /dev/console) | cut -d : -f 3

3voto

Jose Chavez Puntos 645

El stat se ejecuta con el comando -f%Su donde -f significa que sigue un formato de salida, y %Su significa que debe salir ( % ) una cadena ( S ) que es la identificación del usuario ( u ) del propietario del archivo.

Su comando proporciona entonces el nombre de usuario al id para obtener el nombre de usuario - lo que parece ser una forma indirecta de conseguirlo, ya que podría haber preguntado stat para que inicialmente sea así:

stat -f%Uu /dev/console

Si lo haces así, no tendrás que llamar a id y cut .

El stat es completamente fiable a la hora de devolver el ID/nombre de usuario del propietario del /dev/console archivo (o en realidad dispositivo de caracteres). La cuestión es simplemente si este usuario es el que está buscando. En general, funcionará - pero podría ver un comportamiento diferente al que espera cuando los usuarios también están conectados a través de Escritorio Remoto. En ese caso, se devolverá el último inicio de sesión realizado (es decir, cuando hay varios usuarios conectados al mismo tiempo).

También hay un método diferente para obtener el usuario actualmente conectado preguntando al demonio de configuración del sistema:

scutil <<< "show State:/Users/ConsoleUser" | awk '/Name :/ && ! /loginwindow/ { print $3 }'

La diferencia entre ambos es que al mirar /dev/console no puede distinguir entre que Root esté conectado (es decir, que el usuario haya habilitado los inicios de sesión de Root), o que el ordenador esté sentado en la ventana de inicio de sesión - ambos devolverán a Root como el propietario del archivo. Si esto es o no un problema para usted depende de su caso de uso específico.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X