向所有用户传达一些消息

是否有可能编写一个shell脚本,允许任何用户(可能不是root用户)设置消息(例如“下载进度不要关闭”等),这些消息将像弹出消息一样传达(zenity或notify-发送)给所有其他用户。 如果任何用户在发送消息时不在那里,他们必须在登录时获取它或解锁他们的屏幕。

好问题。 只给出一半答案……只是一个种子,看看是否有人可以从此开始做准备。 我在我的系统中测试了这个,两个用户(ubuntu和romano,两个管理员)。

我去了一个VC并以ubuntu身份登录—然后我跑了

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

(第一个sudo切换到超级用户,第二个sudo执行zenity作为用户romano

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

我想通过稍微修改w的输出来获取DISPLAY和用户并循环遍历它们就可以有一个可行的解决方案。 可以使用wall来通知非图形连接的用户。

没有超级用户权限,我觉得很难做到这一点。

如果找不到直接的解决方案,可以通过创建一个(简单的,在这种情况下)守护程序来解决这样的问题,该程序以提升的权限运行并在系统启动时运行。

然后,常规用户用户可以将文件放在守护程序将看到的位置,或者向守护程序发送消息,然后守护程序可以执行任何需要提升权限的操作。

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

将未经编辑的字符串传递给以提升的权限运行的bash脚本时,可能会发生几乎无限的各种事情! 仅仅因为这个原因,如果您的守护进程是用Python等语言编写的,那么在系统有机会解释/执行其内容之前,您可以对传入的字符串执行任何操作,这样会好得多。

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

我认为我所做的事情确实是一种糟糕的做事方式。 无论如何,它工作到一定程度。 任何改进脚本或更好的脚本的建议总是受欢迎的。 我试图在Rmano和Joe给出的答案的帮助下做到这一点。

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

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

msg_on_login.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 

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

msgpass.sh

 #!/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权限/usr/bin/msgpass.sh-rwxr-xr-x

缺点

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

注意

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