2009-06-29 15 views
10

Veo que $ display está configurado como localhost: 0,0 si estoy ejecutando un servidor vnc esto puede no ser correcto, ¿hay alguna manera de establecer automáticamente en mi script de inicio de sesión?

+1

preguntas como esta son más acerca de los sistemas operativos que la programación y serverfault.com es donde van. – SpliFF

+1

Parece que cuando se inició vncserver, la variable DISPLAY se establece automáticamente en la nueva sesión de vnc, al menos esto funciona para mí. –

+0

Debe describir a qué máquina está ingresando y dónde se están ejecutando los servidores vnc. Cualquier shells creado en un entorno vncserver ya tendría la variable DISPLAY correcta. Parece que está iniciando sesión remotamente en un host remoto y tratando de iniciar aplicaciones en un servidor X ya en ejecución. Su secuencia de comandos de inicio de sesión no sabe a qué servidor vnc se debe conectar más que nosotros. – codeDr

Respuesta

8

usas Bash? Vaya al archivo .bashrc en su directorio de inicio y establezca la variable, luego expórtela.

DISPLAY = localhost: 0.0; export DISPLAY

puede usar/etc/bashrc si desea hacerlo para todos los usuarios.

También puede que desee ver en ~/.bash_profile y/etc/profile

EDIT:

function get_xserver() 
{ 
    case $TERM in 
     xterm) 
      XSERVER=$(who am i | awk '{print $NF}' | tr -d ')''(')  
      XSERVER=${XSERVER%%:*} 
      ;; 
     aterm | rxvt)   
      ;; 
    esac 
} 

if [ -z ${DISPLAY:=""} ]; then 
    get_xserver 
    if [[ -z ${XSERVER} || ${XSERVER} == $(hostname) || \ 
     ${XSERVER} == "unix" ]]; then 
     DISPLAY=":0.0"   # Display on local host. 
    else 
     DISPLAY=${XSERVER}:0.0 # Display on remote host. 
    fi 
fi 

export DISPLAY 
+0

si pongo esto en mi bashrc no funcionará con vncserver porque crea otras pantallas como localhost: 1.0, etc. entonces necesito una solución un poco más genérica. –

0

Usted tendrá que indicar a su cliente VNC para exportar el $ correcta visualización una vez que haya iniciado sesión. Cómo lo hará probablemente dependerá de su cliente de vnc.

1

que supongo que aquí, sobre la base de los problemas que he tenido en el pasado, que me ha solucionado:

  • se conecta a un servidor VNC en la máquina B, que muestran que el uso de un cliente VNC en máquina A
  • está iniciando una consola (xterm o equivalente) en la máquina B y usando eso para conectar a la máquina C
  • desea iniciar una aplicación basada en X en la máquina C, mostrándola al servidor VNC en la máquina B, para que pueda verlo en la máquina A.

Terminé con dos soluciones. Mi solución original se basaba en el uso de rsh. Desde entonces, la mayoría de nuestros servidores han tenido instalado ssh, lo que ha hecho esto más fácil.

Utilizando rsh, armé una tabla de máquinas vs SO frente a opciones personalizadas que guiarían este proceso en perl. Bourne shell no era suficiente, y no tenemos bash en máquinas Sun o HP (y no tenía bash en AIX en ese momento - AIX 5L aún no había salido). El shell Korn tampoco era una gran opción, ya que la mayoría de nuestros cuadros de Linux no tienen instalado pdksh. Pero, si no enfrenta estas limitaciones, puede implementar la idea en ksh o bash, creo.

De todos modos, básicamente ejecutaría 'rsh $ machine -l $ user "$ cmd"' donde $ machine, por supuesto, era la máquina en la que estaba iniciando sesión, $ user, similarmente obvio (aunque cuando iba como "raíz" esto tenía alguna variación ya que tenemos raíces múltiples en algunas máquinas por razones que no entiendo completamente), y $ cmd era básicamente "DISPLAY = $ DISPLAY xterm", aunque si estuviera ejecutando konsole, por ejemplo, $ cmd sería "konsole --display = $ DISPLAY". Como $ DISPLAY se estaba evaluando localmente (donde está configurado correctamente) y no se pasa literalmente a través de rsh, la pantalla siempre se configuraría correctamente.

También tuve que asegurarme de que nadie hiciera nada tonto como reiniciar la pantalla si ya estaba configurada.

Ahora, solo uso ssh, me aseguro de que X11Forwarding esté configurado como yes en el servidor (sshd_config), y luego puedo enviar sshd a la máquina, dejar que los comandos X atraviesen el cable cifrado, y siempre vuelve al lugar correcto.

1

Su vncserver tiene un archivo de configuración que establece el número de pantalla. Para hacerlo automáticamente, una solución es analizar este archivo, extraer el número y configurarlo correctamente.Un simple (mejor) es tener este número de visualización establecido en un script de configuración y usarlo tanto en su configuración de servidor VNC como en sus scripts de inicio.

7

Aquí hay algo que acabo de hacer. Inspecciona el entorno del último proceso "sesión-gnome" lanzado (DISPLAY se configura correctamente cuando VNC inicia un administrador de sesión/ventana). Reemplace "gnome-session" con el nombre de cualquier proceso que su servidor VNC inicie al inicio.

PID=`pgrep -n -u $USER gnome-session` 
if [ -n "$PID" ]; then 
    export DISPLAY=`awk 'BEGIN{FS="="; RS="\0"} $1=="DISPLAY" {print $2; exit}' /proc/$PID/environ` 
    echo "DISPLAY set to $DISPLAY" 
else 
    echo "Could not set DISPLAY" 
fi 
unset PID 

Debería solo poder colocar eso en su archivo .bashrc.

+0

iniciar sesión, cambiar de usuario e iniciar sesión en otra cuenta, volver a la primera cuenta y "última sesión gnome iniciada" ya no es la más activa. – Dima

+0

@Dima Buen punto. Modifiqué mi respuesta para, al menos, restringir los procesos al usuario actual. – Nick

+0

Tuve que cambiar tu línea awk a: 'export DISPLAY = $ (cat/proc/$ PID/environ | cadenas | awk 'BEGIN {FS =" = ";} $ 1 ==" DISPLAY "{print $ 2; exit} ') ' Luego funcionó. – isaaclw

Cuestiones relacionadas