如何通过 ssh 发出长任务完成时的警报?

TRi*_*RiG 6 ssh ubuntu messaging

我的桌面是Ubuntu,它有一个方便的程序notify-send,它会在桌面上弹出一个警报。它还内置了以下方便的别名:

\n\n
$ type alert\nalert is aliased to `notify-send --urgency=low -i "$([ $? = 0 ] && echo terminal || echo error)" "$(history|tail -n1|sed -e \'s/^\\s*[0-9]\\+\\s*//;s/[;&|]\\s*alert$//\')"\'\n
Run Code Online (Sandbox Code Playgroud)\n\n

这意味着您可以运行very-long-running-command; alert,让终端在后台运行,并在任务完成时收到通知。

\n\n

当你通过 ssh 连接到 CentOS 服务器时,事情会有点棘手。这里\xe2\x80\x99是一种方法:

\n\n
localhost$ ssh me@example.net; alert\nexample.net$ very-long-running-command; exit\n
Run Code Online (Sandbox Code Playgroud)\n\n

这在某种程度上是有效的,但在每个命令后退出通常不是我想要做的。

\n\n

我的电脑没有\xe2\x80\x99t 有扬声器。它可以发出蜂鸣声。

\n

Gil*_*il' 0

这是部分答案。请参阅D-Bus 身份验证和授权以了解我遇到的问题。

\n\n

notify-send通过D-Bus发送消息。现代桌面环境为每个会话启动一条 D-Bus 总线,并安排会话中的程序找到正确的总线,通常通过设置环境变量来实现DBUS_SESSION_BUS_ADDRESS。D-Bus 支持多种连接到集中和调度消息的守护进程的方式,包括抽象套接字、unix 套接字和 TCP。

\n\n

OpenSSH \xe2\x89\xa56.7 可以转发 Unix 套接字,但正如我所写,很少有系统运行如此新的版本。

\n\n

您可以运行一个通过 TCP 侦听的 D-Bus 守护程序(您可以使其侦听多个地址,例如 TCP 和 Unix 套接字)。dbus-daemon如果会话启动脚本以您无法影响的方式启动,则可能很难安排。

\n\n

您可以使用netcatsocat等工具通过 TCP 转发 D-Bus 抽象套接字或命名 Unix 套接字。这是一个在 TCP 端口 8004 上设置转发的概念验证脚本。

\n\n
#!/bin/sh\ncase $DBUS_SESSION_BUS_ADDRESS in\n  \'\') echo 1>&2 "No local D-Bus instance";;\n  unix:abstract=*,guid=*)\n    guid=${DBUS_SESSION_BUS_ADDRESS##*[:,]guid=}\n    guid=${guid%%,*}\n    socket=${DBUS_SESSION_BUS_ADDRESS##*[:,]abstract=}\n    socket=ABSTRACT-CONNECT:${socket%%,*}\n    ;;\n  unix:path=*,guid=*)\n    guid=${DBUS_SESSION_BUS_ADDRESS##*[:,]guid=}\n    guid=${guid%%,*}\n    socket=${DBUS_SESSION_BUS_ADDRESS##*[:,]path=}\n    socket=UNIX-CONNECT:${socket%%,*}\n    ;;\n  *) echo 1>&2 "Unsupported DBUS_SESSION_BUS_ADDRESS";;\nesac\nsocat "TCP-LISTEN:8004,reuseaddr,fork,range=127.0.0.1/32" "$socket"\n
Run Code Online (Sandbox Code Playgroud)\n\n

您现在可以通过 SSH 转发此 TCP 连接。

\n\n
ssh -R 8004:localhost:8004 me@example.net\nme@example.net$ export DBUS_SESSION_BUS_ADDRESS=tcp:host=127.0.0.1,port=8004\n
Run Code Online (Sandbox Code Playgroud)\n\n

您还需要做一件事:将授权 cookie 复制到远程计算机。

\n\n
rsync -a .dbus-keyrings/org_freedesktop_general me@example.net:.dbus-keyrings/org_freedesktop_general\n
Run Code Online (Sandbox Code Playgroud)\n\n

请注意,与 X11 cookie 不同,D-Bus cookie 可以在服务器的生命周期内更改。事实上,在我的实验中,它似乎以不规则的间隔发生变化,有时只在几分钟后发生变化。

\n\n

据我所知,只有最新版本的 Gnome 库才会读取 cookie 文件。notify-send可以在带有 Gnome 3.14 的 FreeBSD 10.1 上阅读它,但不能在带有 Gnome 3.4 的 Debian wheezy 上阅读。

\n