有没有办法找出当前会话用户是否正在运行Xserver(在Linux下)?
我开始的事情如下:
ps -e | grep X
但这并不总是有效
还有一件事我试着检查$DISPLAY
variables
有没有其他的方法来检查这个?
编辑:有人build议使用$ DISPLAYvariables,但如果用户摆弄这个variables呢? 如果他试图做某件事情并改变这个variables,那么当我检查它时,它不再反映系统的准确状态。 有没有具体的方式来做到这一点,总是会返回正确的答案?
我发现它可以通过编程来完成:
#include <X11/Xlib.h> int main() { exit(XOpenDisplay(NULL) ? 0 : 1); } $ gcc -o xprobe xprobe.c -L/usr/X11R6/lib -lX11
但是我正在寻找一种脚本方式。
我经常需要在运行多个X服务器的服务器上运行X命令,因此基于ps
的答案不起作用。 自然, $DISPLAY
必须适当设置。 要检查这是否有效,请在以下片段中使用xset q
:
if ! xset q &>/dev/null; then echo "No X server at \$DISPLAY [$DISPLAY]" >&2 exit 1 fi
$ DISPLAY是标准的方法。 这就是用户如何与使用哪个X服务器的程序进行通信(如果有的话)。
我用来判断X是否运行的一个技巧是:
telnet 127.0.0.1 6000
如果它连接,你有一个X服务器运行,并接受入站TCP连接(通常不是默认这些天)….
我用
pidof X && echo "yup X server is running"
pgrep和$ DISPLAY是其他选项。
其他考虑:
那么$ DISPLAY将不会被设置。 改变程序运行环境的东西可以使这个不起作用。
我不推荐ps -e | grep X,因为这将找到procX,这不是X服务器。
运行xdpyinfo
并查看它是否返回零
1)
#netstat -lp | grep -ix tcp 0 0 *:x11 *:* LISTEN 2937 / X tcp6 0 0 [::]:x11 [::]:* LISTEN 2937 / X 主动UNIX域套接字(仅限服务器) unix 2 [ACC] STREAM LISTENING 8940 2937 / X @ / tmp / .X11-unix / X0 unix 2 [ACC] STREAM LISTENING 8941 2937 / X /tmp/.X11-unix/X0 #
2)nmap
#nmap localhost | grep -ix 6000 / tcp打开X11 #
xprop -root &> /dev/null
…是我尝试过的真正的命令来测试一个“X能”的情况。 而且,它几乎保证在任何运行X的系统上,当然,如果命令失败了,那么即使它不存在,也可以假定没有X。 (这就是为什么我使用&>而不是>)
首先,您需要确保您的服务器上正确安装了基础X11软件包:
rpm -qa | grep xorg-x11-xauth
如果不是的话,请安装所有软件包:
sudo yum install xorg-x11-xauth xterm
确保openssh服务器配置为转发x11连接:
edit file : vim /etc/ssh/sshd_config X11Forwarding yes
注意:如果该行前面有一个注释(#)或设置为否,则更新文件以匹配上面的内容,然后重新启动您的ssh服务器守护进程(请小心 – 如果发生错误,您可能会将自己锁定服务器)
sudo /etc/init.d/sshd restart
现在,配置SSH应用程序来转发X11请求:
ssh -Y your_username@your_server.your_domain.com
我写了xdpyprobe程序是专门用于这个目的。 与xset,xdpyinfo和其他常规工具不同,它不会执行任何额外的操作(只检查X服务器并退出),并且可能不会产生任何输出(如果指定了“-q”选项)。
这是用于检查的PHP脚本。
$xsession = `pidof X`; if (!$xsession) { echo "There is no active X session, aborting..\n"; exit; }
类似的命令也可以在shell脚本中使用。 像pidof命令一样。
if [[ $DISPLAY ]]; then … fi