2009-06-29 17 views
10

Je vois que $ display est défini sur localhost: 0,0 si je cours sur un serveur vnc cela peut ne pas être correct, est-il un moyen de définir automatiquement dans mon script de connexion?

+1

des questions comme celles-ci concernent plus les systèmes d'exploitation que la programmation et où serverfault.com est là. – SpliFF

+1

Il semble que lorsque vncserver a démarré, la variable DISPLAY est automatiquement définie dans la nouvelle session vnc, au moins cela fonctionne pour moi. –

+0

Vous devez décrire la machine sur laquelle vous vous connectez et l'emplacement du ou des serveurs vnc. Tous les shells créés dans un environnement vncserver ont déjà la variable DISPLAY correcte. Il semble que vous soyez connecté à distance à un hôte distant et que vous essayez de démarrer des applications sur un serveur X déjà en cours d'exécution. Votre script de connexion ne sait pas à quel serveur vnc il devrait se connecter plus que nous. – codeDr

Répondre

8

utilisez-vous Bash? Accédez au fichier .bashrc dans votre répertoire personnel et définissez la variable, puis exportez-la.

AFFICHAGE = localhost: 0,0; export DISPLAY

Vous pouvez utiliser/etc/bashrc si vous voulez le faire pour tous les utilisateurs.

Vous pouvez également regarder dans ~/.bash_profile et/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 je mets ceci dans mon bashrc il ne fonctionnera pas avec vncserver parce qu'il crée d'autres affichages comme localhost: 1.0 etc. ainsi j'ai besoin d'une solution un peu plus générique. –

0

Vous devez dire à votre client vnc exporter le bon $ DISPLAY Une fois que vous êtes connecté. Comment cela va probablement dépendre de votre client VNC.

1

Je devine ici, sur la base des questions que j'ai eu dans le passé que je ne réglaient:

  • vous vous connectez à un serveur vnc sur la machine B, l'affichage à l'aide d'un client VNC sur A
  • Vous lancez une console (xterm ou équivalent) sur la machine B et vous l'utilisez pour vous connecter à la machine C
  • Vous souhaitez lancer une application X sur la machine C, en l'affichant sur le serveur VNC sur la machine B, donc vous pouvez le voir sur la machine A.

J'ai fini avec deux solutions. Ma solution originale était basée sur l'utilisation de rsh. Depuis lors, la plupart de nos serveurs ont été installés sur ssh, ce qui a facilité les choses. En utilisant rsh, j'ai mis en place une table de machines vs OS vs options personnalisées qui guiderait ce processus en perl. Bourne shell n'était pas suffisant, et nous n'avons pas de bash sur les machines Sun ou HP (et n'avait pas de bash sur AIX à l'époque - AIX 5L n'était pas encore sorti). Le shell Korn n'était pas vraiment une option non plus, puisque la plupart de nos boîtes Linux n'ont pas de pdksh installé. Mais, si vous ne faites pas face à ces limitations, vous pouvez implémenter l'idée dans ksh ou bash, je pense.

De toute façon, je lancerais essentiellement 'rsh $ machine -l $ utilisateur "$ cmd"' où $ machine, bien sûr, était la machine à laquelle je me connectais, $ utilisateur, tout aussi évident (même si je devais aller en tant que "root" cela avait une certaine variance car nous avons plusieurs racines sur certaines machines pour des raisons que je ne comprends pas), et $ cmd était essentiellement "DISPLAY = $ DISPLAY xterm", mais si je lançais konsole, par exemple, $ cmd serait "konsole --display = $ DISPLAY". Comme $ DISPLAY a été évalué localement (où il est correctement défini) et qu'il n'a pas été passé littéralement à travers rsh, l'affichage sera toujours défini correctement.

Je devais aussi m'assurer que personne ne faisait quelque chose de stupide comme réinitialiser DISPLAY s'il était déjà réglé. Maintenant, j'utilise simplement ssh, assurez-vous que X11Forwarding est défini sur yes sur le serveur (sshd_config), et puis je peux juste ssh à la machine, laissez X commandes traverser le fil crypté, et il sera toujours retourne au bon endroit.

1

Votre serveur vncserver possède un fichier de configuration qui définit le numéro d'affichage. Pour le faire automatiquement, une solution consiste à analyser ce fichier, extraire le nombre et le définir correctement.Un plus simple (mieux) est d'avoir ce numéro d'affichage dans un script de configuration et de l'utiliser dans votre configuration de serveur VNC et dans vos scripts d'initialisation.

7

Voici quelque chose que je viens de faire tomber. Il inspecte l'environnement du dernier processus "gnome-session" lancé (DISPLAY est défini correctement lorsque VNC lance un gestionnaire de session/fenêtre). Remplacez "gnome-session" par le nom de tout processus que votre serveur VNC lance au démarrage.

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 

Vous devriez juste être en mesure de déposer que dans votre fichier .bashrc.

+0

connectez-vous, changez d'utilisateur et connectez-vous à un autre compte, revenez au premier compte et "dernière session gnome lancée" n'est plus active. – Dima

+0

@Dima Bon point. J'ai modifié ma réponse pour au moins limiter les processus à l'utilisateur actuel. – Nick

+0

J'ai dû changer votre ligne awk pour: 'exporter DISPLAY = $ (cat/proc/$ PID/environ | chaînes | awk 'BEGIN {FS =" = ";} $ 1 ==" AFFICHER "{imprimer $ 2; sortie} ') ' Ensuite, cela a fonctionné. – isaaclw