ControlMaster auto and stderr

Caleb Spare cespare at gmail.com
Wed Jan 15 12:42:22 EST 2014


I use ControlMaster auto (along with ControlPath) in my ssh config and
find it very handy.

I have noticed an annoying behavior, though: it seems that if there is
no existing master connection and ssh creates a new one, the master
connection process that is started has its stderr left open.

This has manifested itself in two ways so far:

(1) When using ssh day-to-day, I may be doing some work and the text
'Shared connection to [servername] closed.' appears in my terminal.
This happens when the remote server closes the connection after some
amount of time (maybe hours or days). It's disruptive; I don't care
about that connection and ssh will transparently open a new one the
next time I ssh in. The text might appear while I'm inside vim or top
and mess with that program.

(2) Some software (I noticed it with Ansible[1]) waits for
stderr/stdout of a process to be closed. In the case of Ansible it was
because the communicate() method of Python's subprocess module[2]
waits on stdout/stderr as well as wait()ing on the process itself.
(This behavior seems strange to me, but it's indicative that openssh's
behavior here is atypical, I think.)

I haven't looked at the code yet, but I think the behavior I'd expect
would be that when ssh creates the controlmaster process, it would set
its stdin/stderr/stdout to /dev/null, or else some logfile. It's not
useful to have that process writing to the terminal after its parent
is long dead.

Thanks for any information/feedback you can provide!
-Caleb

[1] http://www.ansibleworks.com/
[2] http://docs.python.org/2/library/subprocess.html#subprocess.Popen.communicate


More information about the openssh-unix-dev mailing list