23

When I do su - to get to root, my current directory is set to root's home. Is there anyway to keep the current directory that I was in, much like sudo -s. Or is the answer to use sudo?

4
  • 5
    Please note that I don't want to sound rude, but why this problem is not solved via "man su" ?
    – Myrrdyn
    Jun 17, 2009 at 17:13
  • 1
    @Rory please read the Myrrdyn comment
    – c4f4t0r
    Jan 16, 2014 at 15:46
  • I like using sudo su -c "zsh", in my case, keeps me in current dir and load zsh as shell with root user. ctrl+d after and you get back to current user. For directory thing, works directly on centos for me, but maybe adding ` && cd $(pwd)` inside passed command could do the trick.
    – GabLeRoux
    Apr 24, 2015 at 17:08
  • @Myrrdyn Documentations are great when you know what you are looking for. When you don't, asking experts some advises is faster, and more didactic. Aug 18, 2018 at 16:19

8 Answers 8

19

It's always better to use sudo, if possible, because then you don't need to know (or give someone) root's password. Set the root password to something long and horrible and then lock it in a safe.

If you want to deny someone access later, you just remove their access to sudo, rather than having to teach everyone else a new root password.

However - you don't need to use the '-' parameter if you don't want to. You will get a shell as root, it will just not be a login shell (so it will not run root's .profile.)

2
  • 1
    In my case I needed alias to do something like asuser git reset --hard. But su - <user> -m -c "git reset --hard" and sudo -u <user> git reset --hard would save my environment and git would try to read current user's git config. So I just wanted to state that sometimes user205705's solution using su - <user> -c "cd pwd; bash" is better.
    – Tony I.
    Aug 29, 2015 at 6:44
  • "Sudo is always better" is the equivalent of "Never jaywalk", except when you are in a small town at 3 at night and there hasn't been a car in sight for 3 hours, you can safely cross the street. Desktop linux systems are usually used by only one person and if that person is technically competent, then there is nothing bad about using su. I am annoyed by people repeating the same "OMG! USE SUDO, you moron!" all the time. Sep 27, 2022 at 14:10
19

I agree that sudo is almost always a better answer but to answer the other part of the question...

The '-' in 'su -' indicates that you want to emulate a superuser login, rather than just run with superuser priviledges.

If you use plain 'su' rather than 'su -' you will stay in the same directory; however you will also be running in the same environment so may need to modify your path to access some admin commands.

13

If you use su without the -, it should keep you in your current directory. -, -l or --login tell su to:

Provide an environment similar to what the user would expect had the user logged in directly.

Or just use sudo, it's got a lot of other advantages. Or ssh keys.

7

If you really want to use su, there is a way to stay in the same directory.

su - <user> -c "cd `pwd`; bash"

What's going on here:

  • su - <user> = login as
  • -c which means "run a command in the new 's shell
  • -c "cd `pwd`" the command we give is to switch to the current direcotory (pwd) - but because we use the backticks, the pwd command is evaluated before we run the su command so that we actually switch to the directory we're in NOW as the old user. The only problem here is that the new shell exits right after running the command, so then we add:
  • -c "cd `pwd`; bash" which means "run bash (new shell) after running the cd command and the bash shell doesn't exit until we log out of it.
3
  • 3
    This is actually the only answer to the question. Good job! Feb 9, 2020 at 12:04
  • Actually, su - [user] -c "cd $(pwd); bash" might be slightly better (change backticks to $()). Feb 9, 2020 at 12:12
  • Any idea why I'm getting bash: cannot set terminal process group (20): Inappropriate ioctl for device and bash: no job control in this shell warnings when using this approach?
    – joe
    Oct 31, 2021 at 9:55
6

You should definitely use sudo.

su -m
-m (-p): do not reset environment variables (generally not recommended)

That will keep you in the folder when you change to root.

Benefits of using sudo

2
  • 1
    I can't see how this is any different from just "su" on it's own, other than possibly not resetting the PATH environment, which is a possible security problem. Jun 17, 2009 at 14:53
  • @DavidPashley for instance, it executes the .bashrc from the outer user, not the root one.
    – phil294
    May 26, 2017 at 3:32
3

Use sudo :). Seriously, you don't need su. 'sudo' is better as you only use it for privileged commands and can help avoid mistakes. You also get accountability.

2

If you use "su" it does an interactive shell. This is the same as "sudo -s". "su -" creates a login shell, which will override the environment. "sudo -i" is the equivilent with sudo. If you are trying to get an interactive shell, you should always use the sudo -i (or su -) form, or it's possible to end up with weird file permissions in a user's home directory.

1

you must modify the source of su to have this job done. there is a chdir call in a procedure of initialize envoironment varibles. comment out those statesments included that call. and now, you can do "su -" but keeps the current directory.

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .