How to: Check the bash shell script is being run by root or not

Sometime it is necessary to find out if a shell script is being run as root user or not.

When user account created a user ID is assigned to each user. BASH shell stores the user ID in $UID variable. Your effective user ID is stored in $EUID variable. You can

Old way...

You can easily add a simple check at the start of a script:

Check the script is being run by root user

#!/bin/bash
# Init
FILE="/tmp/out.$$"
GREP="/bin/grep"
#....
# Make sure only root can run our script
if [ "$(id -u)" != "0" ]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi
# ...

New way: Using EUID

#!/bin/bash
# Init
FILE="/tmp/out.$$"
GREP="/bin/grep"
#....
# Make sure only root can run our script
if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi
# ...

Mount /dev/sdb1 only if you are a root

#!/bin/bash
if [[ $EUID -ne 0 ]]; then
  echo "You must be a root user" 2>&1
  exit 1
else
  mount /dev/sdb1 /mnt/disk2
fi

Updated for accuracy and more examples.

Want to read Linux tips and tricks, but don't have time to check our blog everyday? Subscribe to our daily email newsletter to make sure you don't miss a single tip/tricks. Subscribe to our weekly newsletter here!

{ 7 comments… read them below or add one }

1 Jeff Schroeder 11.12.07 at 6:52 pm

Make error messages go to STDERR (Standard Error) like they do in other Unix programs. That is the best way to do things.

if [ "$(id -u)" != "0" ]; then
echo “This script must be run as root” 2>&1
exit 1
fi

2 vivek 11.12.07 at 8:37 pm

Nice suggestion, the post has been updated.

3 diana 11.16.07 at 10:26 am

may be it was the wrong place to post this.Please help me,
I would like to send mail for each success login.i tried with this,
and place this in /root/.bashrc
#!/bin/bash
echo `last $i | head -1 | awk ‘{print $1″ “$3″ “$4″ “$5″ “$6″ “$7}’`|while read output;
do
echo $output
ip=$(echo $output | awk ‘{print $2}’ )
on=$(echo $output | awk ‘{print $3″ “$4″ “$5}’ )
at=$(echo $output | awk ‘{print $6′} )
echo “User logged in from $ip on $on at $at”|mail -s “Alert: user logged in to server $(hostname) from $ip” ephrondiana@gmail.com
done

but its sending mail for root login only,i need to send mail for users login also.Please help me…

4 Fabio 01.06.08 at 2:07 pm

Hi,
if you want to redirect a message to stderr using echo you have to use “1>&2″ instead of “2>&1″.
For example,

~ >> f(){
> echo “to stdout” 2>&1
> echo “to stderr” 1>&2
> }
~ >> f 2>/dev/null
to stdout #this is printed to stdout
~ >>

bye

5 Terry 08.11.08 at 9:55 pm

I think it’s worth mentioning that $UID & $EUID will not return the desired result if you use sudo to run the script, id -u does however.

6 Arky 03.09.09 at 7:14 am

@ terry

The script works as expected.

7 Laurie 04.15.09 at 3:14 pm

@Diana

You need to put your code into the global .bashrc file, /etc/bashrc. This will become the default .bashrc. Beware though, if you make a user specific bashrc then you need to import the global bashrc

Leave a Comment

You can use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Tagged as: , , ,

Previous post: Can I boot My Linux Server from iSCSI or SAN or NAS network attached storage?

Next post: Bash Shell Completing File, User and Host Names Automatically