Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 17/01/2017, à 11:55

laurent63c

[Résolu] Session XDMCP

Bonjour,

J'aimerais pouvoir configurer des postes ubuntu comme des terminaux X. L'idée est que chaque poste puisse avoir, en invite de connexion, une liste de serveurs auxquels se connecter (lancer une session X).
Les serveur sont des postes de travail ubuntu utilisant lightdm. J'ai configuré sur chaque poste lightdm pour faire tourner un serveur X sur le port x11. Je peux me connecter sur chacun d'entre eux en lançant la commande suivante depuis un terminal :

# Xorg -terminate -query $REMOTE_HOST :1

L'inconvénient est que l'utilisateur final d'un terminal doit connaître l'adresse IP du serveur X sur lequel il veut ouvrir une session.
La commande Xorg supporte l'option broadcast...

# Xorg -terminate -broadcast :1

... mais le terminal ouvre une session X sur un host, sans que je puisse décider lequel via une liste (serveurs X ayant répondu au broadcast, comme cette option le laisse signifier).

Ma question est de pouvoir afficher sur le terminal une liste de serveurs X.
Je n'ai rien vu concernant cet aspect dans lightdm.

Dois-je utiliser à la place XDM, qui semble supporter des "chooser" ? Mes tentatives de configuration n'ont rien donné de probant.

Merci pour votre aide !

Dernière modification par laurent63c (Le 17/01/2017, à 14:17)


« Mon père chevauchait un chameau, je roule en Cadillac, mon fils vole en jet, son fils chevauchera un chameau. » - Proverbe Saoudien.

Hors ligne

#2 Le 17/01/2017, à 12:54

maxire

Re : [Résolu] Session XDMCP

Salut,

En ce qui concerne Lightdm tu n'as pas d'autre choix que d'écrire un programme de recherche des serveurs XDMCP et d'intégrer son appel dans une version personnalisée de son écran d'accueil.

Le «chooser» a été retiré maintenant depuis quelques années de GDM puis de son équivalent Mint MDM il ne reste que XDM à proposer un chooser.
Je ne suis pas certain que tu puisses facilement lancer une session Unity à partir de XDM.

Personnellement j'ai bricolé un script de recherche de serveurs vnc/xdmcp/rdp appelé par lightdm ou à partir d'une session utilisateur.
Ce script utilise Zenity pour proposer une liste de sélection des serveurs trouvés, vncviewer pour lancer une session vnc, Xephyr pour une session XDMCP et Rdesktop pour une session Windows.

Je te le donne tel quel, à toi de le modifier si nécessaire:

#!/bin/sh
# Sélectionneur de serveur XDMCP
# À faire: 
#-----------------------
declare -a reseaux		# Tables réseaux locaux
declare -a hosts_ips;   # Table des adresse IPS des serveurs XDMCP
declare -a hosts_names; # Table des noms des serveurs XDMCP lien entre adresse IP et nom par numéro d'index
declare -a display_numbers # Tables des numéros d'affichage des serveurs X locaux
declare -i index_reseaux;
declare -i index_hosts;

#------------------------------
# Caractéristiques réseau local
#------------------------------
# Cas limité à une seule interface active, si plus d'une interface ===> à priori plantage, ipv4, l'interface de bouclage est ignorée. 
reseaux=($(ip address show up scope global | grep "inet " | sed -e s/"inet "/"!"/ -e s/" brd"/"!"/ | cut -d "!" -f 2));


#--------------------------
# Hôtes connectés au réseau
#--------------------------
index_reseaux=0;
while [ "x${reseaux[$index_reseaux]}" != "x" ]
do
reseau="${reseaux[$index_reseaux]}";
reseau_ip=$(echo "${reseaux[$index_reseaux]}" | cut -d "/" -f 1);

hosts=$(mktemp -t "sel-xdmcp-XXXX"); # Fichier de travail externe
pkexec nmap -sP "$reseau" | grep "Nmap scan report for " | sed -e s/"Nmap scan report for "// -e s/")"/"("/ | sort -h > "$hosts";
hosts_ips=($( cut -d "(" -f 2 "$hosts" )); 						# Extraction adresse IP
hosts_names=($( cut -d "(" -f 1 "$hosts" ));					# Extraction Nom de l'hôte
rm "$hosts"; # Fichier de travail externe

#--------------------------
# Hôtes XDMCP
#--------------------------
index_hosts=0;
while [ "x${hosts_ips[$index_hosts]}" != "x" ]
	do
		if [ "$reseau_ip" != "${hosts_ips[$index_hosts]}" ]
		then
			xdmcp_open=`pkexec nmap -sU -p 177 "${hosts_ips[$index_hosts]}" | grep -w "open\s" `;
			if [ "x$xdmcp_open" != "x" ]
			then
				zenity_txt="$zenity_txt${hosts_ips[$index_hosts]}/xdmcp ${hosts_names[$index_hosts]} ";
			fi;
			vnc_open=`pkexec nmap -sS -p 5900 "${hosts_ips[$index_hosts]}" | grep -w "open\s" `;
			if [ "x$vnc_open" != "x" ]
			then
				zenity_txt="$zenity_txt${hosts_ips[$index_hosts]}/vnc ${hosts_names[$index_hosts]} ";
			fi;
			rdp_open=`pkexec nmap -sS -p 3389 "${hosts_ips[$index_hosts]}" | grep -w "open\s" `;
			if [ "x$rdp_open" != "x" ]
			then
				zenity_txt="$zenity_txt${hosts_ips[$index_hosts]}/rdp ${hosts_names[$index_hosts]} ";
			fi;
		fi;
		let index_hosts=$index_hosts+1;
	done;
let index_reseaux=$index_reseaux+1;
done;
#-------------------------------------------
# Affichage liste de sélection d'hôtes XDMCP
#-------------------------------------------
if [ -z "$zenity_txt" ]
then
	zenity --info --text="Aucun serveur disponible";
else
	remote_server=`zenity --list --title="Liste des serveurs de bureaux" --column="Adresse IP/Protocole" --column="Nom serveur" --text="Choisir serveur."  $zenity_txt --timeout=30 --width=400 --height=300 `;

	case $? in
			  0)
#------------------------
# Lancement serveur X avec gestion du son pulseaudio localement
#------------------------
				protocol=$(echo $remote_server | cut -d "/" -f 2);
#echo "protocole=$protocol";
				adresse_cible=$(echo $remote_server | cut -d "/" -f 1);
#echo "adresse=$adresse_cible";
				case $protocol in
					"xdmcp")	
						pulse_id=$(pactl load-module module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=$adresse_cible);
						xkeyboard=$(echo $(setxkbmap -query | sed -e s/":"/"="/ -e s/"^"/",xkb"/ -e s/" "//g) | sed s/" ,"/","/g); # Extraction caractéristiques clavier local
#				echo "clavier=$xkeyboard";
						display_numbers=($(ls /tmp/.X*-lock | sed -e s/"\/tmp\/.X"// -e s/"-lock"// | sort -nr));
						let display_xephyr="${display_numbers[0]}"+1
						Xephyr ":$display_xephyr"  -audit 0 -query $adresse_cible -terminate -keybd ephyr,"$xkeyboard" -fullscreen;
						pactl unload-module $pulse_id;;
					"vnc")
						pulse_id=$(pactl load-module module-native-protocol-tcp auth-anonymous=1 auth-ip-acl=$adresse_cible);
						vncviewer -FullScreen "$adresse_cible";
						pactl unload-module $pulse_id;;
					"rdp")
						systemctl --user start pulseaudio;
						rdesktop -r sound:local -f -x l "$adresse_cible";;
				esac;
				;;
			1|5) exit  0 ;; #Choix Annuler ou dépassement limite de temps de validation saisie ====> Sortie programme
			 -1) exit -1 ;; #Erreur de Zenity (Comment afficher un message de sighalement?)    ====> Sortie programme
	esac;
fi;

Tu as même la possibilité de transmettre le son à condition de paramétrer les serveurs XDMCP, mais bon si tu arrives à faire tourner ce script ce sera déjà bien.

Edit: J'ai oublié, le script utilise Nmap pour explorer le réseau et il est nécessaire de paramétrer pkexec que tu peux remplacer par sudo pour que les utilisateurs puissent exécuter Nmap en mode root sans demande de mot de passe.

Dernière modification par maxire (Le 17/01/2017, à 13:10)


Maxire
Archlinux/Mate + Ubuntu 22.04 + Archlinux/Gnome sur poste de travail

Hors ligne

#3 Le 17/01/2017, à 14:17

laurent63c

Re : [Résolu] Session XDMCP

Merci beaucoup, impec :-)

Dernière modification par laurent63c (Le 17/01/2017, à 14:17)


« Mon père chevauchait un chameau, je roule en Cadillac, mon fils vole en jet, son fils chevauchera un chameau. » - Proverbe Saoudien.

Hors ligne