Next Spaceship

Driving into future…

How to Solve Broken Pipe Message in SSH Session

| Comments

Sometimes my SSH session disconnects with a Write failed: Broken pipe message. What does it mean? And how can I keep my session open?

It’s possible that your server closes connections that are idle for too long. You can update either your client (ServerAliveInterval) or your server (ClientAliveInterval).

ServerAliveInterval Sets a timeout interval in seconds after which if no data has been received from the server, ssh(1) will send a message through the encrypted channel to request a response from the server. The default is 0, indicating that these messages will not be sent to the server.
This option applies to protocol version 2 only.

ClientAliveInterval 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.
This option applies to protocol version 2 only.

To update your server (and restart your sshd)

1
$ echo "ClientAliveInterval 60" | sudo tee -a /etc/ssh/sshd_config

Or client-side:

1
$ echo "ServerAliveInterval 60" >> ~/.ssh/config

Although you have configured all the above parameters, sometimes the connection just breaks. To solve this problem, I wrote this shell script to automatically restart ssh as soon as it breaks down.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#!/bin/sh

#This is an SSH-D proxy with auto-reconnect on disconnect

#Created by Leon on 28, Sep, 2011
#Email: i@leons.im

i=0
while test 1==1
do
    remote_ip=YOUR_REMOTE_IP
    remote_user=YOUR_REMOTE_USER
    local_port=YOUR_LOCAL_PORT

    exist=`ps aux | grep $remote_user@$remote_ip | grep $local_port`
    #echo $exist
    if test -n "$exist"
    then
        if test $i -eq 0
        then
            echo "I'm alive since $(date)"
        fi
        i=1
    else
        i=0
        echo "I died... God is bringing me back..."
        ssh $remote_user@$remote_ip -f -N -D 0.0.0.0:$local_port
    fi
    sleep 1
done

(Replace YOUR_REMOTE_USER and YOUR_REMOTE_IP with the username and ip address of your remote server correspondingly. Replace YOUR_LOCAL_PORT with the local port you want to listen on for proxy.)

If you want to connect to your remote machine via SSH without a password, go to /2011/11/ssh-login-without-password/

Update:

As John replies in the comments, you can also place this line in your ~/.ssh/config file ServerAliveCountMax = 120 to make your SSH connection stays alive longer.

Comments