Observação: como pontos JdeBP nos comentários , não é trivial reproduzir o comportamento de mesg
com chmod
.
A seção Justificativa na especificação POSIX para mesg
diz
The terminal changed by
mesg
is that associated with the standard input, output, or error, rather than the controlling terminal for the session. This is because users logged in more than once should be able to change any of their login terminals without having to stop the job running in those sessions. This is not a security problem involving the terminals of other users because appropriate privileges would be required to affect the terminal of another user.The method of checking each of the first three file descriptors in sequence until a terminal is found was adopted from System V.
A abordagem ingênua seria examinar as mudanças nas permissões no terminal de controle do shell (o dispositivo ao qual a entrada padrão do shell interativo atual está conectada) quando mesg
é usado.
O terminal de controle do shell é retornado pelo comando tty
. Para descobrir o que mesg n
e mesg y
estão fazendo com as permissões no dispositivo, podemos usar ls -l
e ver as alterações:
$ 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
Portanto, parece que mesg n
remove a permissão de gravação do grupo para o dispositivo ( rw--w----
muda para rw-------
) e mesg y
adiciona a permissão de gravação do grupo novamente.
O chmod
equivalente seria, no meu caso,
$ chmod g-w "$(tty)" # for "mesg n"
$ chmod g+w "$(tty)" # for "mesg y"
Adicione sal e pimenta de maneira apropriada para o sabor específico do Unix.
No entanto, observe que, se a entrada padrão do shell não for um terminal, tty
retornará a string not a tty
e o chmod
falhará. Nesse cenário, mesg
continuaria a tentar com o dispositivo terminal a saída padrão do shell e depois o erro padrão (nessa ordem). É por isso que o acima é uma abordagem ingênua .