如何检查脚本用户是否具有类似根用户的权限?
我有一个Python脚本,它需要做很多需要管理员权限的事情,比如在/etc目录下移动文件、用apt-get安装软件等等。目前我有:
if os.geteuid() != 0:
exit("You need to have root privileges to run this script.\nPlease try again, this time using 'sudo'. Exiting.")
这样检查是否有权限是最好的方法吗?还有其他更好的做法吗?
10 个回答
19
你可以请求用户提供sudo权限:
import os, subprocess
def prompt_sudo():
ret = 0
if os.geteuid() != 0:
msg = "[sudo] password for %u:"
ret = subprocess.check_call("sudo -v -p '%s'" % msg, shell=True)
return ret
if prompt_sudo() != 0:
# the user wasn't authenticated as a sudoer, exit?
这个sudo -v
命令会更新用户的缓存凭证(可以查看man sudo
了解更多信息)。
94
os.geteuid
用来获取有效的用户 ID,这正是你想要的,所以我想不出更好的方法来进行这样的检查。唯一不确定的地方是标题中的“类似 root”:你的代码检查的是确切的 root
,没有“类似”的意思,实际上我也不知道“类似 root 但不是 root”是什么意思——所以,如果你想表达的意思和“确切的 root”不同,或许可以解释一下,谢谢!
38
根据EAFP(先做再说,问错了再改)的原则:
import errno
try:
os.rename('/etc/foo', '/etc/bar')
except IOError as e:
if e[0] == errno.EPERM:
sys.exit("You need root permissions to do this, laterz!")
如果你担心os.geteuid()
这个函数在不同系统上不能通用,那你可能根本就不应该去碰/etc
这个文件夹。