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

Tom*_*ime 28 linux unix sudo

我有一个程序,如果它在“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 :-)
Run Code Online (Sandbox Code Playgroud)

Tom*_*ime 49

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

$ sudo env |grep SUDO
SUDO_COMMAND=/usr/bin/env
SUDO_USER=tal
SUDO_UID=501
SUDO_GID=20
Run Code Online (Sandbox Code Playgroud)

请注意,这些可以通过简单地设置来伪造。不要因为任何重要的事情而相信他们。

例如:在这个程序中,我们需要告诉用户运行一些其他程序。如果当前一个是用 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
Run Code Online (Sandbox Code Playgroud)

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

  • @Kevin 如果有人在他们的环境中伪造自己的特权,那么他们希望知道自己在做什么并且会接受后果。 (3认同)
  • 我会用什么来表示“任何重要的事情”? (2认同)

Val*_*ity 11

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

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

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

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

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


Bil*_*hor 7

有两种机制可以使用。

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

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