| 910 | } |
| 911 | |
| 912 | func (s *Server) CommandEnv(ei usershell.EnvInfoer, addEnv []string) (shell, dir string, env []string, err error) { |
| 913 | if ei == nil { |
| 914 | ei = &usershell.SystemEnvInfo{} |
| 915 | } |
| 916 | |
| 917 | currentUser, err := ei.User() |
| 918 | if err != nil { |
| 919 | return "", "", nil, xerrors.Errorf("get current user: %w", err) |
| 920 | } |
| 921 | username := currentUser.Username |
| 922 | |
| 923 | shell, err = ei.Shell(username) |
| 924 | if err != nil { |
| 925 | return "", "", nil, xerrors.Errorf("get user shell: %w", err) |
| 926 | } |
| 927 | |
| 928 | dir = s.config.WorkingDirectory() |
| 929 | |
| 930 | // If the metadata directory doesn't exist, we run the command |
| 931 | // in the users home directory. |
| 932 | _, err = os.Stat(dir) |
| 933 | if dir == "" || err != nil { |
| 934 | // Default to user home if a directory is not set. |
| 935 | homedir, err := ei.HomeDir() |
| 936 | if err != nil { |
| 937 | return "", "", nil, xerrors.Errorf("get home dir: %w", err) |
| 938 | } |
| 939 | dir = homedir |
| 940 | } |
| 941 | env = append(ei.Environ(), addEnv...) |
| 942 | // Set login variables (see `man login`). |
| 943 | env = append(env, fmt.Sprintf("USER=%s", username)) |
| 944 | env = append(env, fmt.Sprintf("LOGNAME=%s", username)) |
| 945 | env = append(env, fmt.Sprintf("SHELL=%s", shell)) |
| 946 | |
| 947 | env, err = s.config.UpdateEnv(env) |
| 948 | if err != nil { |
| 949 | return "", "", nil, xerrors.Errorf("apply env: %w", err) |
| 950 | } |
| 951 | |
| 952 | return shell, dir, env, nil |
| 953 | } |
| 954 | |
| 955 | // CreateCommand processes raw command input with OpenSSH-like behavior. |
| 956 | // If the script provided is empty, it will default to the users shell. |