diff --git a/agent/agent_test.go b/agent/agent_test.go index d6c8e4d97644c..73b31dd6efe72 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -51,6 +51,7 @@ import ( "github.com/coder/coder/v2/agent/agentssh" "github.com/coder/coder/v2/agent/agenttest" "github.com/coder/coder/v2/agent/proto" + "github.com/coder/coder/v2/agent/usershell" "github.com/coder/coder/v2/codersdk" "github.com/coder/coder/v2/codersdk/agentsdk" "github.com/coder/coder/v2/codersdk/workspacesdk" @@ -1193,6 +1194,53 @@ func TestAgent_SSHConnectionEnvVars(t *testing.T) { } } +func TestAgent_SSHConnectionLoginVars(t *testing.T) { + t.Parallel() + + envInfo := usershell.SystemEnvInfo{} + u, err := envInfo.User() + require.NoError(t, err, "get current user") + shell, err := envInfo.Shell(u.Username) + require.NoError(t, err, "get current shell") + + tests := []struct { + key string + want string + }{ + { + key: "USER", + want: u.Username, + }, + { + key: "LOGNAME", + want: u.Username, + }, + { + key: "HOME", + want: u.HomeDir, + }, + { + key: "SHELL", + want: shell, + }, + } + for _, tt := range tests { + tt := tt + t.Run(tt.key, func(t *testing.T) { + t.Parallel() + + session := setupSSHSession(t, agentsdk.Manifest{}, codersdk.ServiceBannerConfig{}, nil) + command := "sh -c 'echo $" + tt.key + "'" + if runtime.GOOS == "windows" { + command = "cmd.exe /c echo %" + tt.key + "%" + } + output, err := session.Output(command) + require.NoError(t, err) + require.Equal(t, tt.want, strings.TrimSpace(string(output))) + }) + } +} + func TestAgent_Metadata(t *testing.T) { t.Parallel() diff --git a/agent/agentssh/agentssh.go b/agent/agentssh/agentssh.go index 816bdf55556e9..c4aa53f4a550b 100644 --- a/agent/agentssh/agentssh.go +++ b/agent/agentssh/agentssh.go @@ -900,7 +900,10 @@ func (s *Server) CreateCommand(ctx context.Context, script string, env []string, cmd.Dir = homedir } cmd.Env = append(ei.Environ(), env...) + // Set login variables (see `man login`). cmd.Env = append(cmd.Env, fmt.Sprintf("USER=%s", username)) + cmd.Env = append(cmd.Env, fmt.Sprintf("LOGNAME=%s", username)) + cmd.Env = append(cmd.Env, fmt.Sprintf("SHELL=%s", shell)) // Set SSH connection environment variables (these are also set by OpenSSH // and thus expected to be present by SSH clients). Since the agent does