Answers:
如果您拥有其他用户的密码,则可以这样做sudo -u somedude notify-send Hello
。somedude必须已开始X会话。
编辑:找到了与cron一起使用的脚本:
#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/X11R6/bin
export DISPLAY=:0.0
export $(grep -z DBUS_SESSION_BUS_ADDRESS /proc/$(pgrep -session)/environ )
TIME=$1
shift
/usr/bin/notify-send -t 36000 $1 $2
-session
吗?
pgrep
应该获得X会话管理器的pid,即lxde-session,gnome-session等。该脚本充其量只是一个粗略的技巧,在很大程度上取决于您的系统设置。当我回答时它奏效了,但五年后现在没有修改就无法奏效。
我偶然发现了以下实现用户通知的项目:tinynotify-send
我需要类似的工具将通知发送到所有会话。这是我的解决方案:https : //unix.stackexchange.com/a/230062/93227
它扫描/ proc以查找所有会话总线,然后在每个会话总线上执行通知发送(每条总线一次)。所有参数不变地传递给实际的通知发送。
#!/bin/bash
/bin/grep -sozZe '^DBUS_SESSION_BUS_ADDRESS=[a-zA-Z0-9:=,/-]*$' /proc/*/environ \
| /usr/bin/php -r '
$busses = array();
array_shift($argv);
while($ln = fgets(STDIN)) {
list($f, $env) = explode("\0", $ln, 2);
if (file_exists($f)) {
$user = fileowner($f);
$busses[$user][trim($env)] = true;
}
}
foreach ($busses as $user => $user_busses) {
foreach ($user_busses as $env => $true) {
if (pcntl_fork()) {
posix_seteuid($user);
$env_array = array("DBUS_SESSION_BUS_ADDRESS" => preg_replace("/^DBUS_SESSION_BUS_ADDRESS=/", "", $env));
pcntl_exec("/usr/bin/notify-send", $argv, $env_array);
}
}
}
' -- "$@"