【问题标题】:Running commands on Remote Windows machine with python使用 python 在远程 Windows 机器上运行命令
【发布时间】:2012-11-17 15:03:01
【问题描述】:

这次我问的是在远程 Windows 机器上运行命令。 让我在这里更具描述性。
**我有一台安装了 python 的机器,我想运行一些 powershell 和 cmd 命令,或者我想将一个 cmd 文件发送到远程 Windows 机器,以便它可以在那里运行,并且每个输出都像错误,stdout 我可以得到回到射击机器。
就像我想从 python 远程管理远程机器一样。如果可能的话,我可以在多台机器上同时使用 python 远程触发命令。
记住,其他系统没有安装任何 python。 **

【问题讨论】:

    标签: python windows remote-debugging configuration-management


    【解决方案1】:

    知道这是一篇很老的帖子,

    目前我能想到的最佳选择是使用 PowerShell 进行窗口远程管理。

    下面是如何使用 PowerShell 在远程 PC 中执行命令以及如何在 Python 中执行命令。

    PowerShell 启动服务:

    Get-Service -ComputerName aaa0001 -Name Tomcat9 | Start-Service
    

    现在,接下来是如何使用 Python 执行此操作,

    import subprocess
    
    subprocess.call(["C:\\Windows\\System32\\WindowsPowerShell\\v1.0\\powershell.exe","Get-Service -ComputerName aaa0001 -Name Tomcat9 | Start-Service"])
    

    这个例子展示了如何在 Windows 中启动 Tomcat9 windows 服务。 ("aaa0001" 只是计算机名称)

    【讨论】:

      【解决方案2】:

      这有点像雷区,但是做到这一点的“正确”方法(python 控制没有 python 的远程 win 机器)是使用用于 WMI 或 WRM 的库。

      有一个WMI module by Tim Golden(他是 Python-on-Windows 世界的权威)、WSMAN library from Dell 和一个pywinrm module。选择你的毒药——它们都有自己的弱点(必须先在服务器上启用 WRM,然后才能使用它,尽管这不需要任何额外的软件,它都是 Windows;WMI 在 DCOM 上工作,所以你会必须弄清楚 DCOM 安全等)。

      【讨论】:

      • 这听起来是最好的解决方案。我可以使用这些模块从非 Windows 控制 Windows 服务器,还是它们依赖于仅在 Windows 上可用的底层机制?
      • Tim 的 WMI 模块只是 pywin32 之上的一个包装器,所以不,你不能在非 Windows 上使用它。我不知道戴尔的那个(顺便说一句,现在看起来已经废弃了)。 WRM 本身是一个基于 XML 的协议(我认为),所以理论上你可以做很多事情,但实际上它是没有人真正想要弄脏的那些“企业”标准之一。如果您确实需要,可以尝试查看流量并仅重新实现您需要的功能。
      • WMI 是不行的,仅适用于 Windows。 WSMAN 文档提到它支持 Linux……也许我也可以让它在 OS X 上工作。它支持 2.6 和更新版本,并且最近一次更新是在 2 年前,所以很久以前它并没有被放弃。您的pywinrm module 链接指向与WSMAN library from Dell 完全相同的位置 - 我认为这是一个错误。我在这里找到了pywinrmpypi.python.org/pypi/pywinrm/0.0.3。看起来还不错……如果它允许我上传和下载文件,那就完美了。
      • 嗯。 pywinrm 似乎没有任何上传和下载的方法,但 WinRM 可以。所以也许我可以自己添加pywinrm 的功能...
      • pywinrm 可能无法进行下载和上传,但您可以将 pywinrm 与 pysmb 结合使用来进行管理。但是,由于您必须启用文件共享,因此需要在远程主机方面付出更多努力。
      【解决方案3】:

      您可以按照khagler 的建议使用ssh。但我更喜欢在两边都安装 Python,因为 Python 让我在远程端有更多的控制权。

      例如,ssh 仅在两台计算机之间提供一个通道。这意味着我必须在远程端折叠stdoutstderr 才能通过电线发送。使用远程 Python 服务器,我可以运行更复杂的脚本,我可以准确地控制我想要公开的内容(如果您允许远程访问 any 命令可以执行)并且错误处理更加简单。

      或两者的组合:在远程计算机上安装 Python,然后使用ssh 启动 Python 脚本。然后,您可以使用自定义协议与它进行通信,而不受命令行/shell 界面的限制。您甚至可以使用scp 远程安装新脚本。

      【讨论】:

      • 我想知道你在 Windows 上运行的是什么 sshserver?实际上,我尝试用 2 个不同的 SSH 服务器做同样的事情:来自 Microsoft 的 mobasshdopenSSH。对于这两个服务器,我无法执行 python 脚本,即使我通过 ssh 手动登录。我把这个贴在serverfault:serverfault.com/questions/901041/…
      • 想知道您是否可以提供您正在使用的库的具体细节?
      • 就我而言,我安装了 Python,然后使用了普通的客户端/服务器套接字协议 (docs.python.org/3/library/socket.html)。至于在 Windows 上运行 SSH,是的,这是一个充满伤害的世界。我也没有一个可行的解决方案。
      • 谢谢。一开始有点难……但我发现了 WinSSHD serverfault.com/a/8423/443721。结果证明它非常稳定,几乎可以与 Unix 系统上的 SSH 相媲美,而且我几乎找不到任何错误。
      • @alpha_989 额外的库意味着我必须安装它们。就我而言,我正在检查安全补丁,这意味着我必须从注册表中读取一些数据(使用 win32 模块),所以我想保持我的足迹很小。
      【解决方案4】:

      你可以在Windows机器上安装一个ssh服务器(听说freeSSHd不错),然后使用paramiko模块与之通信。

      【讨论】:

      • 据我了解,Windows 10(将​​于本月晚些时候发布)将完全支持开箱即用的 SSH。因此,如果您负担得起仅在 Windows 10 和更高版本上运行的费用,您可能不需要在其上安装 SSH 服务器。 (我实际上没有任何机器运行 Windows 10 测试版,所以我还没有能够对此进行测试。)
      • Microsoft 提供的 OpenSSH 有很多缺陷。最好避免。 @ArtOfWarfare 从他们的 github 页面.. 似乎很多人都遇到了类似的问题。不确定它是否会起作用,但最好的机会是从这里使用建议的 sshd 服务器之一:serverfault.com/questions/8411/…
      • @ArtOfWarfare,我还必须在远程 Windows 机器上执行 python 脚本。您是如何解决这个问题的?
      • @alpha_989 - 我最终使用 cygwin 在其上安装了 sshd。抱歉,如果这不是您想听到的。我之前提到的 Windows 10 的东西......我玩过它,但我们的大多数服务器仍在运行 Server 2008,而且当时 Server 2016 还没有推出。
      【解决方案5】:

      您可以尝试将Pyro4subprocess.popen 结合使用。

      Pyro4 是一个用于远程方法调用的框架,subprocess.popen 用于创建底层 OS 进程。

      【讨论】:

      • thanx 快速回复,但据我所知 pyro4 只是远程调用 python 对象,但我的情况是 python 在一个系统上运行,而另一个系统没有安装 python。
      猜你喜欢
      • 1970-01-01
      • 2015-01-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-03
      • 2015-03-19
      相关资源
      最近更新 更多