Pau*_*man 64 python privileges root
我有一个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.")
Run Code Online (Sandbox Code Playgroud)
这是检查的最佳方式吗?还有其他最佳做法吗?
Ale*_*lli 64
os.geteuid得到有效的用户ID,这正是你想要的,所以我想不出更好的方法来执行这样的检查.一点不确定的是标题中的"root-like":你的代码完全 检查root,没有关于它的"喜欢",事实上我不知道"root-like而不是root"是什么意思 - 所以如果你的意思不同于"完全根",也许你可以澄清一下,谢谢!
msw*_*msw 27
根据"更容易请求宽恕而不是许可"原则:
try:
os.rename('/etc/foo', '/etc/bar')
except IOError as e:
if (e[0] == errno.EPERM):
print >> sys.stderr, "You need root permissions to do this, laterz!"
sys.exit(1)
Run Code Online (Sandbox Code Playgroud)
如果你担心不可移植性,os.geteuid()你可能不应该捣乱/etc.
jca*_*llo 12
您可以提示用户进行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?
Run Code Online (Sandbox Code Playgroud)
该sudo -v交换机更新用户的缓存的凭据(见图man sudo).
如果您真的希望您的代码在各种Linux配置中都是健壮的,我建议您考虑有人可能正在使用SELinux或文件系统ACL或Linux内核中的"功能"功能的极端情况.因为2.2左右.您的进程可能正在使用SELinux或某些Linux功能库(如libcap2 libcap-ng)或fscaps或elfcap之类的包装器上运行,这些包装通过更为异国情调的东西,如Niels Provos的精彩且令人遗憾的不太受欢迎的systrace系统.
所有这些都是您的代码可能以非root身份运行的方式,但您的流程可能已被委派了必要的访问权限,无需EUID == 0即可执行其工作.
因此,我建议您考虑通过包装由于权限或异常处理代码的其他问题而可能失败的操作来更加Python地编写代码.如果您正在进行各种操作(例如使用subprocess模块),您可以提供所有此类调用的前缀sudo(例如,作为命令行,环境或.rc文件选项).如果它以交互方式运行,您可以提供重新执行任何引发权限相关异常的命令sudo(可选地,只有sudo在os.environ ['PATH']上找到).
总的来说,大多数Linux和UNIX系统的大多数管理仍由"root"特权用户完成.然而,它是老派,作为程序员,我们应该尝试支持更新的模型.尝试操作并让异常处理完成其工作允许您的代码在透明地允许您需要的操作的任何系统下工作,并且知道并准备好使用sudo是一个很好的接触(因为它是迄今为止最普遍的用于受控委托系统特权的工具).
import os
def check_privileges():
if not os.environ.get("SUDO_UID") and os.geteuid() != 0:
raise PermissionError("You need to run this script with sudo or as root.")
Run Code Online (Sandbox Code Playgroud)
SUDO_UID如果脚本未使用 运行,则不可用sudo。
| 归档时间: |
|
| 查看次数: |
41319 次 |
| 最近记录: |