MESG(1) User Commands MESG(1)

# [NAME](#NAME)

mesg - display (or do not display) messages from other users

# [SYNOPSIS](#SYNOPSIS)

**mesg** \[*option*] \[**n**|**y**]

# [DESCRIPTION](#DESCRIPTION)

The **mesg** utility is invoked by a user to control write access others have to the terminal device associated with standard error output. If write access is allowed, then programs such as [**talk**(1)](/man/os/util-linux/talk.1) and [**write**(1)](/man/os/util-linux/write.1) may display messages on the terminal.

Traditionally, write access is allowed by default. However, as users become more conscious of various security risks, there is a trend to remove write access by default, at least for the primary login shell.

The initial permissions for the terminal are set by [**login**(1)](/man/os/util-linux/login.1) according to TTYPERM and TTYGROUP from */etc/login.defs*. The default is mode *0620* if a tty group is used, and *0600* without the group. The default tty group name is "tty".

To ensure that your ttys are set in a portable and independent manner from system settings, **mesg** should be executed in your login scripts.

**mesg** modifies the write permissions for a group on the current terminal device. Since version 2.41, **mesg** can no longer be compiled to make the terminal writable for *others* and strictly modifies only *group* permissions. The usual setup is to use a "tty" group and add relevant users to this group. Alternatively, a less secure solution is to set utilities like [**write**(1)](/man/os/util-linux/write.1) or [**wall**(1)](/man/os/util-linux/wall.1) to setgid for the "tty" group.

The **mesg** utility silently exits with error status 2 if not executed on a terminal. In this case executing **mesg** is pointless. The command line option **--verbose** forces **mesg** to print a warning in this situation. This behaviour has been introduced in version 2.33.

# [ARGUMENTS](#ARGUMENTS)

**n**

Disallow messages.

**y**

Allow messages to be displayed.

If no arguments are given, **mesg** shows the current message status on standard error output.

# [OPTIONS](#OPTIONS)

**-v**, **--verbose**

Explain what is being done.

**-h**, **--help**

Display help text and exit.

**-V**, **--version**

Display version and exit.

# [EXIT STATUS](#EXIT_STATUS)

The **mesg** utility exits with one of the following values:

**0**

Messages are allowed.

**1**

Messages are not allowed.

**&gt;1**

An error has occurred.

# [FILES](#FILES)

*/dev/\[pt]ty\**, */dev/pts/\[0-9]\**

# [HISTORY](#HISTORY)

**mesg** (I) appears in the UNIX Programmer’s Manual. It used to invert the current state with no argument before Version 7 AT&T UNIX.

# [SEE ALSO](#SEE_ALSO)

[**login**(1)](/man/os/util-linux/login.1), [**talk**(1)](/man/os/util-linux/talk.1), [**write**(1)](/man/os/util-linux/write.1), [**wall**(1)](/man/os/util-linux/wall.1), [**xterm**(1)](/man/os/util-linux/xterm.1)

# [REPORTING BUGS](#REPORTING_BUGS)

For bug reports, use the *issue tracker* &lt;https://github.com/util-linux/util-linux/issues&gt;.

# [AVAILABILITY](#AVAILABILITY)

The **mesg** command is part of the util-linux package which can be downloaded from *Linux Kernel Archive* &lt;https://www.kernel.org/pub/linux/utils/util-linux/&gt;.

2026-10-30 util-linux 2.42.4

---

Document: mesg(1) from util-linux 2.42.4-r2 (Chainguard OS)
