写,墙,谁和消息

min*_*ill 5 linux permissions

我想设置一个有很多用户的服务器,以便(按重要性排序):

  1. 用户无法通过who, 或last
  2. 用户可以write互相
  3. 用户可以有选择地选择mesg n其他用户,而不是简单地阻止所有人
  4. [可选] 用户不能 wall

第 1 点很容易通过chmod 660on wtmpand解决utmp,但我不知道如何实现其他点

服务器运行 Gentoo Linux

的输出last是:

last: /var/log/wtmp: Permission denied
Run Code Online (Sandbox Code Playgroud)

的输出w是:

 17:04:45 up 36 days,  2:51,  0 users,  load average: 2.34, 2.96, 2.12
USER     TTY        LOGIN@   IDLE   JCPU   PCPU WHAT
Run Code Online (Sandbox Code Playgroud)

Ant*_*des 6

write命令基本上写入设备文件,例如/dev/pts/1. 好像utmp是为了搞清楚users和ttys的对应关系而咨询的。人们可以通过简单地列出/dev/ptswith的内容来解决这个问题ls -lh /dev/pts(尽管它很可能不需要 - 见下文)。

mesg 除了从 tty 设备文件中设置或删除组写入权限之外,似乎没有做任何事情:

anthony@laura:~$ who am i
anthony  pts/6        Jun 11 17:06 (:0:S.5)
anthony@laura:~$ mesg
is n
anthony@laura:~$ chmod g+w /dev/pts/6
anthony@laura:~$ mesg
is y
Run Code Online (Sandbox Code Playgroud)

中的文件/dev/pts属于组tty。该write命令setgids这组以写信给他们。因此,为了使第 (2) 点起作用,应该可以使用 ACL 使utmp组可读tty

setfacl -m g:tty:r /var/run/utmp
Run Code Online (Sandbox Code Playgroud)

(改变utmp它的组也tty可能起作用,但谁知道这可能有什么副作用。)

为了让 (3) 点工作(假设/dev/pts文件系统不支持 ACL),我相信您需要修改write并实现其中的功能(例如,读取目标用户主目录中的文件“allow_mesg”并查看消息传递用户是否列在其中)。