Las siguientes son otras preguntas que creo que necesito saber:
¿De una sesión no X? (lo que significa que la raíz no está conectada a X)
Si varias personas iniciaran sesión en X, ¿podría detectar automáticamente quién estaba en qué pantalla y, por lo tanto, detectar mediante programación qué pantalla necesito para iniciar la aplicación?
¿Puedo iniciar la aplicación como usuario? (ok, estoy 99.999% seguro de que esto es un sí)
¿Puedo detectar si los usuarios del grupo X están conectados a X?
naga_plugged.pl
script termine (o se bifurca en segundo plano), porqueudev
estará esperando a que salga.Respuestas:
Para iniciar un programa gráfico en el escritorio de un usuario, debe encontrar dos cosas: en qué pantalla se encuentra el escritorio del usuario (la dirección) y qué cookie de autorización usar (la contraseña).
El siguiente comando debe enumerar las pantallas locales en las que el usuario ha iniciado sesión (una por línea) en la mayoría de los dispositivos:
Encontrar la cookie de autorización es un poco más difícil. Debe buscar el archivo de cookies del usuario, que es el
~/.Xauthority
predeterminado (todo lo que necesita es la ubicación del archivo de cookies, no necesita extraer la cookie de él). Eso funciona en muchos sistemas, pero no en todos; depende del administrador de pantalla y de cómo está configurado, y en particular Gdm (el predeterminado en Ubuntu) no usó la ubicación predeterminada la última vez que busqué. No puedo pensar en una forma portátil de descubrir el archivo de cookies X real. La forma más precisa de averiguarlo es averiguar el pid del proceso X y buscar el argumento de la-auth
opción. Otra forma es encontrar un proceso que se ejecute en ese servidor X y tomar suXAUTHORITY
variable de entorno. Si tiene problemas para encontrar el archivo cookie, veaAbrir una ventana en una pantalla X remota (¿por qué "No se puede abrir la pantalla")?Una vez que tenga ambas piezas de información, coloque la pantalla elegida en la
DISPLAY
variable de entorno, el archivo de cookie de autoridad X elegido en laXAUTHORITY
variable de entorno, y estará listo. No importa a qué usuario se ejecuta el programa; combina consu
si quieres.fuente
ps
ohtop
o ...pids=$(pgrep -u $target_user nautilus)
obtiene el pid, y ¿dónde tengo que poner una-auth
opción?-auth
opción en ningún lado. Es posible que deba buscarlo en la línea de comandos del proceso del servidor X para averiguar qué poner en laXAUTHORITY
variable de entorno. Si tiene el proceso de un cliente, lo que necesita no es nada-auth
más que el valor de laXAUTHORITY
variable de ese cliente . No entiendo lo que intentas hacer. Es posible que desee hacer una nueva pregunta.No puedo probar esto por completo ya que todas mis máquinas tienen la raíz deshabilitada.
Para encontrar en qué pantalla está un usuario, puede usar el
who
comando. La última columna de salida suele ser la PANTALLA en la que el usuario ha iniciado sesión. Algo como esto podría usarse para capturar solo la pantalla (es probable que haya una forma mucho más eficiente de hacer esto, no dude en ofrecer ediciones):Luego, para iniciar un comando gráfico X en esa pantalla:
donde: 0 se reemplazaría con la pantalla que encontraste en el primer comando y firefox se reemplazaría con el comando que quieras ejecutar. Podría poner esto en un script de shell y simplemente usar una variable.
La siguiente parte es la parte que no he probado, pero no veo por qué no debería ser posible hacerlo:
para iniciar el comando X como ese usuario.
fuente
sudo -i
y no podía estar seguro de si los resultados serían diferentes de ejecutarlo después de iniciar sesión directamente como root. :-)who | grep xeno| awk '{print $5}' | sed 's/[(|)]//g' | grep -v ^$
parece funcionar ...Podrías ver cómo lo hace acpid. Por ejemplo, cuando emite comandos xscreensaver o deja en blanco la pantalla para cada usuario que ejecuta X o X-session.
Por ejemplo, en Ubuntu, este archivo contiene cosas relacionadas:
Contiene este bucle:
fuente
/usr/share/acpi-support/power-funcs
. Llamafgconsole
para encontrar el vt de Linux activo, luego busca un servidor X que se muestre en esta consola y descubre al usuario desde allí. Luego se usa~/.Xauthority
como la cookie X, que a menos que haya algo que me falta, significa que en realidad no podrá conectarse al servidor X (la configuración predeterminada de Ubuntu, usando gdm, no almacena las cookies X en el hogar del usuario directorio).getXuser: command not found
Una extensión de la respuesta de Gilles es cómo encontrar el archivo cookie. Una forma de hacerlo puede ser después de configurar la
DISPLAY
variable de entorno (como lo describe Gilles), usarstrace
para encontrar elxhost
acceso a los archivos . Puedo pensar en algo así en BASH:El resultado del código anterior se verá así:
Como puede ver claramente, el archivo de cookies aparecerá directamente aquí.
fuente
En mi investigación para encontrar una forma elegante de mostrar la GUI o la tarea X desde un entorno limitado, como las reglas de udev o del superusuario, recientemente creé una herramienta para encajar con ella ( para más detalles ).
xpub
es un script de shell para obtener las variables del entorno de visualización X con respecto al TTY actual o dado.Este es un ejemplo con una regla udev:
$env{ENV}
: si current-tty-user inicia X, de lo contrario, elimínelo.El principio es el mismo para una línea de comandos que utiliza
export
:fuente