client_loop: send disconnect: Broken pipe
Have you ever come across the situation when logged on to a server using
ssh that after a period of inactivity your session terminates and you get the following message:
user@remote% client_loop: send disconnect: Broken pipe user@local%
Whilst this is a harmless message — Often only seen when you leave an
ssh session open for a long period of inactivity. It can also occur when your WiFi or Internet disconnects — It's still an annoyance!
So the question to ask is...
"How can I fix this and keep my ssh session alive?"
Below are some examples on how to resolve ssh timeouts?
On a "per session" basis...
You can use the argument
-o on the
ssh command-line to accomplish this on a per session basis (no need to configure the server's ssh-config).
From the ssh_config(5) man page the options related to keeping connection alive are
ServerAliveInterval. The man page gives detailed information, but basically the syntax is:
user@local% ssh -o TCPKeepAlive=yes \ -o ServerAliveCountMax=20 -o ServerAliveInterval=15 \ <username>@<server>
The above example forces the client to send "keep-alive" messages every 15 seconds. If the limit of 20 consecutive messages do not get an answer back from the server (20x15 = 5 minutes) then it is understood the connection is broken/dead and the client ssh session is terminated.
System wide settings...
If you have Administrative rights (super-user capabilities) on the remote server, you can set the
ClientAliveInterval option in the ssh server configuration file sshd_config(5). From the man page:
Sets a timeout interval in seconds after which if no data has been received from the client, sshd(8) will send a message through the encrypted channel to request a response from the client. The default is 0, indicating that these messages will not be sent to the client.
To set a
ClientAliveInterval value of 300 (5 minutes). Perform the following steps:
- Logon to your remote server,
- With administrative rights, using your favourite editor, modify the SSH servers configuration file (sshd_config). For example:
user@remote% sudo vi /etc/ssh/sshd_config
- Add the following entry:
ClientAliveInterval 300NOTE: Change the value if it is already set — also making sure there is no # prefix to the option.
- Restart your SSH server. For example:
user@remote% sudo systemctl reload sshd.service
On a "per user" basis...
If you don't have administrative rights on the remote server, and equally do not wish to type the options each time you
ssh, you can set the desired options in the user's
ssh configuration file (
~/.ssh/config). For example:
user@local% cat ~/.ssh/config Host remote Hostname my-remote-server.fqdn TCPKeepAlive yes ServerAliveCountMax 20 ServerAliveInterval 15
Using the above example. For each
ssh session the user makes to host remote a
ssh session is established to the server my-remote-server.fqdn, and each of the options specified in the configuration file are set just as if the user had entered them on the command line.
Review the ssh_config(5) man page for definitiations for each keyword used.