What does the 'sudo -s' command do, and how is it used in this example?

The simple answer is it gives you a root shell. That's what it's being used for here. There's a good technical comparison between the su, sudo -i, sudo -s and sudo su methods on Unix.SE but that's really not relevant here. The code could have used any and would have worked.

The help nugget means a few things:

  • It's looking for a command in the $SHELL environment variable. If you run echo $SHELL you'll probably see /bin/bash. That means you'll get a root instance of Bash. I'm sure if you were in zsh it would mean you get a root instance of zsh.

  • If $SHELL is empty, it falls back to the default shell defined in /etc/passwd for that user.

  • If you provide a command (eg sudo -s whoami), it's actually running: sudo /bin/bash -c "whoami"

  • If you don't pass a command, it doesn't pass a -c argument over so you just get an interactive shell.

I've used the phrase "root" several times. By default sudo is all about running things as root but sudo (and su) can run things as other users (if you have permission to do so). I'm only stating this for the pedants who will cry out that sudo -s -u $USER doesn't give them a root shell as I promised -s would above.


And in my humblest of opinions, it's really silly to become root for just two commands, not to mention that it could leave a user accidentally running further commands as root. If you want or need to run something as root, just premend the command with sudo:

sudo apt-get update
sudo apt-get install -y build-essential libtool libcurl4-openssl-dev libncurses5-dev libudev-dev autoconf automake screen

I'd be dubious of any tutorial that suggested getting a root shell, except in the cases where you do have bucketloads of commands to run... And even then, there's scripting.