我有一个程序,如果它在“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 :-)
是的,程序在 sudo 下运行时设置了 4 个环境变量:
请注意,这些可以通过简单地设置来伪造。不要在任何关键的事情上相信他们。
例如:在这个程序中,我们需要告诉用户运行其他程序。如果当前一个是用 sudo 运行的,那么另一个也是。
请注意,它只测试 SUDO_* 变量,前提是它可以首先证明它是以 root 身份运行的。即使这样,它也只使用它来更改一些有用的文本。
这并没有直接回答这个问题,但我认为这里没有提出正确的问题。在我看来,提问者想要一个程序,如果它是否具有某些权限,它的行为可能会有所不同,但是我认为检查 sudo 不是这样做的方法。首先,许多系统可能没有实现“sudo”,在 Linux 或许多 Unix 上绝不需要它。
例如,用户可能已经以 root 身份登录,这使得 sudo 变得毫无意义,或者系统可能有非 root 用户,他们仍然有能力执行程序可能希望执行的管理任务。最后,也许系统根本没有 root 或 sudo,而是使用具有不同功能的强制访问控制系统,并且没有捕获所有超级用户来 sudo 进入。或者用户可能会被 sudo,但出于安全原因进入一个比他们自己的帐户权限更少的帐户(我经常使用一个临时的非特权用户运行不受信任的代码,该用户只能写入 ramdisk 以删除,而不是提高我的权限)。假设一个特定的权限模型(如 sudo 或 root 的存在)或假设一个 sudoed 用户具有任何特定权限,总体上是一个坏主意。
如果你想知道你是否有权限执行一个操作,最好的方法通常是简单地尝试去做,然后检查 errno 是否有权限问题,如果它失败,或者它是一个必须全部失败或全部成功的多阶段操作您可以检查一个操作是否可以使用诸如 POSIX访问功能之类的功能(如果正在主动更改权限,请注意此处可能存在的竞争条件)
此外,如果您需要了解 sudo 背后的真实用户,您可以使用getlogin函数,该函数适用于与底层终端的任何交互式会话,并允许您例如查找谁“真正”运行审计命令或查找用于保存日志的真实用户的主目录。
最后,如果您真正想要的是找出用户是否具有 root 访问权限(仍然是一个坏主意,但实现较少),您可以使用getuid来检查 uid 是否为 0,从而检查是否为 root。
有两种机制可以使用。
growisofs
不喜欢在 SUDO 下运行,所以我在使用它的脚本中取消设置 SUDO 变量。它可以用另一种方式伪造。(对于在 at 和 batch 命令下运行的脚本,SUDO 变量也被带入环境。)检查您是否以适当的用户身份运行更为常见。该
id
命令可用于执行此操作。TomOnTime 的脚本使用该id
命令来确定是否sudo
可能需要运行下一个命令。您可以比较有效用户 ID 与真实用户 ID。
这并不严格意味着它正在运行 undo sudo(也可以是 setuid'd),而是表明该程序拥有比用户预期更多的权限。(例如在一个程序中,该程序通常在没有此类权限的情况下执行,但在安装或安装更新期间需要与它们一起运行。然后,您可以使用它来提供一些警告反馈)。
您可以检查有效的 UID (EUID) 变量,如下所示:
您可以先触摸一个文件,
/root
然后再触摸if -e
它。如果 -e 为真,rm
(检查错误代码)它,以便您的测试下次工作。在 rm 之后检查错误代码(或返回代码)可以防止有人轻易使用 sudo 权限来创建文件来对您进行恶作剧。
我发现这很适合这个