Judking
Judking

Reputation: 6381

Why this linux command can affect the environment variables?

When I changed my current user to admin using

sudo su admin

I found that the environment variable changed too. What I intend to do is to change my user to admin with the env not changed.

Then I found a command as follows:

sudo bash -c "su - admin"

This command does indeed what I want, but I googled about bash -c, with no clue to why this command can do that for me. Could anyone give me a clear explanation? Thanks a lot.

Upvotes: 0

Views: 187

Answers (2)

Michael Steinfeld
Michael Steinfeld

Reputation: 146

first you should read the sudo manpage and set theses options in the /etc/sudoers file or you can do it interactively (see second below).

default sudoers file may not preserve the existing $USER environment unless you set the config options to do so. You'll want to read up on env_reset because depending on your OS distribution the sudo config will be different in most cases.

I dont mean to be terse but I am on a mobile device..

I do not recommend using sudo su .. for anything. whomever is sharing sudo su with the public is a newb, and you can accomplish the same cleaner with just sudo.

with your example whats happining is you are starting a subshell owned by the original user ("not admin") . you are starting the subshell with -c "string" sudo has the equivelant of the shell's -c using -s which either reads the shell from the arg passed to -s or the shell defined in the passwd file.

second you should use:

    $ sudo -u admin -E -s

much cleaner right ? :)

    -u sets the user, obviously 
    -s we just explained
    -E preserves the orig user env 

see for yourself just

    $ echo $HOME    # should show the original users /home/orig_user
    $ env

your original env is preserved with none of that sudo su ugliness.

if you were interested in simulating a users login without preserving the env..

    $ sudo -u user -i 

or for root:

Might require -E depending on distro sudoers file

    $ sudo -s 

or

    $ sudo -i 

    -i simulates the login and uses the users env.

hopefully this helps and someone will kindly format it to be more readable since im on my mobile.

Upvotes: 1

linux_fanatic
linux_fanatic

Reputation: 5177

bash with -c argument defines below.

-c string

If the -c option is present, then commands are read from string. If there are arguments after the string, they are assigned to the positional parameters, starting with $0.

Thanks & Regards,
Alok

Upvotes: 0

Related Questions