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
    • 最新
    • 标签
主页 / unix / 问题 / 777552
Accepted
Jay Taylor
Jay Taylor
Asked: 2024-06-02 01:20:49 +0800 CST2024-06-02 01:20:49 +0800 CST 2024-06-02 01:20:49 +0800 CST

检查当前用户是否可以在不需要密码的情况下运行 sudo

  • 772

我想检查运行 BASH shell 脚本的当前用户是否有权使用无密码 sudo。如果没有,我宁愿让脚本退出,而不是提示他们输入密码。

linux
  • 2 2 个回答
  • 4328 Views

2 个回答

  • Voted
  1. Best Answer
    terdon
    2024-06-02T07:10:10+08:002024-06-02T07:10:10+08:00

    如果您只想检查用户是否有权无密码 sudo访问,那么您只需运行即可sudo -n。来自man sudo:

           -n, --non-interactive
                   Avoid prompting the user for input of any kind.   If  a
                   password  is required for the command to run, sudo will
                   display an error message and exit.
    
    

    这意味着sudo -n除非用户可以不输入密码运行,否则只会返回错误sudo。更复杂的例子是SUDO_ASKPASS确定用户是否有权限运行sudo,检查是否无密码sudo更简单。您可以执行以下操作:

    if sudo -n true 2>/dev/null; then
      echo "user can run passwordless sudo" 
    else
      echo "user cannot run passwordless sudo" 
    fi
    

    甚至

    sudo -n true 2>/dev/null && 
      echo "user can run passwordless sudo" || 
        echo "user cannot run passwordless sudo" 
    

    或者,在脚本中,如果您只是想退出:

    sudo -n true 2>/dev/null || exit 1
    

    当然,这仅检查用户当前是否可以运行sudo无密码命令。它不区分已经通过身份验证且在超时内的用户(sudo因此不会提示输入密码)和通常被授予无需密码即可运行所有命令权限的用户。我认为这是所需的行为,因为问题中没有提到相反的内容,并且 OP 自己的答案以相同的方式工作。如果您只想检查完全无密码sudo,您可以预先运行sudo -k以清除当前凭据:

    $ sudo -k; sudo -n true 2>/dev/null && 
      echo "user can run passwordless sudo" || 
        echo "user cannot run passwordless sudo" 
    

    现在,正如@Kamil Maciorowski在评论中提到的那样,如果用户可能被授予无密码sudo访问/usr/bin/true权限,则此操作将失败。为了防止这种情况,您可以改为执行以下操作:

    ln -sf /usr/bin/true /tmp/ && sudo -n /tmp/true 2>/dev/null &&   
        echo "user can run passwordless sudo" ||     
          echo "user cannot run passwordless sudo" 
    rm /tmp/true
    

    /tmp/true在这里,通过创建指向的符号链接/usr/bin/true,即使/usr/bin/true设置为使用无密码运行,这也将起作用sudo。现在,如果我们有点偏执,理论上可能有人也设置/tmp/true为使用无密码运行sudo。为了防范这种不太可能发生的情况,您可以执行以下操作:

    rand=$(mktemp /tmp/true.XXXXX); cp /usr/bin/true "$rand" &&
      sudo -n "$rand" 2>/dev/null &&   
        echo "user can run passwordless sudo" ||     
          echo "user cannot run passwordless sudo" 
    rm "$rand"
    

    在这里,我们将/usr/bin/true(在我的系统上这是一个很小的 ​​27K 文件) 复制到/tmp具有随机名称 (保证不存在) 的目录中,然后使用该名称进行检查。虽然理论上仍有可能有人随机将该特定字符串添加到sudoers,但这种可能性非常小,我认为可以安全地忽略它们。

    • 26
  2. Jay Taylor
    2024-06-02T01:27:00+08:002024-06-02T01:27:00+08:00

    我已经在一些主要的 Linux 发行版(如 Debian、Redhat 和 Oracle Enterprise Linux 7)的 BASH 中测试了这一点。此技术在 FreeBSD 或任何 BSD(包括 macOS)下不起作用。

    if SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; then
        echo 'Current user has access to passwordless sudo'
    else
        echo 'Current user DOES NOT have access to passwordless sudo'
    fi
    

    这利用了尝试使用另一个程序来验证密码askpass的选项。通过将其设置为,将根据用户是否可以运行无密码命令返回两个标准响应之一。sudo/bin/falsesudo

    测试用例

    测试用例矩阵如下:

    案例 1. 具有无密码 sudo 权限的用户

    terd1@host $ SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; echo $?
    0
    

    案例 2. 用户具有 sudo 权限但需要密码

    terd2@host $ SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; echo $?
    1
    

    案例 3. 没有任何 sudo 权限的用户

    terd3@host $ SUDO_ASKPASS=/bin/false sudo -A true 1>/dev/null 2>&1; echo $?
    1
    

    如果返回代码为 0,则用户可以运行无密码sudo命令;如果返回代码非零(例如 1),则表示用户无权访问。

    ps 感谢 terdon 为这个答案提供了起点:https://unix.stackexchange.com/a/692109/22709

    • 3

相关问题

  • 有没有办法让 ls 只显示某些目录的隐藏文件?

  • 使用键盘快捷键启动/停止 systemd 服务 [关闭]

  • 需要一些系统调用

  • astyle 不会更改源文件格式

  • 通过标签将根文件系统传递给linux内核

Sidebar

Stats

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

    模块 i915 可能缺少固件 /lib/firmware/i915/*

    • 3 个回答
  • Marko Smith

    无法获取 jessie backports 存储库

    • 4 个回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    user12345 无法获取 jessie backports 存储库 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl 为什么大多数 systemd 示例都包含 WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve