Existe-t-il un moyen de savoir si l'utilisateur de la session en cours exécute un serveur X (sous Linux)?
J'ai commencé avec des choses comme:
ps -e | grep X
mais ça ne marche pas toujours
et une dernière chose que j'ai essayée vérifie la variable $DISPLAY
Y a-t-il d'autres moyens de vérifier cela?
EDIT: Certaines personnes ont suggéré d’utiliser les variables $ DISPLAY, mais que se passe-t-il si l’utilisateur tripote cette variable? Et s’il essaye de faire quelque chose et modifie cette variable, puis lorsque je la vérifie, elle ne reflète plus un état précis du système. N'y a-t-il aucun moyen spécifique de faire cela qui donnera toujours une réponse correcte?
J'ai trouvé que cela peut être fait de manière programmée ainsi:
#include <X11/Xlib.h>
int main()
{ exit(XOpenDisplay(NULL) ? 0 : 1); }
$ gcc -o xprobe xprobe.c -L/usr/X11R6/lib -lX11
Mais je cherche un moyen de script.
J'ai souvent besoin d'exécuter une commande X sur un serveur qui exécute de nombreux serveurs X, de sorte que les réponses basées sur ps
ne fonctionnent pas. Naturellement, $DISPLAY
doit être réglé correctement. Pour vérifier que cela est valide, utilisez xset q
dans un fragment tel que:
if ! xset q &>/dev/null; then
echo "No X server at \$DISPLAY [$DISPLAY]" >&2
exit 1
fi
$ DISPLAY est le moyen standard. C'est ainsi que les utilisateurs communiquent avec les programmes sur le serveur X à utiliser, le cas échéant.
J'utilise
pidof X && echo "yup X server is running"
pgrep et $ DISPLAY sont d'autres options.
Autres considérations:
su alors $ DISPLAY ne sera pas défini. Les choses qui changent l'environnement du programme en cours peuvent faire en sorte que cela ne fonctionne pas.
Je ne recommande pas ps -e | grep X car cela va trouver procX, qui n’est pas le serveur X.
Une astuce que j'utilise pour dire si X est en cours d'exécution est la suivante:
telnet 127.0.0.1 6000
S'il se connecte, un serveur X est en cours d'exécution et accepte les connexions entrantes TCP (ce n'est généralement pas la configuration par défaut de nos jours) ....
Vous pouvez utiliser xdpyinfo
(peut être installé via apt-get install x11-utils
).
xprop -root &> /dev/null
... est ma commande «essayé et vrai» de tester une situation «X-able». Et, il est quasiment garanti d'être sur tout système fonctionnant sous X, bien sûr, la commande échoue si elle n'est pas trouvée de toute façon, donc même si elle n'existe pas, vous pouvez supposer qu'il n'y a pas de X non plus. (c'est pourquoi j'utilise &> au lieu de>)
1)
# netstat -lp | grep -i x tcp 0 0 *: x11 *: * ÉCOUTER 2937/X tcp6 0 0 [::]: x11 [::]: * ÉCOUTER 2937/X Sockets de domaine UNIX actifs (uniquement les serveurs) Unix 2 [ACC] LISTENING DE COURANT 8940 2937/X @/tmp/.X11-unix/X0 Unix 2 [ACC] LISTENING DE COURANT 8941 2937/X/tmp/.X11-unix/X0 #
2) nmap
# nmap localhost | grep -i x 6000/tcp open X11 #
if [[ $DISPLAY ]]; then
…
fi
J'ai écrit le programme xdpyprobe qui est prévu à cet effet. Contrairement à xset, xdpyinfo et à d’autres outils généraux, il n’effectue aucune action supplémentaire (il vérifie simplement le serveur X et les sorties) et ne produit aucun résultat (si l’option "-q" est spécifiée).
Tout d'abord, vous devez vous assurer que les packages X11 de base sont correctement installés sur votre serveur:
rpm -qa | grep xorg-x11-xauth
Sinon, veuillez installer tous les paquets:
Sudo yum install xorg-x11-xauth xterm
Assurez-vous que le serveur openssh est configuré pour transférer les connexions x11:
edit file : vim /etc/ssh/sshd_config
X11Forwarding yes
REMARQUE: Si cette ligne est précédée d'un commentaire (#) ou est définie sur non, mettez à jour le fichier pour qu'il corresponde à ce qui précède et redémarrez votre démon de serveur ssh (faites attention ici, si vous faites une erreur, vous pouvez serveur)
Sudo /etc/init.d/sshd restart
Maintenant, configurez l’application SSH pour transférer les requêtes X11:
ssh -Y your_username@your_server.your_domain.com
La solution de script bash:
if ! xset q &>/dev/null; then
echo "No X server at \$DISPLAY [$DISPLAY]" >&2
exit 1
fi
Ne fonctionne pas si vous vous connectez depuis une autre console (Ctrl + Alt + F?) Ou ssh. Pour moi, cette solution fonctionne dans mon Archlinux:
#!/bin/sh
ps aux|grep -v grep|grep "/usr/lib/Xorg"
EXITSTATUS=$?
if [ $EXITSTATUS -eq 0 ]; then
echo "X server running"
exit 1
fi
Vous pouvez modifier/usr/lib/Xorg uniquement pour Xorg ou la commande appropriée sur votre système.
C'est le script PHP pour la vérification.
$xsession = `pidof X`;
if (!$xsession) {
echo "There is no active X session, aborting..\n";
exit;
}
Une commande similaire peut également être utilisée dans un script Shell. comme la commande pidof.