diff --git a/pkg/scbase/scbase.go b/pkg/scbase/scbase.go index a16b981b..3e41082b 100644 --- a/pkg/scbase/scbase.go +++ b/pkg/scbase/scbase.go @@ -9,6 +9,7 @@ import ( "log" "os" "os/exec" + "os/user" "path" "regexp" "runtime" @@ -35,6 +36,7 @@ const PromptAppPathVarName = "PROMPT_APP_PATH" const PromptVersion = "v0.3.1" const PromptAuthKeyFileName = "prompt.authkey" const MShellVersion = "v0.3.0" +const DefaultMacOSShell = "/bin/bash" var SessionDirCache = make(map[string]string) var ScreenDirCache = make(map[string]string) @@ -376,3 +378,30 @@ func MacOSRelease() string { }) return osRelease } + +var userShellRegexp = regexp.MustCompile(`^UserShell: (.*)$`) + +// dscl . -read /User/[username] UserShell +// defaults to /bin/bash +func MacUserShell() string { + osUser, err := user.Current() + if err != nil { + log.Printf("error getting current user: %v\n", err) + return DefaultMacOSShell + } + ctx, cancelFn := context.WithTimeout(context.Background(), 2*time.Second) + defer cancelFn() + userStr := "/Users/" + osUser.Name + out, err := exec.CommandContext(ctx, "dscl", ".", "-read", userStr, "UserShell").CombinedOutput() + if err != nil { + log.Printf("error executing macos user shell lookup: %v %q\n", err, string(out)) + return DefaultMacOSShell + } + outStr := strings.TrimSpace(string(out)) + m := userShellRegexp.FindStringSubmatch(outStr) + if m == nil { + log.Printf("error in format of dscl output: %q\n", outStr) + return DefaultMacOSShell + } + return m[1] +}