diff --git a/lib/client/session.go b/lib/client/session.go index 6852b49cf64c6..f4e9e7b539c8f 100644 --- a/lib/client/session.go +++ b/lib/client/session.go @@ -226,22 +226,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 8603ee2fb3a46..831fbc8227118 100644 --- a/lib/srv/forward/sshserver.go +++ b/lib/srv/forward/sshserver.go @@ -1109,8 +1109,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 78633d4932e62..52782cac02abd 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -1587,8 +1587,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 } } @@ -1685,8 +1690,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 5e36d0c8c5e83..3dea236999dc3 100644 --- a/lib/srv/regular/sshserver_test.go +++ b/lib/srv/regular/sshserver_test.go @@ -1696,6 +1696,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 d649034fbec9c..a7ef55406311b 100644 --- a/lib/srv/term.go +++ b/lib/srv/term.go @@ -682,7 +682,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) + } } }