@@ -48,6 +48,10 @@ func NewUserEnvProbe(probe string) (UserEnvProbe, error) {
4848}
4949
5050func ProbeUserEnv (ctx context.Context , probe string , userName string , log log.Logger ) (map [string ]string , error ) {
51+ return ProbeUserEnvWithUserSwitch (ctx , probe , userName , true , log )
52+ }
53+
54+ func ProbeUserEnvWithUserSwitch (ctx context.Context , probe string , userName string , switchUser bool , log log.Logger ) (map [string ]string , error ) {
5155 userEnvProbe , err := NewUserEnvProbe (probe )
5256 if err != nil {
5357 log .Warnf ("Get user env probe: %v" , err )
@@ -66,12 +70,12 @@ func ProbeUserEnv(ctx context.Context, probe string, userName string, log log.Lo
6670 log .Debugf ("running user env probe with shell \" %s\" , probe \" %s\" , user \" %s\" and command \" %s\" " ,
6771 strings .Join (preferredShell , " " ), string (userEnvProbe ), userName , "cat /proc/self/environ" )
6872
69- probedEnv , err := doProbe (ctx , userEnvProbe , preferredShell , userName , "cat /proc/self/environ" , '\x00' , log )
73+ probedEnv , err := doProbeWithUserSwitch (ctx , userEnvProbe , preferredShell , userName , "cat /proc/self/environ" , '\x00' , switchUser , log )
7074 if err != nil {
7175 log .Debugf ("running user env probe with shell \" %s\" , probe \" %s\" , user \" %s\" and command \" %s\" " ,
7276 strings .Join (preferredShell , " " ), string (userEnvProbe ), userName , "printenv" )
7377
74- newProbedEnv , newErr := doProbe (ctx , userEnvProbe , preferredShell , userName , "printenv" , '\n' , log )
78+ newProbedEnv , newErr := doProbeWithUserSwitch (ctx , userEnvProbe , preferredShell , userName , "printenv" , '\n' , switchUser , log )
7579 if newErr != nil {
7680 log .Warnf ("failed to probe user environment variables: %v, %v" , err , newErr )
7781 } else {
@@ -86,16 +90,22 @@ func ProbeUserEnv(ctx context.Context, probe string, userName string, log log.Lo
8690}
8791
8892func doProbe (ctx context.Context , userEnvProbe UserEnvProbe , preferredShell []string , userName string , probeCmd string , sep byte , log log.Logger ) (map [string ]string , error ) {
93+ return doProbeWithUserSwitch (ctx , userEnvProbe , preferredShell , userName , probeCmd , sep , true , log )
94+ }
95+
96+ func doProbeWithUserSwitch (ctx context.Context , userEnvProbe UserEnvProbe , preferredShell []string , userName string , probeCmd string , sep byte , switchUser bool , log log.Logger ) (map [string ]string , error ) {
8997 args := preferredShell
9098 args = append (args , getShellArgs (userEnvProbe , userName , probeCmd )... )
9199
92100 timeoutCtx , cancel := context .WithTimeout (ctx , 10 * time .Second )
93101 defer cancel ()
94102 cmd := exec .CommandContext (timeoutCtx , args [0 ], args [1 :]... )
95103
96- err := PrepareCmdUser (cmd , userName )
97- if err != nil {
98- return nil , fmt .Errorf ("prepare probe: %w" , err )
104+ if switchUser {
105+ err := PrepareCmdUser (cmd , userName )
106+ if err != nil {
107+ return nil , fmt .Errorf ("prepare probe: %w" , err )
108+ }
99109 }
100110
101111 out , err := cmd .Output ()
@@ -114,7 +124,7 @@ func doProbe(ctx context.Context, userEnvProbe UserEnvProbe, preferredShell []st
114124 log .Debugf ("failed to split env var: %s" , line )
115125 continue
116126 }
117- retEnv [tokens [0 ]] = tokens [1 ]
127+ retEnv [tokens [0 ]] = strings . Join ( tokens [1 :], "=" )
118128 }
119129 if scanner .Err () != nil {
120130 return nil , fmt .Errorf ("scan shell output: %w" , err )
0 commit comments