diff --git a/lib/client/session.go b/lib/client/session.go index 71f4584bddf2d..63936b0ea9a7d 100644 --- a/lib/client/session.go +++ b/lib/client/session.go @@ -225,22 +225,22 @@ func (ns *NodeSession) createServerSession(ctx context.Context) (*tracessh.Sessi return nil, trace.Wrap(err) } - envs := map[string]string{} - // pass language info into the remote session. langVars := []string{"LANG", "LANGUAGE"} for _, env := range langVars { if value := os.Getenv(env); value != "" { - envs[env] = value + err = sess.Setenv(ctx, env, value) + if err != nil { + log.Warn(err) + } } } // pass environment variables set by client for key, val := range ns.env { - envs[key] = val - } - - if err := sess.SetEnvs(ctx, envs); err != nil { - log.Warn(err) + err = sess.Setenv(ctx, key, val) + if err != nil { + log.Warn(err) + } } // if agent forwarding was requested (and we have a agent to forward), diff --git a/lib/srv/forward/sshserver.go b/lib/srv/forward/sshserver.go index 2b1bbe867750b..ad587d3888c0e 100644 --- a/lib/srv/forward/sshserver.go +++ b/lib/srv/forward/sshserver.go @@ -1101,8 +1101,13 @@ func (s *Server) dispatch(ctx context.Context, ch ssh.Channel, req *ssh.Request, case sshutils.PuTTYWinadjRequest: return s.handlePuTTYWinadj(ch, req) default: - return trace.BadParameter( - "%v doesn't support request type '%v'", s.Component(), req.Type) + s.log.Warnf("%v doesn't support request type '%v'", s.Component(), req.Type) + if req.WantReply { + if err := req.Reply(false, nil); err != nil { + s.log.Errorf("sending error reply on SSH channel: %v", err) + } + } + return nil } } diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index b346136ca5244..1f6bfefc59ddc 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -1564,8 +1564,13 @@ func (s *Server) dispatch(ctx context.Context, ch ssh.Channel, req *ssh.Request, s.Logger.Debugf("%v: deliberately ignoring request for '%v' channel", s.Component(), sshutils.PuTTYSimpleRequest) return nil default: - return trace.BadParameter( - "(%v) proxy doesn't support request type '%v'", s.Component(), req.Type) + s.Logger.Warnf("(%v) proxy doesn't support request type '%v'", s.Component(), req.Type) + if req.WantReply { + if err := req.Reply(false, nil); err != nil { + s.Logger.Errorf("sending error reply on SSH channel: %v", err) + } + } + return nil } } @@ -1662,8 +1667,13 @@ func (s *Server) dispatch(ctx context.Context, ch ssh.Channel, req *ssh.Request, case sshutils.PuTTYWinadjRequest: return s.handlePuTTYWinadj(ch, req) default: - return trace.BadParameter( - "%v doesn't support request type '%v'", s.Component(), req.Type) + s.Logger.Warnf("%v doesn't support request type '%v'", s.Component(), req.Type) + if req.WantReply { + if err := req.Reply(false, nil); err != nil { + s.Logger.Errorf("sending error reply on SSH channel: %v", err) + } + } + return nil } } diff --git a/lib/srv/regular/sshserver_test.go b/lib/srv/regular/sshserver_test.go index 3b6025e1a6e0a..dac7ddf2fe4b6 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -1694,6 +1694,30 @@ func TestEnvs(t *testing.T) { } } +// TestUnknownRequest validates that any unknown session +// requests do not terminate the session. +func TestUnknownRequest(t *testing.T) { + t.Parallel() + ctx := context.Background() + + f := newFixtureWithoutDiskBasedLogging(t) + + se, err := f.ssh.clt.NewSession(ctx) + require.NoError(t, err) + defer se.Close() + + // send a random request that won't be handled + ok, err := se.SendRequest(ctx, uuid.NewString(), true, nil) + require.NoError(t, err) + require.False(t, ok) + + // ensure the session is still active + require.NoError(t, se.Setenv(ctx, "HOME_TEST", "/test")) + output, err := se.Output(ctx, "env") + require.NoError(t, err) + require.Contains(t, string(output), "HOME_TEST=/test") +} + // TestNoAuth tries to log in with no auth methods and should be rejected func TestNoAuth(t *testing.T) { t.Parallel() diff --git a/lib/srv/term.go b/lib/srv/term.go index c714bd82fed63..16d179ef491a7 100644 --- a/lib/srv/term.go +++ b/lib/srv/term.go @@ -693,7 +693,9 @@ func (t *remoteTerminal) prepareRemoteSession(ctx context.Context, session *trac teleport.SSHSessionID: string(scx.SessionID()), } - if err := session.SetEnvs(ctx, envs); err != nil { - t.log.WithError(err).Debug("Unable to set environment variables") + for k, v := range envs { + if err := session.Setenv(ctx, k, v); err != nil { + t.log.Debugf("Unable to set environment variable: %v: %v", k, v) + } } }