7.10 在网络上发送多播式窗口消息
网络管理员通常需要发送消息到网络上的节点。在用户桌面上显示弹出窗有助于提醒用户一些信息。用GUI工具和shell脚本就可以完成这一任务。这则攻略讨论如何向远程主机发送带有定制消息的弹出窗口。
7.10.1 新手上路
可以用zenity
来实现一个GUI弹出窗口。zenity
是一个脚本化的GUI工具,用来创建包括文本框、输入框等在内的窗口。SSH可以用来连接远程主机上的shell。GUN/Linux发行版不默认包括zenity
,可以用软件包管理器自行安装。
7.10.2 实战演练
zenity
是一种脚本化对话框创建工具。还有其他的对话框,如gdiglog
、kdialog
、xdialog
等。作为面向GNOME桌面环境的一款工具,zenity
的用法非常灵活。
要用zenity
创建一个信息框,可以使用:
- $ zenity --info --text "This is a message"
- # 这条命令会显示一个窗口,上面显示文本 "This is a message"
zenity
能够创建带有输入框、多选输入、单选输入、按钮等元素的窗口。不过这些内容超出了本攻略的讨论范围,请查看zenity
的手册页以获取更多的信息。
现在,我们可以使用SSH在远程主机上运行zenity
语句。要通过SSH在远程主机上执行上面那条语句,使用:
- $ ssh user@remotehost 'zenity --info --text "This is a message"'
不过,这会返回一个类似于下面的错误:
- (zenity:3641): Gtk-WARNING **: cannot open display:
这是因为zenity
依赖于Xserver
。Xserver
是一个守护进程,它负责在屏幕上绘制GUI图形元素。精简版的GNU/Linux系统(bare GNU/Linux system)只包含一个文本终端或一些shell提示符。
Xserver用特殊的环境变量DISPLAY
跟踪运行在系统中的Xserver
实例。
我们可以手动设置DISPLAY=:0
来指示Xserver
有关其运行实例的情况。
之前的SSH命令可以改写成:
- $ ssh username@remotehost 'export DISPLAY=:0 ; zenity --info --text "This is a message"'
用户一旦登入任何窗口管理器,这条语句就会在remotehost
上显示一个弹出窗口。
要以多播的方式向多台远程主机发送弹出窗口,使用下面的脚本:
#!/bin/bash
#文件名: multi_cast_window.sh
#用途:以多播形式弹出窗口
IP_LIST="192.168.0.5 192.168.0.3 192.168.0.23"
USER="username"
COMMAND='export DISPLAY=:0 ;zenity --info --text "This is a message" '
for host in $IP_LIST;
do
ssh $USER@$host "$COMMAND" &
done
7.10.3 工作原理
在上面的脚本中,我们有一组需要在其上弹出窗口的IP地址。使用循环对IP地址进行迭代并执行SSH命令。
在SSH语句的末尾有一个 &
,这个符号的作用是将SSH语句放置到后台运行。这样做有利于多条SSH语句并行执行。如果不使用 &
,ssh
命令会启动一个SSH会话,执行zenity
,然后等待用户关闭弹出窗口。除非远程主机上的用户关闭窗口,否则循环中的下一条SSH语句永远都不会被执行。要想摆脱这种必须等待SSH会话结束才能继续执行命令的情况,我们就得使用 &。
7.10.4 参考
7.8节讲解了ssh
命令。