Varun Madiath
Varun Madiath

Reputation: 3252

Writing a bash script that performs operations that require root permissions

I'm trying to write a bash script that sets up my web development environment in ubuntu. As part of the process of setting up the script, it needs to edit files that are owned by root. It also needs to create fields in the public_html directory of the user that runs the script.

Should I therefore require that the script be run as the superuser? If it should, then how do I get it to access the current user's username? I would normally use the $USER variable, but I can't do that if the script is being run as the superuser. If I'm not the superuser, how can I get the script to request super user privileges for certain operations, while not requiring the user to type in a password for every operation that requires super user privileges.

Thanks

Upvotes: 0

Views: 6175

Answers (6)

Plap
Plap

Reputation: 1056

Insert a check at the top of the script:

# Make sure only root can run this script
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

In this way when you run it without the root privileges you will be prompted, then you can simply rerun it the right way with:

sudo yourscript.sh

More infos at http://www.cyberciti.biz/tips/shell-root-user-check-script.html

Upvotes: 2

pepoluan
pepoluan

Reputation: 6780

In Ubuntu, there's the SUDO_USER environment variable.

So, you can just run your script sudo somescript.sh and have it pull the invoking user's username $SUDO_USER.

Not sure on other dists, though.

Upvotes: 0

K. Norbert
K. Norbert

Reputation: 10674

You can use the -E flag for sudo to preserve the environment variables, or, you can set up sudoers to preserve the environment on a per-command basis.

You can also set up the sudoers file to not ask for a password on a per-command basis, for example, to allow user xy to use smbmount without asking for a password:

xy ALL=NOPASSWD: /usr/bin/smbmount

In your case, it would be enough to just store the current user in a variable before invoking sudo, and use the already saved username:

CURRENT_USER=$USER

sudo yourscript.sh $CURRENT_USER

Then read the username from $1. You can also use the SUDO_USER env variable, which is set to the user who is invoking sudo.

Upvotes: 3

atx
atx

Reputation: 5069

Just make it a setuid file. Or use sudo which is probably safer, since you can limit who gets to run it.

chmod 4755 script.sh

Upvotes: 0

Erik
Erik

Reputation: 91270

If your users have root access anyway, you could just write a script that must be run as root and takes an username as parameter, instead of picking up the username.

Alternatively, one way of picking up the login username in an interactive shell is:

stat -Lc %U /proc/self/fd/0

This retrieves the ovner of the tty associated with stdin.

Upvotes: 0

Vamana
Vamana

Reputation: 578

There's a command named sudo for this purpose. It lets you specify that certain users can run certain commands as root (or another user).

Upvotes: 1

Related Questions