什么是 chmod 相当于 mesg

Man*_*yLB 3 chmod

和的chmod等价物是什么?mesg ymesg n

Kus*_*nda 8

注意:正如 JdeBP在评论中指出的那样,重现mesgwith的行为并非易事chmod

POSIX 规范中的基本原理部分mesg

更改的终端mesg是与标准输入、输出或错误相关的终端,而不是 session 的控制终端。这是因为多次登录的用户应该能够更改他们的任何登录终端,而不必停止在这些会话中运行的作业。这不是涉及其他用户终端的安全问题,因为需要适当的权限才能影响其他用户的终端。

System V采用的方法是依次检查前三个文件描述符中的每一个,直到找到终端。

最简单的方法是查看 shell 的控制终端(当前交互式 shell 的标准输入所连接的设备)在mesg使用时权限的变化。

shell 的控制终端由tty命令返回。要弄清楚设备上的权限mesg nmesg y正在做什么,我们可以使用ls -l它并查看发生了什么变化:

$ ls -l "$(tty)"
crw--w----  1 myself  tty    5,   1 May  6 00:21 /dev/ttyp1

$ mesg n
$ ls -l "$(tty)"
crw-------  1 myself  tty    5,   1 May  6 00:21 /dev/ttyp1

$ mesg y
$ ls -l "$(tty)"
crw--w----  1 myself  tty    5,   1 May  6 00:21 /dev/ttyp1
Run Code Online (Sandbox Code Playgroud)

所以它看起来像mesg n删除了设备的组写入权限(rw--w----更改为rw-------)并mesg y再次添加组写入权限。

chmod等效会,于我而言,是

$ chmod g-w "$(tty)"     # for "mesg n"
$ chmod g+w "$(tty)"     # for "mesg y"
Run Code Online (Sandbox Code Playgroud)

适当地添加盐和胡椒粉,以适应您的 Unix 特定风味。

但是请注意,如果 shell 的标准输入不是终端,tty则会返回字符串not a tty并且chmod会失败。在这种情况下,mesg将继续尝试使用终端设备获取 shell 的标准输出,然后尝试标准错误(按此顺序)。这就是为什么上述是一种幼稚的方法。

  • @ Ned64 嗯,不。我在`/bin/sh`(不是`bash`)中运行它,这是一个存在于所有Unix 系统上的shell。`/bin/sh` 将 `$(...)` 理解为命令替换(除非系统确实很旧,并且跳过了多次更新)。有关更多信息,请参阅 https://unix.stackexchange.com/questions/126927/have-backticks-ie-cmd-in-sh-shells-been-deprecated (2认同)