我有一个程序,如果它正在“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个环境variables被设置:
$ 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
请注意,如果它能首先certificate它是以root身份运行,那么它只会testing一个SUDO_ *variables。 即使这样,它也只是用它来改变一些有用的文字。
这不直接回答这个问题,但我不认为正确的问题在这里被问到。 在我看来,提问者想要一个行为不同的程序,假设它有一定的权限,但是我认为检查sudo不是这样做的方法。 首先,许多系统可能不会实现“sudo”,但在Linux或许多Unix上并不需要。
例如,用户可能已经以root身份login,使sudo变得荒谬,或者系统可能拥有非root用户,他们仍然有能力执行程序可能希望执行的pipe理任务。 最后也许系统根本没有root或者sudo,而是使用一个具有不同function的强制访问控制系统,并且没有捕获所有的超级用户。 或者用户可以被sudoed,但是由于安全原因,进入一个拥有比他们自己帐户更less的权限的帐户(我经常运行不受信任的代码,只能写入ramdisk以便删除,而不会提高我的权限)。 假设特定的权限模型(如sudo或root的存在)或者假定某个特定用户具有任何特定的特权是一个坏主意。
如果你想知道你是否有权限执行某个操作,那么最好的办法通常就是试着去做,然后在错误的情况下检查errno是否存在权限问题,或者如果是多级操作,那么必须全部失败或者全部成功你可以检查一个操作是否可以像POSIX 访问函数那样工作(如果权限正在被改变,要小心这里可能存在的竞争条件)
如果您还需要了解sudo后面的真实用户,您可以使用getlogin函数,该函数应该可以用于与底层terminal进行任何交互式会话,并允许您例如查找谁正在运行审计命令或查找真实用户的主目录保存日志。
最后,如果你真正想要的是找出一个用户是否具有root访问权限(还是一个坏主意,但具体实现较less),则可以使用getuid来检查uid是否为root,
有两种机制可以使用。
growisofs
不喜欢在SUDO下运行,所以我在脚本中取消了SUDOvariables。 这可能是另一种方式伪造的。 (SUDOvariables也被带到at和batch命令下运行的脚本环境中。) 检查您是否以适当的用户身份运行比较常见。 id
命令可以用来做到这一点。 TomOnTime的脚本使用id
命令来确定是否可能需要使用sudo
来运行下一个命令。
您可以比较有效与真实用户ID。
这并不严格意味着它正在运行undo sudo(也可以是setuid'd),但是表示程序拥有比用户期望的更多的权限。 (例如,在没有这些权限的情况下正常执行的程序,但是在安装过程中需要与它们一起运行或者安装更新程序),然后,可以使用它来提供一些有关警告的反馈。
您可以检查有效的UID(EUID)variables,如下所示:
if [[ $EUID -eq 0 ]]; then echo "running as root" else echo "not running as root" fi
你可以触摸/root
的文件,然后if -e
它。 如果-e是真的, rm
(检查错误代码),那么下次你的testing工作。
在rm之后检查错误代码(或者返回代码)可以防止某人轻易地使用sudo权力来创build文件来恶作剧。
我发现这个效果很好
[ $(cat /proc/$PPID/loginuid) -ne 0 ] && [ "$USER" == "root" ]