我想要实现的是通过 ssh 从远程机器接收不同的通知。例如,当长时间运行的作业完成时。
一种方法是通过 xmpp 发送消息,并在本地机器上安装 jid 客户端。我想在没有任何中间服务器的情况下做到这一点。我想通过本机系统通知机制获取此通知,因此当事件发生时,我会收到一个系统弹出窗口,就像我使用时收到的一样:
echo 'message:hi' | zenity --notification --listen
或者:
notify-send subject message
这些在本地工作,但当然不适用于远程会话。
我无法通过网络访问我正在连接的服务器,因此无法重新连接以通过 SSH 运行notify-send
命令。
因此,我尝试通过将本地端口转发到远程计算机并编写一个小型服务器/客户端应用程序来解决这个问题。客户端将向转发的端口发送一条消息,然后我机器上的服务器将notify send
使用收到的消息作为参数进行调用。但这看起来像是重新发明轮子,但我找不到解决方案。也许可以通过 DBUS 配置来实现。
答案1
假设(因为记录是一种常见做法)您的应用程序(在远程服务器上)将每个事件写入一个文件中。因此该文件中的每个新行都是所需的通知。技巧:
ssh my.remote.server 'tail -f /path/to/notifications/log' | while read line; do notify-send 'Server says' "$line"; done
因此,一旦服务器日志中出现新行,您就会在本地桌面上看到弹出窗口。
答案2
将 mqtt 代理放在远程或第三台机器上(如果需要)。将事件从远程发布到代理。在本地,通过代理订阅事件主题。本地可能正在运行调用通知发送的程序。
mosquitto 软件包附带了用于发布和订阅的命令行程序,因此您可以用这种方式尝试一下。如果我没记错的话,安装该软件包会安装一个代理。
答案3
安装rsyslog
,指定一台服务器作为中央日志服务器,rsyslog.conf
在客户端上更新以将系统日志转发到中央服务器。然后在那里进行处理。
或者,您可以修改系统日志syslog.conf
以将关键消息转发到命名管道,并且一旦命名管道中出现某些内容,就对其进行处理/通过电子邮件发送。
#syslog.conf
...
*.crit |/PipeCriticalMessages
...
然后,您可能有一个使用管道中的数据或将其提供给摄取平台的过程(例如,Apache's Flume
如果您拥有大量数据)。