How to check if running as root in a bash script

前端 未结 17 775
太阳男子
太阳男子 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.

提交回复
热议问题