web-dev-qa-db-fra.com

Comment se connecter à une machine Windows distante pour exécuter des commandes à l'aide de python?

Je connais Python pour la première fois et j'essaye de créer un script qui se connecte à une machine Windows distante, qui exécute des commandes et teste la connectivité des ports.

Voici le code que j'écris mais ça ne marche pas. En gros, je veux et il retourne avec les données de la machine locale, pas les données distantes.

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

Vous pouvez connecter un ordinateur à un autre ordinateur d'un réseau en utilisant ces deux méthodes:

  • Utilisez la bibliothèque WMI.
  • Méthode Netuse.

WMI

Voici l'exemple de connexion à l'aide du module 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

La deuxième méthode consiste à utiliser le module netuse.

Par Netuse, vous pouvez vous connecter à un ordinateur distant. Et vous pouvez accéder à toutes les données de l'ordinateur distant. Il est possible des deux manières suivantes:

  1. Connectez-vous par connexion virtuelle.

    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)
    

    Débrancher:

    import win32api
    import win32net
    win32net.NetUseDel('\\\\192.168.1.18',username,win32net.USE_FORCE)
    
  2. Montez le lecteur de l'ordinateur distant dans le système local.

    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”
    

    Pour démonter le lecteur de l'ordinateur distant dans le système local:

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

Avant d’utiliser Netuse, vous devez également installer pywin32 dans votre système avec python.


Source: Connecter le système distant .

7
Ashish Jain

Vous pouvez utiliser pywinrm library qui est compatible avec toutes les plates-formes.

Voici un exemple de code simple:

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

Installez la bibliothèque via: pip install pywinrm requests_kerberos.


Voici un autre exemple de cette page pour exécuter le script Powershell sur un hôte distant:

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

Vous pouvez peut-être utiliser SSH pour vous connecter à un serveur distant.

Installez freeSSHd sur votre serveur Windows.

Code de connexion du client 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)

Commande d'exécution et obtenir des commentaires:

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

Pour la connexion

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

#this connects to remote system. c is wmi object

pour les commandes

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

#this will execute commands
2
fhulprogrammer

Je ne connais pas WMI mais si vous voulez un simple serveur/client, vous pouvez utiliser ce code simple depuis tutorialspoint

Serveur:

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 

Client

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

il contient également toutes les informations nécessaires pour les applications client/serveur simples.

Il suffit de convertir le serveur et d’utiliser un protocole simple pour appeler une fonction à partir de python.

P.S: Je suis sûr qu'il y a beaucoup de meilleures options, c'est simple si vous voulez ...

1
Kobi K

J'ai personnellement trouvé pywinrm library d'être très efficace. Cependant, certaines commandes doivent être exécutées sur la machine et une autre configuration avant de pouvoir fonctionner.

1
Rusty Weber

les machines client ont-elles du python chargé? si c'est le cas, je le fais avec psexec

Sur mon ordinateur local, j'utilise un sous-processus dans mon fichier .py pour appeler une ligne de commande.

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

le -c copie le fichier sur le serveur afin que je puisse exécuter n’importe quel fichier exécutable (ce qui dans votre cas pourrait être un .bat plein de tests de connexion ou votre fichier .py d’en haut). 

0
Chet Meinzer

c'est trop tard?

Personnellement, je suis d’accord avec Beatrice Len, j’ai utilisé paramiko, c’est peut-être une étape supplémentaire pour Windows, mais j’ai un exemple de projet git hub, n'hésitez pas à me cloner ou à me demander.

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

0
David Castro