7.10 在网络上发送多播式窗口消息

网络管理员通常需要发送消息到网络上的节点。在用户桌面上显示弹出窗有助于提醒用户一些信息。用GUI工具和shell脚本就可以完成这一任务。这则攻略讨论如何向远程主机发送带有定制消息的弹出窗口。

7.10.1 新手上路

可以用zenity来实现一个GUI弹出窗口。zenity是一个脚本化的GUI工具,用来创建包括文本框、输入框等在内的窗口。SSH可以用来连接远程主机上的shell。GUN/Linux发行版不默认包括zenity,可以用软件包管理器自行安装。

7.10.2 实战演练

zenity是一种脚本化对话框创建工具。还有其他的对话框,如gdiglogkdialogxdialog等。作为面向GNOME桌面环境的一款工具,zenity的用法非常灵活。

要用zenity创建一个信息框,可以使用:

  1. $ zenity --info --text "This is a message"
  2. # 这条命令会显示一个窗口,上面显示文本 "This is a message"

zenity能够创建带有输入框、多选输入、单选输入、按钮等元素的窗口。不过这些内容超出了本攻略的讨论范围,请查看zenity的手册页以获取更多的信息。

现在,我们可以使用SSH在远程主机上运行zenity语句。要通过SSH在远程主机上执行上面那条语句,使用:

  1. $ ssh user@remotehost 'zenity --info --text "This is a message"'

不过,这会返回一个类似于下面的错误:

  1. (zenity:3641): Gtk-WARNING **: cannot open display:

这是因为zenity依赖于XserverXserver是一个守护进程,它负责在屏幕上绘制GUI图形元素。精简版的GNU/Linux系统(bare GNU/Linux system)只包含一个文本终端或一些shell提示符。

Xserver用特殊的环境变量DISPLAY跟踪运行在系统中的Xserver实例。

我们可以手动设置DISPLAY=:0来指示Xserver有关其运行实例的情况。

之前的SSH命令可以改写成:

  1. $ ssh username@remotehost 'export DISPLAY=:0 ; zenity --info --text "This is a message"'

用户一旦登入任何窗口管理器,这条语句就会在remotehost上显示一个弹出窗口。

要以多播的方式向多台远程主机发送弹出窗口,使用下面的脚本:

  1. #!/bin/bash
  2. #文件名: multi_cast_window.sh
  3. #用途:以多播形式弹出窗口
  4. IP_LIST="192.168.0.5 192.168.0.3 192.168.0.23"
  5. USER="username"
  6. COMMAND='export DISPLAY=:0 ;zenity --info --text "This is a message" '
  7. for host in $IP_LIST;
  8. do
  9. ssh $USER@$host "$COMMAND" &
  10. done

7.10.3 工作原理

在上面的脚本中,我们有一组需要在其上弹出窗口的IP地址。使用循环对IP地址进行迭代并执行SSH命令。

在SSH语句的末尾有一个 &,这个符号的作用是将SSH语句放置到后台运行。这样做有利于多条SSH语句并行执行。如果不使用 &ssh命令会启动一个SSH会话,执行zenity,然后等待用户关闭弹出窗口。除非远程主机上的用户关闭窗口,否则循环中的下一条SSH语句永远都不会被执行。要想摆脱这种必须等待SSH会话结束才能继续执行命令的情况,我们就得使用 &。

7.10.4 参考

7.8节讲解了ssh命令。