Php 如何授予www数据用户对python salt模块的访问权限?

Php 如何授予www数据用户对python salt模块的访问权限?,php,python,python-2.7,codeigniter,salt,Php,Python,Python 2.7,Codeigniter,Salt,我正在维护一个小型的遗留php5应用程序(基于CodeIgniter),它充当salt web UI,允许我运行salt命令并安排重复作业。web应用程序运行python脚本,这些脚本调用salt api来执行命令 我面临的问题是,当我尝试循环遍历结果时,python抛出一个UnboundLocalError。有趣的是,这个问题只有在我使用www数据用户运行python脚本时才会发生。如果我使用我的管理员帐户,脚本工作正常 这失败了: sudo su - www-data -s /bin/bas

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

我面临的问题是,当我尝试循环遍历结果时,python抛出一个UnboundLocalError。有趣的是,这个问题只有在我使用www数据用户运行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
起初,我认为这是由于权限不足,但我的visudo文件授予www数据运行该命令的权限:

www-data ALL = NOPASSWD: /usr/bin/python /home/system/update-manager/check_reboot_status.py
我感到困惑的是,错误是围绕一个变量“salt”旋转的,因为我肯定安装了python模块;毕竟,我的管理员帐户可以执行脚本而没有错误。我想知道这是否与执行脚本的shell环境有关。我在网上找不到这方面的信息

我遗漏了什么来尝试或调查?我复制了下面的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主机上启动salt的用户才能运行命令,在本例中为root。最初的问题与所描述的情况不匹配,因为python从来没有访问过该模块,否则会抛出类似“ImportError:没有名为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'>
通过添加导入行(如注释所示),错误得以解决,但另一行取代了它:

salt.exceptions.SaltClientError: Authentication error occurred.
正如“导入和使用LocalClient必须与Salt Master在同一台机器上完成,并且必须使用Salt Master作为[…]运行的同一用户完成。”。
这就是我意识到命令只能与root用户一起运行的地方。

tl;dr:对错误消息的误解。使用带/不带sudo的命令会导致两个不同的python salt模块。根据API文档,只有在salt主机上启动salt的用户才能运行命令,在本例中为root。最初的问题与所描述的情况不匹配,因为python从来没有访问过该模块,否则会抛出类似“ImportError:没有名为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'>
通过添加导入行(如注释所示),错误得以解决,但另一行取代了它:

salt.exceptions.SaltClientError: Authentication error occurred.
正如“导入和使用LocalClient必须与Salt Master在同一台机器上完成,并且必须使用Salt Master作为[…]运行的同一用户完成。”。 这就是我意识到命令只能与root用户一起运行的地方