是否可以编写一个 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 用户身份运行脚本的方法。
笔记
- 需要帮助来消除前两个缺点。