From 45e37063357677eaaa2e252395d67b4d53cbe3ec Mon Sep 17 00:00:00 2001 From: jon4hz Date: Sat, 25 Feb 2023 00:19:58 +0100 Subject: [PATCH] fix: always execute cmd in subshell --- cli/packages/cmd/run.go | 36 ++++++++++++++++++++++++------------ 1 file changed, 24 insertions(+), 12 deletions(-) diff --git a/cli/packages/cmd/run.go b/cli/packages/cmd/run.go index f70d29726..594212a7e 100644 --- a/cli/packages/cmd/run.go +++ b/cli/packages/cmd/run.go @@ -161,11 +161,14 @@ func init() { // Will execute a single command and pass in the given secrets into the process func executeSingleCommandWithEnvs(args []string, secretsCount int, env []string) error { - command := args[0] - argsForCommand := args[1:] + shell := subShellCmd() color.Green("Injecting %v Infisical secrets into your application process", secretsCount) - cmd := exec.Command(command, argsForCommand...) + args = append(args[:1], args[0:]...) // shift args to the right + args[0] = shell[1] + + cmd := exec.Command(shell[0], args...) + cmd.Stdin = os.Stdin cmd.Stdout = os.Stdout cmd.Stderr = os.Stderr @@ -175,15 +178,7 @@ func executeSingleCommandWithEnvs(args []string, secretsCount int, env []string) } func executeMultipleCommandWithEnvs(fullCommand string, secretsCount int, env []string) error { - shell := [2]string{"sh", "-c"} - if runtime.GOOS == "windows" { - shell = [2]string{"cmd", "/C"} - } else { - currentShell := os.Getenv("SHELL") - if currentShell != "" { - shell[0] = currentShell - } - } + shell := subShellCmd() cmd := exec.Command(shell[0], shell[1], fullCommand) cmd.Stdin = os.Stdin @@ -197,6 +192,23 @@ func executeMultipleCommandWithEnvs(fullCommand string, secretsCount int, env [] return execCmd(cmd) } +func subShellCmd() [2]string { + // default to sh -c + shell := [...]string{"sh", "-c"} + + currentShell := os.Getenv("SHELL") + if currentShell != "" { + shell[0] = currentShell + } else if runtime.GOOS == "windows" { + // if the SHELL env var is not set and we're on Windows, use cmd.exe + // The SHELL var should always be checked first, in case the user executes + // infisical from something like Git Bash. + return [...]string{"cmd", "/C"} + } + + return shell +} + // Credit: inspired by AWS Valut func execCmd(cmd *exec.Cmd) error { sigChannel := make(chan os.Signal, 1)