Why dup()?
Damien Miller
djm at mindrot.org
Fri Oct 13 16:52:23 AEDT 2017
On Tue, 10 Oct 2017, David Newall wrote:
> Hello all,
>
> My scripts, which read stdout from ssh, weren't seeing EOF from the
> remote session. It was being sent, but lost. I tracked it down to the
> following code, in ssh.c, at ssh_session2_open:
>
> if (stdin_null_flag) {
> in = open(_PATH_DEVNULL, O_RDONLY);
> } else {
> in = dup(STDIN_FILENO);
> }
> out = dup(STDOUT_FILENO);
> err = dup(STDERR_FILENO);
This is probably because some things interact with stderr (and possibly
stdout) separately than through the channels layer.
> if (stdin_null_flag) {
> in = open(_PATH_DEVNULL, O_RDONLY);
> } else {
> in = STDIN_FILENO;
> }
> out = STDOUT_FILENO;
> err = STDERR_FILENO;
>
> If not that, how is a program that reads from ssh's output ever going to
> see EOF?
I don't think communicating closes on stdout separately to ssh itself
terminating is a case we've considered supporting before. Maybe we
could, but there are bound to be some subtleties beyond your suggested
solution.
At a minimum, I think we'd have to dup2 a fd to /dev/null to
STDOUT_FILENO so writes to stdout (e.g. from ill-behaved libraries) have
somewhere to go. I think we'd want to leave stderr the way it is too.
-d
More information about the openssh-unix-dev
mailing list