diff --git a/agent/agent.go b/agent/agent.go index 6d0a9a952f44b..2c78ce3e145e3 100644 --- a/agent/agent.go +++ b/agent/agent.go @@ -378,6 +378,19 @@ func (a *agent) runStartupScript(ctx context.Context, script string) error { } func (a *agent) init(ctx context.Context) { + // Change current working directory to the users home + // directory so that SFTP connections land there. + // https://github.com/coder/coder/issues/3620 + u, err := user.Current() + if err != nil { + a.logger.Warn(ctx, "change working directory failed, unable to get current user", slog.Error(err)) + } else { + err = os.Chdir(u.HomeDir) + if err != nil { + a.logger.Warn(ctx, "change working directory failed", slog.Error(err)) + } + } + a.logger.Info(ctx, "generating host key") // Clients' should ignore the host key when connecting. // The agent needs to authenticate with coderd to SSH, diff --git a/agent/agent_test.go b/agent/agent_test.go index 06a33598b755f..ae3ebf52b34b6 100644 --- a/agent/agent_test.go +++ b/agent/agent_test.go @@ -10,6 +10,7 @@ import ( "net/netip" "os" "os/exec" + "os/user" "path/filepath" "runtime" "strconv" @@ -212,12 +213,21 @@ func TestAgent(t *testing.T) { t.Run("SFTP", func(t *testing.T) { t.Parallel() + u, err := user.Current() + require.NoError(t, err, "get current user") + home := u.HomeDir + if runtime.GOOS == "windows" { + home = "/" + strings.ReplaceAll(home, "\\", "/") + } conn, _ := setupAgent(t, codersdk.WorkspaceAgentMetadata{}, 0) sshClient, err := conn.SSHClient() require.NoError(t, err) defer sshClient.Close() client, err := sftp.NewClient(sshClient) require.NoError(t, err) + wd, err := client.Getwd() + require.NoError(t, err, "get working directory") + require.Equal(t, home, wd, "working directory should be home user home") tempFile := filepath.Join(t.TempDir(), "sftp") file, err := client.Create(tempFile) require.NoError(t, err)