向所有用户传达一些信息

向所有用户传达一些信息

是否可以编写一个 shell 脚本,使任何用户(可能不是 root)都可以设置一条消息(例如“下载正在进行,请勿关闭”等),该消息将像弹出消息(zenity 或通知发送)一样传达给所有其他用户。如果任何用户在抛出消息时不在场,他们必须在登录或解锁屏幕时收到该消息。

答案1

好问题。我只会给出一半的答案……只是一个种子,看看是否有人可以为此准备一些东西。我已经在我的系统中测试了这一点,两个用户(ubuntu 和 romano,两个管理员)。

我进入 VC 并以 ubuntu 身份登录 --- 然后我运行

sudo sudo -u romano DISPLAY=:0.0 zenity --warning

(第一个 sudo 切换到超级用户,第二个 sudozenity以用户身份执行romano

从虚拟控制台,该消息将出现在“romano”图形环境中。

我认为,只要稍微调整一下 的输出,w获取 DISPLAY 和用户,然后循环遍历它们,就有可能找到一个可行的解决方案。可以使用 通知非图形连接的用户wall

我认为,如果没有超级用户权限,做到这一点真的很困难,很难。

答案2

如果找不到直接解决方案,可以通过创建一个(在本例中很简单的)守护进程来解决此类问题,该守护进程以提升的权限运行并在系统启动时运行。

然后,普通用户可以将文件放在守护进程可以看到的地方,或者向守护进程发送消息,然后守护进程就可以执行任何需要提升权限的操作。

您只需小心守护进程接受的输入,这样就不会在系统中打开任何安全漏洞。

当您将未编辑的字符串传递给以提升权限运行的 bash 脚本时,可能会发生几乎无限多种情况!仅出于这个原因,如果您的守护进程是用 Python 之类的语言编写的,那就更好了,在系统有机会解释/执行其内容之前,您可以在传入的字符串上执行任何您想做的事情。

对于登录的用户,您可能可以在 /etc/profile 中添加几行,告诉守护进程发出用户需要查看的任何消息。如果您这样做,您可能还应该做一些事情来避免用户再次登录时出现不必要的重复。这需要做更多的工作,但可以防止警报变成烦人的软件。

答案3

我认为我的做法确实很糟糕。无论如何,在一定程度上还是有效的。任何改进脚本或更好脚本的建议都欢迎。我尝试在 Rmano 和 Joe 的回答的帮助下做到这一点。

/home/message.txt我创建了一个具有权限的文件-rw-rw-rw-,以便任何用户(可能不是sudo群组成员)都可以在其中写入消息。我编写了两个脚本,它们都具有权限-rwxr-xr-x

  • /usr/bin/msg_on_login.sh 在用户登录时向其传递消息
  • /usr/bin/msgpass.sh将消息传递给其系统上的用户(屏幕可能被锁定)

登录时发送消息

#!/bin/bash

m=`who | grep tty | wc -l`
# how many users are logged in
num=`expr $m - 1`
# it helps to send the message to exact display in case one or more user is already logged in
if [ `wc -w /home/message.txt| gawk '{print $1}'` -gt 1 ] && [ $num -gt 0 ]
    then
        DISPLAY=:$num.0 zenity --info --text="`cat /home/message.txt`" &
    elif [ `wc -w /home/message.txt| gawk '{print $1}'` -gt 1 ]
        then  
            zenity --info --text="`cat /home/message.txt`" &
    else
        exit 0
fi

/usr/bin/msg_on_login.sh并在末尾添加此行“ ” /etc/profile,并将 /usr/bin/msg_on_login.sh 的权限更改为-rwxr-xr-x。然后每次任何用户登录时,该脚本都会运行,并且用户将收到该消息。

密码验证工具

#!/bin/bash
m=`who | grep tty | awk '{print $1}' | sort | uniq | wc -l`
min=0
max=`expr $m - 1`
array=(`who | grep tty | awk '{print $1}'`)
for num in `seq $min $max`
do
if [ `wc -w /home/message.txt| gawk '{print $1}'` -gt 1 ] 
then
    sudo sudo -u ${array[num]} DISPLAY=:$num.0 zenity --info --text="`cat /home/message.txt`" &
else
    exit 0
fi
done
echo 0 > /home/message.txt

更改 的权限/usr/bin/msgpass.sh-rwxr-xr-x

缺点

  • 如果任何用户从虚拟终端登录,他都会收到错误消息。处理这种情况很棘手。由于这种情况不是预期的,所以我跳过了那部分。
  • 假设第一个用户(在第二个用户之前登录)注销系统然后msgpass.sh跌倒并出现错误。
  • 要运行,msgpass.sh您需要有 sudo 组的成员。
  • 我也发现了以非 root 用户身份运行脚本的方法

笔记

  • 需要帮助来消除前两个缺点。

相关内容