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
    • 最新
    • 标签
主页 / server / 问题 / 568627
Accepted
TomOnTime
TomOnTime
Asked: 2014-01-21 14:12:21 +0800 CST2014-01-21 14:12:21 +0800 CST 2014-01-21 14:12:21 +0800 CST

程序可以告诉它是在 sudo 下运行的吗?

  • 772

我有一个程序,如果它在“sudo”下运行,它的行为应该不同。有没有办法确定它是否在 sudo 下运行?

更新:有人问我为什么要这样做。在这种情况下,在使用 MacPorts 的 Mac 上会有输出告诉您剪切和粘贴特定命令。如果 MacPorts 命令使用“sudo”运行,它应该在示例命令中包含 sudo:

$ sudo port selfupdate 
--->  Updating MacPorts base sources using rsync
MacPorts base version 2.2.1 installed,
MacPorts base version 2.2.1 downloaded.
--->  Updating the ports tree
--->  MacPorts base is already the latest version

The ports tree has been updated. To upgrade your installed ports, you should run
  port upgrade outdated

^^^^^^^^^ it would be really sweet if it output "sudo port upgrade outdated" instead.  It would be even better if it just did it for you :-)
linux
  • 7 7 个回答
  • 14802 Views

7 个回答

  • Voted
  1. Best Answer
    TomOnTime
    2014-01-21T14:12:21+08:002014-01-21T14:12:21+08:00

    是的,程序在 sudo 下运行时设置了 4 个环境变量:

    $ sudo env |grep SUDO
    SUDO_COMMAND=/usr/bin/env
    SUDO_USER=tal
    SUDO_UID=501
    SUDO_GID=20
    

    请注意,这些可以通过简单地设置来伪造。不要在任何关键的事情上相信他们。

    例如:在这个程序中,我们需要告诉用户运行其他程序。如果当前一个是用 sudo 运行的,那么另一个也是。

    #!/bin/bash
    
    echo 'Thank you for running me.'
    
    if [[ $(id -u) == 0 ]]; then
      if [[ -z "$SUDO_COMMAND" ]]; then
        echo 'Please now run: next_command'
      else
        echo 'Please now run: sudo next_command'
      fi
    else  echo 'Error: Sadly you need to run me as root.'
      exit 1
    fi
    

    请注意,它只测试 SUDO_* 变量,前提是它可以首先证明它是以 root 身份运行的。即使这样,它也只使用它来更改一些有用的文本。

    • 52
  2. Vality
    2014-01-22T02:57:43+08:002014-01-22T02:57:43+08:00

    这并没有直接回答这个问题,但我认为这里没有提出正确的问题。在我看来,提问者想要一个程序,如果它是否具有某些权限,它的行为可能会有所不同,但是我认为检查 sudo 不是这样做的方法。首先,许多系统可能没有实现“sudo”,在 Linux 或许多 Unix 上绝不需要它。

    例如,用户可能已经以 root 身份登录,这使得 sudo 变得毫无意义,或者系统可能有非 root 用户,他们仍然有能力执行程序可能希望执行的管理任务。最后,也许系统根本没有 root 或 sudo,而是使用具有不同功能的强制访问控制系统,并且没有捕获所有超级用户来 sudo 进入。或者用户可能会被 sudo,但出于安全原因进入一个比他们自己的帐户权限更少的帐户(我经常使用一个临时的非特权用户运行不受信任的代码,该用户只能写入 ramdisk 以删除,而不是提高我的权限)。假设一个特定的权限模型(如 sudo 或 root 的存在)或假设一个 sudoed 用户具有任何特定权限,总体上是一个坏主意。

    如果你想知道你是否有权限执行一个操作,最好的方法通常是简单地尝试去做,然后检查 errno 是否有权限问题,如果它失败,或者它是一个必须全部失败或全部成功的多阶段操作您可以检查一个操作是否可以使用诸如 POSIX访问功能之类的功能(如果正在主动更改权限,请注意此处可能存在的竞争条件)

    此外,如果您需要了解 sudo 背后的真实用户,您可以使用getlogin函数,该函数适用于与底层终端的任何交互式会话,并允许您例如查找谁“真正”运行审计命令或查找用于保存日志的真实用户的主目录。

    最后,如果您真正想要的是找出用户是否具有 root 访问权限(仍然是一个坏主意,但实现较少),您可以使用getuid来检查 uid 是否为 0,从而检查是否为 root。

    • 11
  3. BillThor
    2014-01-21T17:54:46+08:002014-01-21T17:54:46+08:00

    有两种机制可以使用。

    • 检查环境变量可以通过任何一种方式伪造,但这是最容易做到的。 growisofs不喜欢在 SUDO 下运行,所以我在使用它的脚本中取消设置 SUDO 变量。它可以用另一种方式伪造。(对于在 at 和 batch 命令下运行的脚本,SUDO 变量也被带入环境。)
    • 查看您是否在 sudo 下运行的另一种方法是从父进程中遍历进程列表以查找 sudo。很难隐藏您以这种方式在 sudo 下运行,但更复杂。仍然可以假装您在 sudo 下运行。

    检查您是否以适当的用户身份运行更为常见。该id命令可用于执行此操作。TomOnTime 的脚本使用该id命令来确定是否sudo可能需要运行下一个命令。

    • 7
  4. blabla999
    2014-01-22T03:47:49+08:002014-01-22T03:47:49+08:00

    您可以比较有效用户 ID 与真实用户 ID。

    这并不严格意味着它正在运行 undo sudo(也可以是 setuid'd),而是表明该程序拥有比用户预期更多的权限。(例如在一个程序中,该程序通常在没有此类权限的情况下执行,但在安装或安装更新期间需要与它们一起运行。然后,您可以使用它来提供一些警告反馈)。

    • 2
  5. Eliran Malka
    2015-05-21T01:28:54+08:002015-05-21T01:28:54+08:00

    您可以检查有效的 UID (EUID) 变量,如下所示:

    if [[ $EUID -eq 0 ]]; then
        echo "running as root"
    else
        echo "not running as root"
    fi
    
    • 2
  6. Krista K
    2014-01-21T22:36:33+08:002014-01-21T22:36:33+08:00

    您可以先触摸一个文件,/root然后再触摸if -e它。如果 -e 为真,rm(检查错误代码)它,以便您的测试下次工作。

    在 rm 之后检查错误代码(或返回代码)可以防止有人轻易使用 sudo 权限来创建文件来对您进行恶作剧。

    • -1
  7. ruckc
    2015-10-02T07:47:12+08:002015-10-02T07:47:12+08:00

    我发现这很适合这个

    [ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]
    
    • -2

相关问题

  • Linux 主机到主机迁移

  • 如何在 Linux 机器上找到有关硬件的详细信息?

  • 如何在 Linux 下监控每个进程的网络 I/O 使用情况?

  • 在 RHEL4 上修改 CUPS 中的现有打印机设置

  • 为本地网络中的名称解析添加自定义 dns 条目

Sidebar

Stats

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

    新安装后 postgres 的默认超级用户用户名/密码是什么?

    • 5 个回答
  • Marko Smith

    SFTP 使用什么端口?

    • 6 个回答
  • Marko Smith

    命令行列出 Windows Active Directory 组中的用户?

    • 9 个回答
  • Marko Smith

    什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同?

    • 3 个回答
  • Marko Smith

    如何确定bash变量是否为空?

    • 15 个回答
  • Martin Hope
    Tom Feiner 如何按大小对 du -h 输出进行排序 2009-02-26 05:42:42 +0800 CST
  • Martin Hope
    Noah Goodrich 什么是 Pem 文件,它与其他 OpenSSL 生成的密钥文件格式有何不同? 2009-05-19 18:24:42 +0800 CST
  • Martin Hope
    Brent 如何确定bash变量是否为空? 2009-05-13 09:54:48 +0800 CST
  • Martin Hope
    cletus 您如何找到在 Windows 中打开文件的进程? 2009-05-01 16:47:16 +0800 CST

热门标签

linux nginx windows networking ubuntu domain-name-system amazon-web-services active-directory apache-2.4 ssh

Explore

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

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve