You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

远程桌面执行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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 15:25:44