Python和PHP没有玩球,只有非常小的部分被解析

时间:2016-04-07 08:52:31

标签: php python html ssh

所以我目前正在使用Python脚本扫描WiFi网络并打印出结果:

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个secondes,之后只有第一个选项再次出现并需要手动干预。

这可能是什么问题?我的智慧结束了!

谢谢!

1 个答案:

答案 0 :(得分:1)

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

当然,为了最大限度地降低系统漏洞利用的风险,我没有以root身份启动lighttpd,也没有提供www-data root权限。

相反,编辑了我的sudoers文件,接受只有这个特定的python脚本才能以sudo的形式运行:

sudo visudo

并添加以下行:

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