gpt4 book ai didi

python - 如何授予 www-data 用户访问 python salt 模块的权限?

转载 作者:太空宇宙 更新时间:2023-11-03 21:14:40 24 4
gpt4 key购买 nike

我正在维护一个小型遗留 php5 应用程序(基于 CodeIgniter),它充当 salt Web UI,允许我运行 salt 命令并安排重复作业。 Web 应用程序运行 python 脚本,调用 salt api 来执行命令。

我面临的问题是,当我尝试循环结果时,python 会抛出 UnboundLocalError 。有趣的是,这个问题仅在我使用 www-data 用户运行 python 脚本时发生。如果我使用我的管理员帐户,该脚本可以正常工作。

失败:

sudo su - www-data -s /bin/bash -c '/usr/bin/python /home/system/update-manager/check_reboot_status.py'

Traceback (most recent call last):
File "/home/system/update-manager/check_reboot_status.py", line 43, in <module>
main()
File "/home/system/update-manager/check_reboot_status.py", line 34, in main
for r in returns:
File "/usr/lib/python2.7/dist-packages/salt/client/__init__.py", line 563, in cmd_batch
salt.utils.versions.warn_until(
UnboundLocalError: local variable 'salt' referenced before assignment

这工作正常:

sudo /usr/bin/python /home/system/update-manager/check_reboot_status.py
2019-02-21 12:12:04,456 INFO Started the check reboot status script...
2019-02-21 12:12:22,144 INFO Updated the 'Reboot Status' of 92 minions.
2019-02-21 12:12:22,144 INFO End of the check reboot status script.

最初,我认为这是由于权限不足造成的,但是我的 visudo 文件授予 www-data 运行该命令的权限:

www-data ALL = NOPASSWD: /usr/bin/python /home/system/update-manager/check_reboot_status.py

我很困惑,错误与变量“salt”有关,因为我确信 python 模块已安装;毕竟我的管理员帐户可以毫无错误地执行脚本。我想知道这是否与执行脚本的shell环境有关。我在 php doc 中找不到相关信息。

我遗漏了什么来尝试或调查?我复制了下面的python和php代码以供引用。

PHP 脚本:

$script = '/home/system/update-manager/check_reboot_status.py';

shell_exec('sudo /usr/bin/python ' . $script . '> /home/system/update-manager/logs/check_reboot_status.log 2>&1 &');

Python代码

import salt.client
local = salt.client.LocalClient()

linux = 'G@os:Ubuntu'

# Linux minions
cmd = '[ -f /var/run/reboot-required ] && echo 1 || echo 0'
returns = local.cmd_batch(linux, 'cmd.run', [cmd], bat='1', expr_form='compound')

for r in returns:
count += 1
for minion, reboot_required in r.iteritems():
umb.change_reboot_status(minion, reboot_required)

最佳答案

tl;dr:对错误消息的误解。使用带/不带 sudo 的命令会导致两个不同的 python salt 模块。根据 API 文档,只有在 salt-master 上启动 salt 的用户才能运行命令,在本例中为:root。最初的问题与描述的情况不符,因为 python 从来没有访问该模块的权限,否则会抛出“ImportError: No module named salt”之类的错误。

存在隐藏实际问题的权限问题。

首先我发现使用这两个命令运行 python 使用了两个不同的文件来加载:

$ sudo python
>>> import salt.client
>>> salt.client
<module 'salt.client' from' /home/support/.local/lib/python2.7/site-packages/salt/client/__init__.pyc'>

sudo runuser -l www-data -s /bin/bash -c '/usr/bin/python
>>> import salt.client
>>> salt.client
<module 'salt.client' from '/usr/lib/python2.7/dist-packages/salt/client/__init__.pyc'>

堆栈跟踪显示错误来自以下 block :“salt.utils.versions.warn_until()”引发了问题中显示的 salt 错误,即使该包是在文件开头导入的。

#/usr/lib/python2.7/dist-packages/salt/client/__init__.py
if 'expr_form' in kwargs:
#import salt.utils.versions
---> salt.utils.versions.warn_until(
'Fluorine',
'The target type should be passed using the \'tgt_type\' '
'argument instead of \'expr_form\'. Support for using '
'\'expr_form\' will be removed in Salt Fluorine.'
)
tgt_type = kwargs.pop('expr_form')

import salt.cli.batc

通过添加导入行(如注释中所示),错误已得到解决,但是,另一个错误取代了它:

salt.exceptions.SaltClientError: Authentication error occurred.

作为documentation声明“导入和使用 LocalClient 必须在与 Salt Master 相同的计算机上完成,并且必须使用与 Salt Master 运行相同的用户来完成。[...])。”。这是我意识到这些命令只能用 root 用户运行的地方。

关于python - 如何授予 www-data 用户访问 python salt 模块的权限?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54805995/

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