Executing Elevated Commands in Your Current Environment

Justin Kenyon

Recently Blake Williams and I were authoring a library for interacting with the Amazon Dash buttons called dashed. For Dashed to work, you need to listen to the requests that your network device can hear on the network it is connected to. This is a restricted device and only can be listened to when you run your commands with elevated privileges (e.g. sudo [command]). Running your command with sudo will give you the proper access. However, since the sudo command runs the subsequent commands in the system user’s environment, it will also be using the system user’s Ruby installation. This can cause issues with gems that are not present, Ruby version differences, and more.

You can solve this in a couple of different ways. For instance you can install all of the gems your project needs in the system user’s environment, and install the correct version of Ruby there as well. What if you want to use an upgraded version of a gem? You’ll have to upgrade all the appropriate gems in your system user’s environment as well. How can you accomplish this in an easy way?

Looking at the output of sudo --help gives you a slew of options. One in particular will solve the problem for us:

-E, --preserve-env          preserve user environment when running command

All you need is the --preserve-env option and all your environment variables will be maintained when executing the elevated command.