"With no extra arguments, as far as I can tell su <username> is exactly the same as attempting to login remotely as that user,"
This is not correct. su does not change the ownership of the pts (tty), so for example you can not run screen after doing that.
I actually have no idea how to change to a different user and also setup the pts properly, so I've resorted to telneting to localhost when I need to do that.
I've changed the permissions of /dev/pts/X in the past to allow anybody to access it. (e.g. sudo chmod o+rw /dev/pts3) This may open up the screen session to others, I've not played around with it enough.
They are not equivalent. `sudo su` changes the values of USER, HOME, and SHELL to that of the root user. `sudo -s` only changes USER (it seems), but HOME is retained as the SUDO_USER's home directory.
Neither invocation changes the working directory, which is convenient.
I use sudo su - <username> pretty regularly when I'm working on servers. I have a dev box where I do initial deploys of all of my apps, and each app has a different username with different configurations to run/debug the app.
sudo su - <username> takes me to the homefolder of the user and allows me to switch without remembering the password for all of the different users. If I need to do some system-level operation, I open a new tab and run the superuser there.
I'm not a sudoer on any box i administrate, and i've apt-get remove'd it from my personal VPSes. It's a little worrying, occasionally you'll run across a shell script that runs sudo for half it's lines and you're not entirely sure why.
Using plain su instead of sudo <command> forces me to enter my password, thereby encouraging a concious decision about whether a command needs to be run as root, and the change in prompt is another reminder to be careful.
The sudo timeout convenience feature is worrisome, but there's no need to remove it entirely from the system [1]. You can set
Defaults timestamp_timeout = 0
in your sudoers file to make sure sudo always prompts for a password. I think this should be default, since the current default of 5 minutes is an easy privilege escalation vector [2].
Also, if you like entering root's password instead of your own, you can set the `runaspw` option.
[1]: Unless you'd like to remove one more possible SUID vulnerability.
[2]: It's far from the only way for a local process to escalate privileges, so I understand it's nothing worth yelling about.
Personally I set the following in /etc/sudoers:
Defaults timestamp_timeout=0,passwd_tries=1
I find not having to enter a password for a certain period of time rather annoying, especially when ssh is lagging or when I am typing without paying much attention. If you so wish, you can also set the option "rootpw" for the above, which will make sudo require the root password.
I also set a small number of specific commands to require no password for sudo, mainly for common things like network configuration and suspending. These are defined for the absolute paths of the executables, and only for my user, so they aren't a security risk.
AFAIK, sudo -s is only if you would like to open a shell as root, not when you would like to open a shell as another user. The original point of the post was about how to create a shell as another user, without needing any password.
Edit: just added the last phrase. "without needing a password".
I've just done some testing, and my sudo (1.7.4p6) does honour NOPASSWD in /etc/sudoers, when I sudo -su to any user. Are you sure your configuration is correct?
No, I'm not sure. I'm using Sudo version 1.7.4p5. sudo su <user> does not prompt for a password. sudo -su <user> and sudo -s -u <user> do prompt for a password.
This is not correct. su does not change the ownership of the pts (tty), so for example you can not run screen after doing that.
I actually have no idea how to change to a different user and also setup the pts properly, so I've resorted to telneting to localhost when I need to do that.