如何用Python通过USB向电脑发送PowerShell命令(树莓派终端开发)
实现树莓派通过USB向电脑发送PowerShell命令的方案
核心思路
树莓派与电脑通过USB连接时,可通过两种主流方式实现命令发送:USB串口通信(稳定可控,支持双向交互)或模拟USB HID键盘(无需电脑端额外脚本,直接模拟输入),以下是具体实现步骤:
方案一:USB串口通信
树莓派端配置与代码
启用USB串口功能:
修改/boot/config.txt,添加或确保存在:dtoverlay=dwc2修改
/boot/cmdline.txt,在console=serial0,115200后追加:modules-load=dwc2,g_serial完成后重启树莓派。
编写Python发送脚本:
import serial import time # 初始化USB串口设备,波特率需与电脑端一致 ser = serial.Serial('/dev/ttyGS0', 9600, timeout=1) time.sleep(2) # 等待串口初始化完成 # 定义要发送的PowerShell命令 ps_command = 'Get-ChildItem C:\\' ser.write((ps_command + '\n').encode('utf-8')) print(f"已发送命令: {ps_command}") ser.close()
电脑端处理脚本
- 打开设备管理器,找到树莓派对应的COM端口(如COM3)。
- 用Python编写监听执行脚本:
或直接用PowerShell监听:import serial import subprocess ser = serial.Serial('COM3', 9600, timeout=1) while True: command = ser.readline().decode('utf-8').strip() if command: print(f"收到命令: {command}") # 执行PowerShell命令并捕获输出 result = subprocess.run( ['powershell', '-Command', command], capture_output=True, text=True ) print(f"执行结果:\n{result.stdout}") # 可选:将结果回传给树莓派 ser.write(result.stdout.encode('utf-8'))$port = New-Object System.IO.Ports.SerialPort COM3,9600,None,8,one $port.Open() while($true) { if ($port.BytesToRead -gt 0) { $command = $port.ReadLine().Trim() Write-Host "收到命令: $command" $output = Invoke-Expression $command $port.WriteLine($output) } Start-Sleep -Milliseconds 100 }
方案二:模拟USB HID键盘
树莓派端配置与代码
启用USB HID功能:
修改/boot/config.txt添加:dtoverlay=dwc2修改
/boot/cmdline.txt添加:modules-load=dwc2,g_hid重启树莓派。
安装依赖并编写模拟脚本:
sudo apt-get install python3-evdevfrom evdev import UInput, ecodes as e import time # 初始化HID键盘设备 ui = UInput() # 模拟打开PowerShell:Win+R 输入powershell 回车 ui.write(e.EV_KEY, e.KEY_LEFTMETA, 1) ui.write(e.EV_KEY, e.KEY_R, 1) ui.syn() time.sleep(0.1) ui.write(e.EV_KEY, e.KEY_LEFTMETA, 0) ui.write(e.EV_KEY, e.KEY_R, 0) ui.syn() time.sleep(0.5) # 输入目标PowerShell命令 command = 'Get-ChildItem C:\\\n' for char in command: # 处理普通字符 key_code = getattr(e, f'KEY_{char.upper()}', None) if key_code: ui.write(e.EV_KEY, key_code, 1) ui.syn() time.sleep(0.05) ui.write(e.EV_KEY, key_code, 0) ui.syn() # 处理特殊字符(示例:反斜杠) elif char == '\\': ui.write(e.EV_KEY, e.KEY_LEFTALT, 1) ui.write(e.EV_KEY, e.KEY_RBRACE, 1) ui.syn() time.sleep(0.05) ui.write(e.EV_KEY, e.KEY_LEFTALT, 0) ui.write(e.EV_KEY, e.KEY_RBRACE, 0) ui.syn() ui.close()
注意事项
- 串口方案适合复杂命令与双向数据交互,但需电脑端保持监听脚本运行;HID方案无需电脑端额外程序,但仅适用于简单命令输入。
- 树莓派修改系统配置后必须重启才能生效。
- HID模拟时需注意特殊字符的按键映射,可参考
evdev库的ecodes模块补充更多字符处理逻辑。
内容的提问来源于stack exchange,提问作者k k
相关产品推荐
相关产品推荐

