如何连接到远程Windows机器以使用python执行命令?

时间:2013-09-23 13:59:29

标签: python windows sockets wmi remote-server

我是Python的新手,我正在尝试创建一个连接到远程Windows机器并在那里执行命令并测试端口连接的脚本。

以下是我正在编写的代码,但它无效。基本上,我想和它一起返回本地机器数据,而不是远程机器数据。

import wmi
import os
import subprocess
import re
import socket, sys

def main():

     host="remotemachine"
     username="adminaam"
     password="passpass!"
     server =connects(host, username, password)
     s = socket.socket()
     s.settimeout(5)
     print server.run_remote('hostname')

class connects:

    def __init__(self, host, username, password, s = socket.socket()):
        self.host=host
        self.username=username
        self.password=password
        self.s=s

        try:
            self.connection= wmi.WMI(self.host, user=self.username, password=self.password)
            self.s.connect(('10.10.10.3', 25))
            print "Connection established"
        except:
            print "Could not connect to machine"


   def run_remote(self, cmd, async=False, minimized=True):
       call=subprocess.check_output(cmd, shell=True,stderr=subprocess.STDOUT )
       print call

main() 

11 个答案:

答案 0 :(得分:7)

您可以使用以下两种方法将一台计算机连接到网络中的另一台计算机:

  • 使用WMI库。
  • Netuse方法。

WMI

以下是使用wmi模块进行连接的示例:

ip = “192.168.1.13”
username = “username”
password = “password”
from socket import *
try:
    print "Establishing connection to %s" %ip
    connection = wmi.WMI(ip, user=username, password=password)
    print "Connection established"
except wmi.x_wmi:
    print "Your Username and Password of "+getfqdn(ip)+" are wrong."

netuse

第二种方法是使用netuse模块。

通过Netuse,您可以连接到远程计算机。您可以访问远程计算机的所有数据。可以通过以下两种方式实现:

  1. 通过虚拟连接进行连接。

    import win32api
    import win32net
    ip = '192.168.1.18'
    username = 'ram'
    password = 'ram@123'
    
    use_dict={}
    use_dict['remote']=unicode('\\\\192.168.1.18\C$')
    use_dict['password']=unicode(password)
    use_dict['username']=unicode(username)
    win32net.NetUseAdd(None, 2, use_dict)
    

    断开连接:

    import win32api
    import win32net
    win32net.NetUseDel('\\\\192.168.1.18',username,win32net.USE_FORCE)
    
  2. 在本地系统中安装远程计算机驱动器。

    import win32api
    import win32net
    import win32netcon,win32wnet
    
    username=’user’
    password=’psw’
    
    try:
        win32wnet.WNetAddConnection2(win32netcon.RESOURCETYPE_DISK, 'Z:','\\\\192.168.1.18\\D$', None, username,password, 0)
        print “connection established successfully”
    except:
        print  “connection not established”
    

    在本地系统中卸载远程计算机驱动器:

    import win32api
    import win32net
    import win32netcon,win32wnet
    
    win32wnet.WNetCancelConnection2('\\\\192.168.1.4\\D$',1,1)
    
  3.   

    在使用netuse之前,你应该在你的系统中安装pywin32并使用python。


    来源:Connect remote system

答案 1 :(得分:4)

您可以使用pywinrm library代替跨平台兼容。

这是一个简单的代码示例:

#!/usr/bin/env python
import winrm

# Create winrm connection.
sess = winrm.Session('https://10.0.0.1', auth=('username', 'password'), transport='kerberos')
result = sess.run_cmd('ipconfig', ['/all'])

通过以下方式安装库:pip install pywinrm requests_kerberos

以下是this page在远程主机上运行Powershell脚本的另一个示例:

import winrm

ps_script = """$strComputer = $Host
Clear
$RAM = WmiObject Win32_ComputerSystem
$MB = 1048576

"Installed Memory: " + [int]($RAM.TotalPhysicalMemory /$MB) + " MB" """

s = winrm.Session('windows-host.example.com', auth=('john.smith', 'secret'))
r = s.run_ps(ps_script)
>>> r.status_code
0
>>> r.std_out
Installed Memory: 3840 MB

>>> r.std_err

答案 2 :(得分:4)

也许您可以使用SSH连接到远程服务器。

在Windows服务器上安装freeSSHd。

SSH客户端连接代码:

import paramiko

hostname = "your-hostname"
username = "your-username"
password = "your-password"
cmd = 'your-command'

try:
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname,username=username,password=password)
    print("Connected to %s" % hostname)
except paramiko.AuthenticationException:
    print("Failed to connect to %s due to wrong username/password" %hostname)
    exit(1)
except Exception as e:
    print(e.message)    
    exit(2)

执行命令并获得反馈:

try:
    stdin, stdout, stderr = ssh.exec_command(cmd)
except Exception as e:
    print(e.message)

err = ''.join(stderr.readlines())
out = ''.join(stdout.readlines())
final_output = str(out)+str(err)
print(final_output)

答案 3 :(得分:2)

用于连接

c=wmi.WMI('machine name',user='username',password='password')

#this connects to remote system. c is wmi object

命令

process_id, return_value = c.Win32_Process.Create(CommandLine="cmd.exe /c  <your command>")

#this will execute commands

答案 4 :(得分:1)

我不知道WMI,但如果你想要一个简单的服务器/客户端, 您可以使用tutorialspoint

中的这个简单代码

服务器

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.
s.bind((host, port))        # Bind to the port

s.listen(5)                 # Now wait for client connection.
while True:
   c, addr = s.accept()     # Establish connection with client.
   print 'Got connection from', addr
   c.send('Thank you for connecting')
   c.close()                # Close the connection 

<强>客户端

#!/usr/bin/python           # This is client.py file

import socket               # Import socket module

s = socket.socket()         # Create a socket object
host = socket.gethostname() # Get local machine name
port = 12345                # Reserve a port for your service.

s.connect((host, port))
print s.recv(1024)
s.close                     # Close the socket when done

它还具有简单客户端/服务器应用程序所需的所有信息。

只需转换服务器并使用一些简单的协议从python调用函数。

P.S:我确定有很多更好的选择,如果你想要它只是一个简单的选择......

答案 5 :(得分:1)

我个人认为pywinrm library非常有效。但是,它确实需要在机器上运行一些命令以及其他一些设置才能运行。

答案 6 :(得分:0)

客户端机器是否已加载python?如果是这样,我正在用psexec

这样做

在我的本地计算机上,我使用.py文件中的subprocess来调用命令行。

import subprocess
subprocess.call("psexec {server} -c {}") 

-c将文件复制到服务器,这样我就可以运行任何可执行文件(在你的情况下可能是一个完整的连接测试.bat或你上面的.py文件)。

答案 7 :(得分:0)

为时已晚?

我个人同意Beatrice Len,我使用paramiko也许是Windows的额外步骤,但是我有一个示例项目git hub,可以随时克隆或询问我。

https://github.com/davcastroruiz/django-ssh-monitor

答案 8 :(得分:0)

pypsrp-Python PowerShell远程协议客户端库

openpyxl

REF:https://github.com/jborean93/pypsrp

答案 9 :(得分:0)

已经有很多答案,但是还有一个选择

PyPSExec https://pypi.org/project/pypsexec/

这是著名的psexec的python克隆。 无需在远程Windows机器上进行任何安装即可工作。

答案 10 :(得分:0)

连接到远程服务器并执行命令的最佳方法是使用“ wmiexec.py

只需运行 pip安装功能

这将在python中的scripts文件夹下创建“ wmiexec.py ”文件

在python内部>脚本> wmiexec.py

我们需要通过以下方式运行wmiexec.py

db.collection.aggregate([
  {
    $match: {
      sent: false
    }
  },
  {
    $group: {
      _id: "$bookingId",
      status: {
        $addToSet: "$status"
      }
    }
  },
  {
    $facet: {
      success: [
        {
          $match: {
            status: {
              $nin: [
                "ERROR"
              ]
            }
          }
        },
        {
          $match: {
            status: {
              $in: [
                "SUCCESS"
              ]
            }
          }
        },
        {
          $project: {
            success: "$_id",
            _id: 0
          }
        }
      ],
      error: [
        {
          $match: {
            status: {
              $in: [
                "ERROR"
              ]
            }
          }
        },
        {
          $project: {
            error: "$_id",
            _id: 0
          }
        }
      ]
    }
  },
  {
    $project: {
      concat: {
        "$concatArrays": [
          "$error",
          "$success"
        ]
      }
    }
  },
  {
    $unwind: "$concat"
  },
  {
    $group: {
      _id: null,
      successBookingIds: {
        $push: "$concat.success"
      },
      errorBookingIds: {
        $push: "$concat.error"
      }
    }
  }
])

根据您的个人喜好更改wmiexec.py的位置

就像我使用python 3.8.5一样,我的wmiexec.py位置将为 C:\ python3.8.5 \ Scripts \ wmiexec.py

python <wmiexec.py location> TargetUser:TargetPassword@TargetHostname "<OS command>"

根据您的远程计算机修改TargetUser,TargetPassword,TargetHostname和OS命令

注意: 以上方法用于在远程服务器上运行命令。

但是,如果您需要捕获远程服务器的输出,则需要创建一个python代码。

python C:\python3.8.5\Scripts\wmiexec.py TargetUser:TargetPassword@TargetHostname "<OS command>"

相应地修改代码并运行它。