webentwicklung-frage-antwort-db.com.de

Wie kann ich eine Verbindung zu einem Windows-Remotecomputer herstellen, um Befehle mit Python auszuführen?

Ich bin neu in Python und versuche, ein Skript zu erstellen, das eine Verbindung zu einem entfernten Windows-Computer herstellt und dort Befehle ausführt und die Port-Konnektivität testet.

Hier ist der Code, den ich schreibe, aber er funktioniert nicht. Grundsätzlich möchte ich und es werden mit den lokalen Maschinendaten zurückgegeben, nicht mit den entfernten.

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() 
12
zewOlF

Sie können einen Computer mit einem anderen Computer in einem Netzwerk verbinden, indem Sie diese beiden Methoden verwenden:

  • Verwenden Sie die WMI-Bibliothek.
  • Netuse-Methode.

WMI

Hier ist das Beispiel für die Verbindung mit dem wmi-Modul:

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

Die zweite Methode ist das netuse-Modul.

Mit Netuse können Sie eine Verbindung zu einem Remote-Computer herstellen. Und Sie können auf alle Daten des Remote-Computers zugreifen. Es gibt zwei Möglichkeiten:

  1. Verbinden Sie sich über eine virtuelle Verbindung.

    import win32api
    import win32net
    ip = '192.168.1.18'
    username = 'ram'
    password = '[email protected]'
    
    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)
    

    Trennen:

    import win32api
    import win32net
    win32net.NetUseDel('\\\\192.168.1.18',username,win32net.USE_FORCE)
    
  2. Montieren Sie das Remote-Computerlaufwerk im lokalen System.

    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”
    

    So lösen Sie das Remote-Computerlaufwerk im lokalen System auf:

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

Bevor Sie netuse verwenden, sollten Sie pywin32 auch mit Python in Ihrem System installiert haben.


Quelle: Remote-System anschließen .

7
Ashish Jain

Sie können stattdessen pywinrm library verwenden, das plattformübergreifend ist.

Hier ist ein einfaches Codebeispiel:

#!/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'])

Installieren Sie die Bibliothek über: pip install pywinrm requests_kerberos.


Hier ist ein weiteres Beispiel aus dieser Seite , um ein Powershell-Skript auf einem Remote-Host auszuführen:

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
4
kenorb

Möglicherweise können Sie SSH verwenden, um eine Verbindung zu einem Remote-Server herzustellen.

Installieren Sie freeSSHd auf Ihrem Windows-Server.

SSH-Client-Verbindungscode:

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)

Ausführungsbefehl und Feedback erhalten:

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)
4
Beatrice Lin

Für die Verbindung

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

#this connects to remote system. c is wmi object

für Befehle

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

#this will execute commands
2
fhulprogrammer

Ich kenne WMI nicht, aber wenn Sie einen einfachen Server/Client wünschen, Sie können diesen einfachen Code von tutorialspoint verwenden. 

Server:

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 

Klient

#!/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

es verfügt außerdem über alle erforderlichen Informationen für einfache Client/Server-Anwendungen.

Konvertieren Sie einfach den Server und verwenden Sie ein einfaches Protokoll, um eine Funktion aus Python aufzurufen.

P.S: Ich bin sicher, dass es viele bessere Optionen gibt, es ist nur eine einfache, wenn Sie wollen ...

1
Kobi K

Ich persönlich habe pywinrm library als sehr effektiv befunden. Es müssen jedoch einige Befehle auf der Maschine und einige andere Einstellungen ausgeführt werden, bevor es funktioniert.

1
Rusty Weber

haben die Client-Maschinen Python geladen? Wenn ja, mache ich das mit psexec

Auf meinem lokalen Computer verwende ich in meiner .py-Datei einen Unterprozess, um eine Befehlszeile aufzurufen.

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

die Datei -c kopiert die Datei auf den Server, sodass ich jede ausführbare Datei ausführen kann (die in Ihrem Fall eine .bat voller Verbindungstests oder Ihre .py-Datei von oben sein könnte). 

0
Chet Meinzer

es ist zu spät?

Ich stimme mit Beatrice Len persönlich überein, ich habe Paramiko verwendet, vielleicht ist es ein zusätzlicher Schritt für Windows, aber ich habe ein Beispiel für einen Projekt-Git-Hub.

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

0
David Castro