How to check if running as root in a bash script

前端 未结 17 744
太阳男子
太阳男子 2020-12-04 04:44

I\'m writing a script that requires root level permissions, and I want to make it so that if the script is not run as root, it simply echoes \"Please run as root.\" and exit

相关标签:
17条回答
  • 2020-12-04 05:26

    In this answer, let it be clear, I presume the reader is able to read bash and POSIX shell scripts like dash.

    I believe there is not much to explain here since the highly voted answers do a good job of explaining much of it.

    Yet, if there is anything to explain further, don't hesitate to comment, I will do my best filling the gaps.


    Optimized all-round solution for performance and reliability; all shells compatible

    New solution:

    # bool function to test if the user is root or not
    is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
    

    Benchmark (save to file is_user_root__benchmark)

    #+------------------------------------------------------------------------------+
    #|                           is_user_root() benchmark                           |
    #|                  "Bash is fast while Dash is slow in this"                   |
    #|                          Language: POSIX shell script                        |
    #|                        Copyright: 2020 Vlastimil Burian                      |
    #|                      M@il: info[..]vlastimilburian[..]cz                     |
    #|                               License: GPL 3.0                               |
    #|                                 Version: 1.1                                 |
    #+------------------------------------------------------------------------------+
    
    readonly iterations=10000
    
    # intentionally, the file does not have executable bit, nor it has no shebang
    # to use it, just call the file directly with your shell interpreter like:
    
    # bash is_user_root__benchmark
    # dash is_user_root__benchmark
    
    is_user_root () { [ ${EUID:-$(id -u)} -eq 0 ]; }
    
    print_time   () { date +"%T.%2N"; }
    print_start  () { printf '%s' 'Start  : '; print_time; }
    print_finish () { printf '%s' 'Finish : '; print_time; }
    
    printf '%s\n' '___is_user_root()___'; print_start
                       
    i=1; while [ $i -lt $iterations ]; do
        is_user_root
        i=$((i + 1))
    done; print_finish
    

    Examples of use and duration:

    $ dash is_user_root__benchmark 
    ___is_user_root()___
    Start  : 03:14:04.81
    Finish : 03:14:13.29
    
    $ bash is_user_root__benchmark 
    ___is_user_root()___
    Start  : 03:16:22.90
    Finish : 03:16:23.08
    


    Explanation

    Since it is multitude times faster to read the $EUID standard bash variable, the effective user ID number, than executing id -u command to POSIX-ly find the user ID, this solution combines both into a nicely packed function. If, and only if, the $EUID is for any reason not available, the id -u command will get executed, ensuring we get the proper return value no matter the circumstances.


    Why I post this solution after so many years the OP has asked

    Well, if I see correctly, there does seem to be a missing piece of code above.

    You see, there are many variables which have to be taken into account, and one of them is combining performance and reliability.


    Portable POSIX solution + Example of usage of the above function

    #!/bin/sh
    
    # bool function to test if the user is root or not (POSIX only)
    is_user_root() { [ "$(id -u)" -eq 0 ]; }
    
    if is_user_root; then
        echo 'You are the almighty root!'
        exit 0 # implicit, here it serves the purpose to be explicit for the reader
    else
        echo 'You are just an ordinary user.' >&2
        exit 1
    fi
    

    Conclusion

    As much as you possibly don't like it, the Unix / Linux environment has diversified a lot. Meaning there are people who like bash so much, they don't even think of portability (POSIX shells). Others like me prefer the POSIX shells. It is nowadays a matter of personal choice and needs.

    0 讨论(0)
  • 2020-12-04 05:30

    Check if you are root and quit if you are not:

    if ((EUID != 0)); then
        echo "Root or Sudo  Required for script ( $(basename $0) )"
        exit
    fi
    

    Or in this example, try to create a directory in root location then try after rights were elevated.

    Check if you are root and if not elevate if possible :

    # Fails to create these dirs (needs sudo)
    mkdir /test-dir-$(basename $0)
    rmdir /test-dir-$(basename $0)
    
    if ((EUID != 0)); then
        echo "Granting root privileges for script ( $(basename $0) )"
        if [[ -t 1 ]]; then
            sudo "$0" "$@"
        else
            exec 1> output_file
            gksu "$0" "$@"
        fi
        exit
    fi
    echo "Root privileges granted..."
    # Creates Dirs as it now has rights
    mkdir /test-dir-$(basename $0)
    rmdir /test-dir-$(basename $0)
    
    0 讨论(0)
  • 2020-12-04 05:31

    try the following code:

    if [ "$(id -u)" != "0" ]; then
        echo "Sorry, you are not root."
        exit 1
    fi
    

    OR

    if [ `id -u` != "0" ]; then
        echo "Sorry, you are not root."
        exit 1
    fi
    
    0 讨论(0)
  • 2020-12-04 05:31

    As far as I know the correct way to check it is:

    if [ $(id -u) = "0" ]; then
        echo "You are root"
    else
        echo "You are NOT root"
    fi
    

    See "Testing For Root" section here:

    http://linuxcommand.org/lc3_wss0080.php

    0 讨论(0)
  • 2020-12-04 05:32

    Very simple way just put:

    if [ "$(whoami)" == "root" ] ; then
        # you are root
    else
        # you are not root
    fi
    

    The benefit of using this instead of id is that you can check whether a certain non-root user is running the command, too; eg.

    if [ "$(whoami)" == "john" ] ; then
        # you are john
    else
        # you are not john
    fi
    
    0 讨论(0)
  • 2020-12-04 05:33

    0- Read official GNU Linux documentation, there are many ways to do it correctly.

    1- make sure you put the shell signature to avoid errors in interpretation:

     #!/bin/bash
    

    2- this is my script

    #!/bin/bash 
    
    if [[ $EUID > 0 ]]; then # we can compare directly with this syntax.
      echo "Please run as root/sudo"
      exit 1
    else
      #do your stuff
    fi
    
    0 讨论(0)
提交回复
热议问题