我想设置一个拥有大量用户的服务器,以便(按重要性顺序):
who
用户无法通过或获取其他用户的 IP 地址last
- 用户可以
write
互相 - 用户可以选择性地屏蔽
mesg n
其他用户,而不是简单地屏蔽所有人 - [可选] 用户不能
wall
第 1 点很容易通过和chmod 660
来解决,但我不知道如何实现其他要点wtmp
utmp
服务器运行 Gentoo Linux
的输出last
为:
last: /var/log/wtmp: Permission denied
的输出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
答案1
该write
命令本质上是写入设备文件,例如/dev/pts/1
。它似乎在进行查询utmp
,以便找出用户和 tty 之间的对应关系。可以通过简单地列出 的内容来解决此问题/dev/pts
(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
中的文件/dev/pts
属于组tty
。write
setgids 命令将文件设置为该组以便对其进行写入。因此,为了使第 (2) 点发挥作用,应该可以使用 ACL 使utmp
组 可以读取tty
:
setfacl -m g:tty:r /var/run/utmp
(改变utmp
它的组tty
也许会起作用,但谁知道这可能会产生什么副作用。)
为了使点 (3) 发挥作用(假设/dev/pts
文件系统不支持 ACL),我相信您需要修改write
并实现其中的功能(例如,读取目标用户主目录中的文件“allow_mesg”并查看消息传递用户是否列在其中)。
答案2
您可以使用 chroot 并将用户锁定到自定义根目录中。通过这样做,您可以将他们指向 mesg、wall、who 等的任何版本。
您还可以强制将它们放入 shell 包装器中,然后在那里设置控件。