How to keep environment variables when using sudo

Apple Touch Icon 2
Images 1 1

I came up with a unique solution because:

  • sudo -E “[email protected]” was leaking variables that was causing problems for my command
  • sudo VAR1=”$VAR1″ … VAR42=”$VAR42″ “[email protected]” was long and ugly in my case

demo.sh

!/bin/bash function sudo_exports(){ eval sudo $(for x in $_EXPORTS; do printf ‘%q=%q ‘ “$x” “${!x}”; done;) “[email protected]” } # create a test script to call as sudo echo ‘echo Forty-Two is $VAR42’ > sudo_test.sh chmod +x sudo_test.sh export VAR42=”The Answer to the Ultimate Question of Life, The Universe, and Everything.” export _EXPORTS=”_EXPORTS VAR1 VAR2 VAR3 VAR4 VAR5 VAR6 VAR7 VAR8 VAR9 VAR10 VAR11 VAR12 VAR13 VAR14 VAR15 VAR16 VAR17 VAR18 VAR19 VAR20 VAR21 VAR22 VAR23 VAR24 VAR25 VAR26 VAR27 VAR28 VAR29 VAR30 VAR31 VAR32 VAR33 VAR34 VAR35 VAR36 VAR37 VAR38 VAR39 VAR40 VAR41 VAR42″ # clean function style sudo_exports ./sudo_test.sh # or just use the content of the function eval sudo $(for x in $_EXPORTS; do printf ‘%q=%q ‘ “$x” “${!x}”; done;) ./sudo_test.sh

Result

$ ./demo.sh Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything. Forty-Two is The Answer to the Ultimate Question of Life, The Universe, and Everything.

How?

This is made possible by a feature of the bash builtin printf. The %q produces a shell quoted string. Unlike the parameter expansion in bash 4.4, this works in bash versions < 4.0

Leave a Reply