远程桌面执行CMD命令无法获取输出,求无SSH解决方案
解决方案:无需SSH获取远程CMD命令输出
问题根源
你使用wmi.WMI.Win32_Process.Create()执行命令时,该方法仅返回进程创建的状态(如进程ID),不会捕获命令的标准输出/错误输出,因此无法拿到uxm getrole的执行结果。另外,subprocess库是用于本地执行命令的工具,无法直接实现远程主机的命令调用,不适合你的场景。
无需SSH的实现方法
最直接的方案是将远程命令的输出重定向到远程主机的临时文件,再通过WMI读取该文件内容,最后可选择删除临时文件。
具体代码示例
import wmi from socket import getfqdn import time ip = "your_remote_ip" username = "remote_username" password = "remote_password" temp_file = "C:\\Windows\\Temp\\uxm_output.txt" # 远程主机的临时文件路径 try: print(f"Establishing connection to {ip}") connection = wmi.WMI(ip, user=username, password=password) print("Connection established") # 1. 执行命令并将输出(含错误)重定向到临时文件 cmd = f'cmd.exe /c uxm getrole > "{temp_file}" 2>&1' create_res = connection.Win32_Process.Create(CommandLine=cmd) if create_res[0] == 0: # 返回0表示进程创建成功 print("Command executed, waiting for output generation...") time.sleep(2) # 根据命令耗时调整等待时间 # 2. 读取远程临时文件内容 file_obj = connection.Win32_LogicalFile(Name=temp_file) if file_obj: content = file_obj[0].Open(Read=True).Read() print("Command output:") print(content.decode('gbk')) # Windows CMD默认编码为GBK,可按需调整 # 3. 删除临时文件(可选操作) delete_res = file_obj[0].Delete() if delete_res[0] == 0: print("Temporary file deleted") else: print(f"Failed to create process, error code: {create_res[0]}") except wmi.x_wmi: print(f"Username or password for {getfqdn(ip)} is incorrect.") except Exception as e: print(f"Error occurred: {str(e)}")
PyInstaller打包注意事项
- 打包时需确保
wmi及其依赖(如pywin32)被正确包含,建议使用命令pyinstaller --onefile your_script.py,若出现依赖缺失,可添加参数--hidden-import wmi或--hidden-import win32api。 - 需确认远程主机的
Windows Management Instrumentation服务处于运行状态,若未开启,可通过远程桌面手动启动。
替代方案:使用WinRM
若远程主机已开启WinRM服务(默认未开启,可通过远程桌面执行winrm quickconfig快速配置),可使用pywinrm库直接执行命令并获取输出,无需创建临时文件:
import winrm session = winrm.Session(ip, auth=(username, password)) result = session.run_cmd('uxm', ['getrole']) print("STDOUT:", result.std_out.decode('gbk')) print("STDERR:", result.std_err.decode('gbk'))
注意:配置WinRM需要远程主机的管理员权限,若无法远程配置,此方案暂不适用。
内容的提问来源于stack exchange,提问作者Evil Morty
相关产品推荐
相关产品推荐

