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!
- Email this to a friend
- Printable version
- Rss Feed
- Last Updated: Jan/6/2008

{ 7 comments… read them below or add one }
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
Nice suggestion, the post has been updated.
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…
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
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.
@ terry
The script works as expected.
@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