Python和PHP并不合作,只有很小的一部分正在被解析


Python and PHP not playing ball, only very small part is being parsed

所以我目前正在对WiFi网络进行Python脚本扫描,并打印出结果:

from subprocess import check_output
scanoutput = check_output(["iwlist", "wlan0", "scan"])
print '<select name="ssid">'
for line in scanoutput.split("'n"):
        line = line.strip()
        if line.startswith("ESSID:"):
                line=line[7:-1]
                print '<option value="' + line + '">' + line + </option>'
print "</select>"

当我在SSH中尝试时,它看起来很好:

<select name="ssid">
<option value="easybell DSL">easybell DSL</option>
<option value="FRITZ!Box Fon WLAN 7360 SL_EXT">FRITZ!Box Fon WLAN 7360 SL_EXT</option>
<option value="WLAN-519293">WLAN-519293</option>
<option value="NoTrespassing">NoTrespassing</option>
<option value="Cinque">Cinque</option>
<option value="EasyBox-738461">EasyBox-738461</option>
<option value="FRITZ!Box WLAN 3270">FRITZ!Box WLAN 3270</option>
</select>

然后被PHP使用:

<form action="/cgi-bin/process.py" method="get">
<?php $output=shell_exec("/usr/bin/python cgi-bin/wifi-scan.py"); print_r($output);?>
<input type="password" value="password" name="psk" onfocus="this.value = '';" onblur="if (this.value == '') {this.value = 'Password';}">
<div class="submit"><input type="submit" onclick="myFunction(){shell_exec("process.py")}" value="Connect" ></div>
</form>

遗憾的是,当我访问网站时,它只在下拉框菜单中显示一个选项。在我沮丧的时候,我通过SSH运行Python代码,看看它是否有效,以及可能出现的问题。之后,当我直接刷新网站时,所有选项都显示出来了。

这种情况似乎一直存在。

为了能够获得完整的列表,我首先需要通过SSH运行它,然后才能刷新网站并查看完整的列表。这将持续大约10秒,之后只有第一个选项再次出现,需要手动干预。

这里可能有什么问题?我已经无计可施了!

谢谢!!

由PHP通过lighttpd执行的脚本作为www数据运行。命令iwlist需要root权限。如果它是由没有root权限的用户执行的(www数据),它只返回与你连接的wifi相关的信息,这就是为什么我认为它有效,但只输出一行,而不是全部。

当然,为了最大限度地降低系统上的漏洞利用风险,我不会以root身份启动lighttpd,也不会授予www数据root权限。

相反,我编辑了我的sudoers文件,接受只有这个特定的python脚本作为sudo运行,方法是:

sudo visudo

并添加这一行:

www-data ALL = (ALL) NOPASSWD: /home/var/www/html/cgi-bin/wifi-scan.py