# Comment lier une fenêtre unique à une session vnc {{METATOC 4-5}} Pour exposer une seule fenêtre d'une application déjà lancée x11vnc prend en charge le partage d'une fenêtre en fonction de son identifiant, #### Exemple de commande: ``` x11vnc -id 0x200002 ``` #### Utilistaion de xwinfo **xwininfo** permet de récupérer l'ID d'une fenêtre: * Exécuter xwininfo à partir d'un terminal. Cliquer sur la fenêtre que l'on souhaite partager. xwininfo affichera l'identifiant de la fenêtre. * Exécuter `x11vnc -id win_id` en utilisant l'identifiant win\_id récupéré ci-dessus. ``` # créer un affichage virtuel sur le nœud de calcul Xvnc :33 & # lancer l'application sur cet écran virtuel export DISPLAY=:33 glxgears & # découvrir son identifiant de fenêtre xwininfo -root -children # -> xwininfo: ID de la fenêtre: 0xdc (la fenêtre racine) (n'a pas de nom) # # Root window id: 0xdc (the root window) (has no name) # Parent window id: 0x0 (none) # 1 child: # 0x200002 "glxgears": () 300x300+0+0 +0+0 # démarrer le serveur vnc avec ce xid spécifique x11vnc -id 0x200002 & ``` pour récupérer l'ID de la fenêtre dans une variable: ``` window_id=$(xwininfo -root -tree | grep glxgears | tail -n1 | sed "s/^[ \t]*//" | cut -d ' ' -f1) ``` On obtient donc: - `xwininfo -root -tree` l'arborescence, - `grep glxgears` filtrage du programme que l'on recherche, - `tail -n1` la dernière option, - `sed "s/^[ \t]*//"` suppression des espaces blancs de fin, - `cut -d ' ' -f1` la première colonne uniquement et la sauvegarde. ``` x11vnc -id $window_id & ``` Pour récupérer l'ID de la fenêtre en ligne de commande: ``` echo "Select Window...";x11vnc -id $(xwininfo|grep -oP '(?<=id: ).*(?= ")') -viewonly -forever ``` Ou un plus court: ``` x11vnc -id pick -viewonly -forever ``` #### Création d'un pont de présentation avec guacamole Apache Guacamole est une passerelle de bureau à distance sans client. Il prend en charge les protocoles standard tels que VNC, RDP et SSH. Par exemple on peut partager une unique application ouverte dans une fenêtre de bureau (pour une présentation) en utilisant une session x11vnc avec guacamole: * On ouvre la session **X11vnc** en utilisant **xwininfo pour récupérer l'ID de la fenêtre que lon souhaite partager. ``` echo "Select Window...";x11vnc -shared -id $(xwininfo|grep -oP '(?<=id: ).*(?= ")') -forever -viewonly ``` Le commutateur -shared de la commande x11vnc autorise la connexion de plusieurs clients sur la même session * Puis on ouvre l'accès aux clients à la session ainsi ouverte en définissant un mot de passe fort (14c base64) dans le fichier `/etc/guacamole/user-mapping.xml` ``` sudo sed -i -e '/termvnc/ s/password=".*"/password="'$(openssl rand -base64 14)'"/g' /etc/guacamole/user-mapping.xml ; wait 2; sed -n '/termvnc/p' /etc/guacamole/user-mapping.xml; sudo systemctl restart tomcat9 guacd ``` La commande retourne le mot de passe attribué que l'on peut envoyer aux clients pour qu'ils puissent se connecter: ``` ```