AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 15853
Accepted
Malabarba
Malabarba
Asked: 2010-12-03 03:30:53 +0800 CST2010-12-03 03:30:53 +0800 CST 2010-12-03 03:30:53 +0800 CST

脚本如何检查它是否以 root 身份运行?

  • 772

我正在编写一个简单的 bash 脚本,但我需要它来检查它是否以 root 身份运行。我知道可能有一种非常简单的方法可以做到这一点,但我不知道怎么做。

只是要清楚:编写脚本foo.sh
的简单方法是什么,以便命令输出和命令输出?./foo.sh0sudo ./foo.sh1

scripts bash root
  • 11 11 个回答
  • 177482 Views

11 个回答

  • Voted
  1. Best Answer
    aneeshep
    2010-12-03T03:44:36+08:002010-12-03T03:44:36+08:00
    #!/bin/bash
    if [[ $EUID -ne 0 ]]; then
       echo "This script must be run as root" 
       exit 1
    fi
    
    • 226
  2. Lekensteyn
    2011-03-14T01:19:40+08:002011-03-14T01:19:40+08:00

    root 用户不必命名为“root”。whoami返回带有用户 ID 的第一个用户名0。$USER包含登录用户的名称,可以有用户 ID 0,但名称不同。

    检查帐户是否以root身份登录的唯一可靠程序:

    id -u
    

    我使用-u有效的用户ID,而不是真实的-r用户ID。权限由有效用户 ID确定,而不是真实用户 ID 。

    测试

    /etc/passwd0包含按给定顺序具有用户 ID 的以下用户名:

    rootx
    root2
    

    登录为root2,给出下一个结果:

    • whoami:rootx
    • echo $USER:(root2如果程序在空环境中启动,则返回一个空字符串,例如env -i sh -c 'echo $USER')
    • id -u:0 如您所见,其他程序在此检查中失败,仅id -u通过。

    更新后的脚本如下所示:

    #!/bin/bash
    if ! [ $(id -u) = 0 ]; then
       echo "I am not root!"
       exit 1
    fi
    
    • 150
  3. jfs
    2011-03-14T02:26:43+08:002011-03-14T02:26:43+08:00

    正如@Lekensteyn 所说,您应该使用有效的用户ID。你不需要id -u在 bash 中调用:

    #!/bin/bash
    
    if [[ $EUID -ne 0 ]]; then
       echo "You must be root to do this." 1>&2
       exit 100
    fi
    

    @geirha 的评论建议使用算术评估:

    #!/bin/bash
    
    if (( EUID != 0 )); then
       echo "You must be root to do this." 1>&2
       exit 100
    fi
    
    • 39
  4. Nathan Osman
    2011-03-13T23:38:20+08:002011-03-13T23:38:20+08:00

    您可以使用whoami返回当前用户的命令来完成此操作:

    #!/bin/bash
    
    if [ `whoami` != 'root' ]
      then
        echo "You must be root to do this."
        exit
    fi
    
    ...
    

    You must be root to do this.如果当前用户不是,则运行上述将打印root。


    注意:在某些情况下,另一种方法是简单地检查$USER变量:

    if [ $USER != 'root' ]
    
    • 22
  5. Luchostein
    2016-10-13T06:14:45+08:002016-10-13T06:14:45+08:00

    考虑到效率,您可以先测试EUID环境变量,如果不存在,则调用标准id命令:

    if ((${EUID:-0} || "$(id -u)")); then
      echo You are not root.
    else
      echo Hello, root.
    fi
    

    这样,由于OR 快捷方式,您可以避免调用系统命令,优先查询内存中的变量。

    代码复用:

    function amIRoot() {
      ! ((${EUID:-0} || "$(id -u)"))
    }
    
    • 13
  6. João Pinto
    2010-12-03T03:40:10+08:002010-12-03T03:40:10+08:00
    #!/bin/bash
    [[ $(id -u) != 0 ]] 
    echo $?
    
    • 10
  7. Delan Azabani
    2010-12-03T03:35:15+08:002010-12-03T03:35:15+08:00
    #!/bin/bash
    if [ "$(id -u)" == "0" ]
    then
        echo "I am root."
    else
        echo "I am not root."
    fi
    
    • 3
  8. rubo77
    2014-10-17T01:17:17+08:002014-10-17T01:17:17+08:00

    这个片段将:

    • 检查不同的会话
    • 建议使用sudo !!
    • 并返回错误
    if [ "$(whoami &2>/dev/null)" != "root" ] && [ "$(id -un &2>/dev/null)" != "root" ]
          然后
          echo "您必须是 root 才能运行此脚本!"
          回声“使用'sudo !!'”
          1号出口
    菲
    
    • 2
  9. gertas
    2015-10-18T14:00:30+08:002015-10-18T14:00:30+08:00

    这个答案只是为了保存一个想法,可能对你们中的一些人有帮助。如果您需要从桌面 GUI 运行并需要 root 权限的脚本,请尝试以下方式:

    #!/bin/bash
    if ! [ $(id -u) = 0 ]; then
       gksudo -w $0 $@
       exit
    fi
    
    #here go superuser commands, e.g. (switch intel cpu into powersave mode):
    echo 1 > /sys/devices/system/cpu/intel_pstate/no_turbo
    cpupower frequency-set -g powersave
    

    这样你会得到一个很好的对话窗口,询问你 root 用户密码。就像使用命令行 sudo 一样。

    可能在您的gksudo系统中不可用,然后使用sudo apt-get install gksu.

    • 2
  10. alexandre1985
    2016-08-14T13:07:19+08:002016-08-14T13:07:19+08:00

    使脚本只能由 root 运行的一种简单方法是使用以下行启动脚本:
    #!/bin/su root

    • 2

相关问题

  • 如何将必须从其自己的目录中运行的程序添加到面板或主菜单?

  • 根运行emacs

  • 如何编写 shell 脚本来安装应用程序列表?

  • Mac OS X Automator 的替代品?

  • 备份 bash 脚本未压缩其 tarball

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何安装 .run 文件?

    • 7 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    如何获得 CPU 温度?

    • 21 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Marko Smith

    如何使用命令行将用户添加为新的 sudoer?

    • 7 个回答
  • Marko Smith

    更改文件夹权限和所有权

    • 9 个回答
  • Marko Smith

    你如何重新启动Apache?

    • 13 个回答
  • Marko Smith

    如何卸载软件?

    • 11 个回答
  • Marko Smith

    如何删除 PPA?

    • 26 个回答
  • Martin Hope
    NES 如何启用或禁用服务? 2010-12-30 13:03:32 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    Olivier Lalonde 如何在结束 ssh 会话后保持进程运行? 2010-10-22 04:09:13 +0800 CST
  • Martin Hope
    David B 如何使用命令行将用户添加为新的 sudoer? 2010-10-16 04:02:45 +0800 CST
  • Martin Hope
    Hans 如何删除旧内核版本以清理启动菜单? 2010-08-21 19:37:01 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve