0

所以我有一个树莓派,我已经将它设置为带有 h​​ostapd 和 isc-dhcp-server 的接入点。它广播一个 SSID,我用我的手机或笔记本电脑连接到它,转到 192.168.42.1,它会提供一个页面,其中我有一个用于 SSID、PSK 和设备 ID 的表单。这个想法是,然后它应该通过调用一堆子进程调用来使用我给它的信息连接到网络,事实上,它没有。

这是 index.html:

<html>
<body>
<form enctype="multipart/form-data" action="/cgi-bin/set_wifi.py" method="POST">

ssid: <input type="text" size="70" name="ssid" value=""><br>
pass: <input type="text" size="70" name="pass" value=""><br>
devid: <input type="text" size="70" name="devid" value=""><br>

<input type="submit" value="Submit">  
<input type="reset" value="Reset">

</form>
</body>
</html>

start_wifi.py 的内容如下:

#!/usr/bin/python

import cgi
import cgitb
import subprocess

cgitb.enable()

print "Content-type: text/html\n\n"

form=cgi.FieldStorage()

ssid_val=form['ssid'].value
pass_val=form['pass'].value
devid=form['devid'].value

#Write Device ID to devid.text
myfile= open("/home/pi/project/devid.txt","w")
myfile.write(form['devid'].value)
myfile.close()

#Write SSID and PSK to wpa_supplicant.conf
file = open('/etc/wpa_supplicant/wpa_supplicant.conf','a')
file.write('\n\nnetwork={\n ssid="')
file.write(ssid_val)
file.write('"\n     psk="')
file.write(pass_val)
file.write('"\n}')

file.close()

subprocess.call("sudo service hostapd stop", shell=True)
subprocess.call("sudo service isc-dhcp-server stop",shell=True)
subprocess.call("sudo ifdown wlan0",shell=True)
subprocess.call("sudo /etc/init.d/networking stop",shell=True)
subprocess.call("cp /etc/network/interfaces-manual /etc/network/interfaces",shell=True)
subprocess.call("sudo /etc/init.d/networking start",shell=True)
subprocess.call("sudo ifup wlan0",shell=True)

我有另一个名为 stopapd.py 的 python 脚本,它基本上是上面 set_wifi.py 脚本中 file.close() 之后的所有内容。当我通过终端运行它时,它工作正常。如果网络已经保存在 wpa_supplicant.conf 中,则停止网络、重写接口、重新启动网络并重新建立 wlan0

问题是当 set_wifi.py 通过 cgi 执行时,脚本的前半部分有效,它写入 devid.txt 和 wpa_supplicant.conf,但我认为唯一正常工作的 subproccess.call 是

cp /etc/network/interfaces-manual /etc/network/interfaces

它将接口文件从静态更改为 dhcp ...

其他命令似乎都没有运行......但是当我从终端运行与 stopapd.py 相同的代码时,它可以工作......我不知道为什么......任何帮助将不胜感激。

4

2 回答 2

0

这让我发疯了,但我一直在努力,这就是我想出的……

在 set_wifi.py 中,我注释掉了 file.close() 之后的所有内容并添加了

file=open('/home/pi/project/set_wifi_ran.txt','w')
file.write('set_wifi_ran') 
file.close()

然后我有另一个脚本一直在运行,称为stopapd.py ...它监视set_wifi_ran.txt,如果它发生变化,它会执行subprocess.calls ...这解决了我所有的问题

while True:
    file=open('/home/pi/project/set_wifi_ran.txt')
    length=(file.readline())
    file.close()

    if length>0
        file=open('/home/pi/project/set_wifi_ran.txt','w')
        file.close()

        subprocess.call("sudo service hostapd stop", shell=True)
        subprocess.call("sudo service isc-dhcp-server stop",shell=True)
        subprocess.call("sudo ifdown wlan0",shell=True)
        subprocess.call("sudo /etc/init.d/networking stop",shell=True)
        subprocess.call("cp /etc/network/interfaces-manual /etc/network/interfaces",shell=True)
        subprocess.call("sudo /etc/init.d/networking start",shell=True)
        subprocess.call("sudo ifup wlan0",shell=True)

我敢肯定这不是一种非常优雅的方式......我很感激任何反馈,我仍然很想知道为什么这不能通过 cgi 脚本工作

于 2015-05-10T19:18:30.717 回答
0

sudo仅适用于 sudoers 文件 ( /etc/sudoers) 中指定的用户。很有可能您的 Web 服务器正在与另一个用户一起运行而没有sudo.

这可以解释为什么只有非sudo命令正在执行。

要么使用你现有的看门狗解决方案,要么在你的 sudoers 文件中添加你的网络服务器用户。或者使用以您的用户身份运行的自定义 Web 服务器。

于 2015-05-10T21:02:17.830 回答