Kivy应用如何通过SU以超级用户权限运行函数或整个应用
解决Kivy应用以root权限执行ARP扫描的问题
修正subprocess调用的核心问题
你之前的代码存在两个关键错误:
su -c仅接受单个字符串形式的命令,拆分的参数会被su错误解析- 直接传函数名
name_function无效,子进程的Python环境和主进程不共享函数,必须传递可执行的代码字符串
修正后的代码示例(假设用scapy实现ARP扫描):
import subprocess # 把ARP扫描的完整逻辑写成可执行的Python代码字符串 arp_scan_code = """ import scapy.all as scapy arp_request = scapy.ARP(pdst="192.168.1.0/24") broadcast = scapy.Ether(dst="ff:ff:ff:ff:ff:ff") arp_request_broadcast = broadcast / arp_request answered_list = scapy.srp(arp_request_broadcast, timeout=1, verbose=False)[0] results = [] for element in answered_list: client_dict = {"ip": element[1].psrc, "mac": element[1].hwsrc} results.append(client_dict) print(results) """ # 正确构造su命令:将整个python调用打包成单个字符串传给su -c try: # 使用shell=True让系统解析完整命令串,同时捕获错误输出 output = subprocess.check_output( ['su', '-c', f'python -c "{arp_scan_code}"'], shell=True, stderr=subprocess.STDOUT, text=True ) print("扫描结果:", output) except subprocess.CalledProcessError as e: print("执行失败,错误信息:", e.output)
适配不同系统的权限方式
Linux桌面环境
直接用su会在终端要求输入密码,但Kivy是GUI应用无法捕获终端输入,建议用系统自带的GUI权限验证工具:
- 替换
su -c为pkexec(跨桌面通用):
执行时会弹出系统原生的权限验证窗口,用户输入密码即可执行。cmd = ['pkexec', 'python', '-c', arp_scan_code]
Android系统
- 确保设备已Root,且su路径正确(通常为
/system/bin/su或/system/xbin/su) - 调整命令指定su完整路径:
cmd = ['/system/bin/su', '-c', f'python -c "{arp_scan_code}"'] - 注意:Android的Python环境可能缺少依赖,需提前打包scapy等库到APK中。
其他可选方案
- 全局提权运行应用:直接在终端用
sudo python main.py启动Kivy应用,或修改桌面快捷方式的命令为sudo python /path/to/your/app.py(注意:GUI应用以root运行存在安全风险) - 使用setcap给Python程序加权限:如果仅需要ARP扫描权限,可给Python二进制文件添加网络权限:
这样无需root即可执行ARP扫描,但仅适用于Linux系统。sudo setcap cap_net_raw,cap_net_admin+ep /usr/bin/python3
调试技巧
- 先在终端手动执行命令,验证是否可行,比如:
su -c "python -c 'import scapy; print(\"scapy可用\")'" - 捕获subprocess的错误输出,定位具体问题(比如权限被拒、依赖缺失、命令路径错误)
内容的提问来源于stack exchange,提问作者ȶɦɛֆɦɨռʏɛռɖ
相关产品推荐
相关产品推荐

