gpt4 book ai didi

python - 使用带有 sudo 的 Python 模块

转载 作者:太空宇宙 更新时间:2023-11-04 10:20:59 24 4
gpt4 key购买 nike

我有一个问题,我想在非 root 用户下运行下面的示例

import os
os.listdir(/home/XYZ/)

spath= /home/XYZ
import os
for roots, dirs, file in os.walk(spath)
for file in files
print ("file = %s" %file)

我知道如果我是 root 用户它会工作但是如果我使用 sudo 在这种情况下成为用户的正确命令是什么

据我所知,如果我输入类似 -- os.listdir("sudo/home/XYZ")

的内容是不正确的

谢谢干杯

最佳答案

这些都是有效的,但它们都需要提升权限,远远超出要求。使用 sudo 执行整个脚本是最简单的也是一个很大的风险特别是如果它在任何端口上监听传入请求/ Hook 。使用 sudoers 允许所有带有或不带 sudo 密码的命令再次带来不必要的风险。

然而,我们有第三种选择来生成一个具有提升权限的子进程,然后可以将其限制为仅允许所需的命令(例如,让它访问 mkdir 而不是 rm, cp, dd, mysqldump, mailx 等,走两界线,提升只有真正需要的东西。现在你应该小心这个,因为允许说 rm 命令而不考虑参数(递归,权限等),但即使这样仍然比执行整个脚本更安全/具有完全根权限的应用程序,可以访问所有内容。

python 代码:

import subprocess
cmd = 'some_command_such_as_ln_or_mkdir'
subprocess.run(cmd, stdin=True, shell=True)

这允许在接受来自 stdin 的输入的 shell 中仅使用 sudo 运行子进程,因此 sudo 可以提示输入密码。如果您在自动化过程中执行此操作,则可以配置 sudoers 以允许您在没有密码的情况下仅运行最少的必需命令。您仍然应该对此保持谨慎,但这至少是我找到的最明智的解决方案。

/etc/sudoers.d/$MY_USER_OR_PROGRAM_NAME 应该看起来像这样:

$USER_PROGRAM_EXECECUTED_BY ALL = ($USER_TO_RUN_ELEVATED_COMMAND_AS) NOPASSWD: $ABSOLUTE_PATH_TO_SOME_COMMAND_SUCH_AS_LN_OR_MKDIR, $ANOTHER_ABSOLUTE_PATH_TO_SOME__OTHER_COMMAND

虽然根据您的用例,您可能被迫将 ($USER_TO_RUN_ELEVATED_COMMAND_AS) 设置为 (root),但您应该首先使用更受限的用户。如果说您需要在由 root 拥有和分组的目录中创建一个目录,您将需要它。如果说您正在 /var/log/ 中创建一个目录并且它由用户/组拥有或分组以允许将日志传送到另一个系统而不需要 root 那么您可以利用该用户相反。

如果您期望任何用户输入给您甚至命令的一部分,您应该小心并查看类似 shlex 的内容以防止 shell 注入(inject):https://docs.python.org/3.5/library/shlex.html#shlex.quote

还有最后一点,如果您不需要从 stdin 读取密码(从未交互使用过),那么您可以删除 stdin=True

关于python - 使用带有 sudo 的 Python 模块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43916745/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com