linux os.popen“sudo iwlist wlan0 scan”在独立运行时返回预期值,但在FLASK下不返回

mlnl4t2r  于 2023-11-17  发布在  Linux
关注(0)|答案(1)|浏览(134)

我试图更新我的Raspberry Pi python 3.x app扫描附近的WiFi网络,但我无法通过“sudo iwlist wlan0 scan”的僵局。
当作为独立脚本执行时,它很好,但是当JavaScript用户运行与FLASK应用程序相同的代码时,我会得到错误:要么是零输出,要么是可怕的[Errno 2] No such file or directory: 'sudo'
这个独立的脚本在命令行中执行 * 而不使用 * sudo时返回附近的所有WiFi网络:

import os
import getpass
import subprocess

output = os.popen("sudo iwlist wlan0 scan").read() # Works beautifully when stand-alone
print(output)

print(f'Effective user is {getpass.getuser()}')

字符串
输出量:

pi@BenchPi3BPlus:~ $ python3 test.py
wlan0     Scan completed :
  Cell 01 - Address: 11:22:BF:21:33:44
            Channel:1
    
<edit>
        
  Cell 10 - Address: 55:55:EB:66:77:25
            Channel:5
<edit> 

Effective user is pi
pi@BenchPi3BPlus:~ $


.然而,当我在flask下尝试相同的操作时,我得到了一个“空”的结果值:

app.logger.debug(f'Effective user is {getpass.getuser()}')
output = os.popen("sudo iwlist wlan0 scan").read()
app.logger.debug(f'SUCCESS: {output}')
[2023-11-06 09:49:54 +1100] [3983] [DEBUG] GET /network
[2023-11-06 09:49:55 +1100] [3983] [DEBUG] Effective user is pi
[2023-11-06 09:49:55 +1100] [3983] [DEBUG] SUCCESS:

的字符串
我看到有人建议我的FLASK版本不等待响应,所以我尝试了一种不同的方法,使用subprocess.Popen,结果也有同样的差异,但在FLASK下失败了:

import os
import getpass
import subprocess

cmd = ["sudo", "iwlist", "wlan0", "scan"]
result = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE, shell=False, encoding='utf-8')
(stdoutdata, stderrdata) = result.communicate()
if stdoutdata:
    print(stdoutdata.strip())
if stderrdata:
    print(stderrdata.strip())

print(f'Effective user is {getpass.getuser()}')


输出量:

pi@BenchPi3BPlus:~ $ python3 test2.py
wlan0     Scan completed :
  Cell 01 - Address: 11:22:BF:21:33:44
            Channel:1
    
<edit>
        
  Cell 10 - Address: 55:55:EB:66:77:25
            Channel:5
<edit> 

Effective user is pi
pi@BenchPi3BPlus:~ $


然而,当我从FLASK运行时,我得到了这个回报:

[2023-11-09 09:24:45 +1100] [11683] [DEBUG] GET /network
[2023-11-09 09:24:46 +1100] [11683] [DEBUG] Effective user is pi
[2023-11-09 09:24:46 +1100] [11683] [DEBUG] runSubprocess threw: [Errno 2] No such file or directory: 'sudo'


我已经尝试了所有我能找到的选择。我一定是错过了一些基本的和基本的东西。请让我摆脱我的痛苦。

e4yzc0pl

e4yzc0pl1#

好吧,我说当我问这个问题的时候,我认为解决办法很简单。我没有意识到它是这么简单。
这表明sudo不是操作系统的内部命令-它是一个程序,当subprocess.Popen报告No such file or directory时,它试图向我指出这一点。

pi@BenchPi3BPlus:~ $ which sudo
/usr/bin/sudo
pi@BenchPi3BPlus:~ $

字符串
因此,修复方法只是将路径添加到sudo:

cmd = ["/usr/bin/sudo", "iwlist", "wlan0", "scan"]
result = os.popen(cmd).read()


(奇怪的是,当我尝试使用子进程时。Popen仍然报告没有这样的文件或目录)
@ShadowRanger建议我不应该这样做是正确的,但这是问题的答案。
更好的方法是将此请求转换为systemctl守护进程,并从Flask中插入它,然后等待并读取响应。

相关问题