Python脚本认证以root身份运行

16

我正在用Python在Linux系统级别上进行项目开发。因此,如果我以普通用户身份运行代码并访问系统文件,则需要根权限,那么我该如何提示输入根密码,并以超级用户身份继续运行代码呢?

我想知道如何在提示输入密码后以超级用户身份运行Python脚本。

任何帮助将不胜感激。 提前感谢您的帮助。

2个回答

31

另外一个做法是让你的脚本自动以超级用户身份运行,如果它没有作为root执行:

import os
import sys

euid = os.geteuid()
if euid != 0:
    print "Script not started as root. Running sudo.."
    args = ['sudo', sys.executable] + sys.argv + [os.environ]
    # the next line replaces the currently-running process with the sudo
    os.execlpe('sudo', *args)

print 'Running. Your euid is', euid

输出:

Script not started as root. Running sudo..
[sudo] password for bob:
Running. Your euid is 0

使用sudo -k进行测试,以清除sudo的时间戳,这样下次运行脚本时就需要再次输入密码。


如果应用程序有GUI(我假设是这样,因为问题标记了pygtk),则应该使用gksudo。然而,对于支持它的操作系统来说,更好的选择是使用PolicyKit。 - João Neves
1
我更喜欢使用原始异常而不是这种提升策略。 - Jakob Bowyer
1
我认为这种技术在正确的情境下是可以接受的。如果他正在创建一个基于GUI的安装程序,需要root权限执行某些操作,那么它可以启动适当的对话框来提醒用户并获取root权限。以Mac OS为例,软件安装大多是由GUI驱动的,大多数用户可能不知道CLI的存在。在这种情况下引发异常不是一个选择。 - samplebias
2
这个解决方案确实涉及以根权限重新启动脚本(而不是给运行脚本的同一实例根权限),以防有人感到好奇。 - Brōtsyorfuzthrāx

6
import os
euid = os.geteuid() 
if euid != 0:
  raise EnvironmentError, "need to be root"
  exit()

这不会在脚本运行过程中提示用户,而是强制用户使用sudo或root重新运行它。


好的,我明白了,但是如果我想要验证用户以超级用户身份运行它怎么办?我不想在没有密码的情况下给他SU权限。使用上面的代码可以提示输入密码,但是如何确定输入的密码是否正确,如果正确,如何以SU身份运行我的进一步代码。请注意,我想在运行时为普通用户执行此操作。 - user636424
让sudo/su来处理密码的正确获取,检查EUID是否为0,然后你就知道它起作用了。@samplebias展示了如何在继续同一程序的同时完成它,而我的答案则强制用户以root身份重新调用脚本。 - loosecannon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接