Как подключиться к удаленному компьютеру с Windows для выполнения команд с помощью Python?

Я новичок в 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() 

person zewOlF    schedule 23.09.2013    source источник
comment
Есть предложения, ребята ..? ? пожалуйста, помогите   -  person zewOlF    schedule 23.09.2013
comment
Важно указать домен перед именем пользователя. Например username = r"EUR\adminaam"   -  person CodeKid    schedule 04.11.2014


Ответы (11)


Вы можете подключить один компьютер к другому в сети двумя способами:

  • Используйте библиотеку 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)
    

Перед использованием netuse вы должны также установить pywin32 в вашей системе с помощью python.


Источник: Подключить удаленную систему.

person Ashish Jain    schedule 04.12.2013
comment
Каковы относительные преимущества и недостатки WMI перед Netuse и наоборот? - person alpha_989; 19.01.2018

Вместо этого вы можете использовать pywinrm библиотеку, которая является кроссплатформенной.

Вот простой пример кода:

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


Вот еще один пример с этой страницы для запуска сценария 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
person kenorb    schedule 07.01.2018
comment
Я пытался это сделать, и у меня возникла проблема, когда я запускаю команду типа «ipconfig». В нем говорится, что HTTPSConnectionPool (host = '192.168.1.13', port = 5986): Превышено максимальное количество повторных попыток с url: / wsman (вызвано ConnectTimeoutError (‹requests.packages.urllib3.connection.VerifiedHTTPSConnection object at 0x7fcb12024a90›, 'Подключение к 192.168. 1.13 истекло время ожидания. (Время ожидания подключения = 30) ')) - person Adnan Sheikh; 19.06.2021

Возможно, вы можете использовать SSH для подключения к удаленному серверу.

Установите freeSSHd на свой сервер Windows.

Код подключения клиента 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)
person Beatrice Lin    schedule 08.02.2018
comment
Это решение мне очень помогло. С компьютера Windows я пытался запустить сценарий оболочки на удаленном компьютере, который в конечном итоге имеет путь к сценарию python для запуска. Если мне нужно запустить несколько команд, могу ли я повторить окно команд выполнения? Пожалуйста, предложите. - person Rohit; 03.07.2020
comment
Когда вы запускаете exec_command несколько раз, каждая команда выполняется в своей собственной оболочке. Таким образом, предыдущие команды не влияют на окружение следующих команд. - person Beatrice Lin; 08.07.2020
comment
Если вам нужно, чтобы предыдущие команды повлияли на следующие команды, просто используйте соответствующий синтаксис оболочки вашего сервера. В большинстве оболочек * nix для указания списка команд используется точка с запятой или двойной амперсанд (с разной семантикой). В вашем случае амперсанд более подходит, поскольку он выполняет следующие команды, только если предыдущие команды были успешными: например, stdin, stdout, stderr = ssh.exec_command (ORACLE_SID = PROD && cd / 01 / application / dataload && pwd) - person Beatrice Lin; 08.07.2020

Для подключения

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
person fhulprogrammer    schedule 10.02.2015
comment
вау, очень круто, работает очень хорошо, можно установить с помощью pip [#] pip install wmi - person Michael Biniashvili; 28.05.2017

на клиентских машинах загружен питон? если это так, я делаю это с помощью psexec

На моем локальном компьютере я использую подпроцесс в моем файле .py для вызова командной строки.

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

-c копирует файл на сервер, чтобы я мог запустить любой исполняемый файл (который в вашем случае может быть .bat, полный тестов соединения, или ваш .py-файл сверху).

person Chet Meinzer    schedule 09.03.2014

Я лично считаю очень эффективной pywinrm library. Однако для того, чтобы он заработал, требуется, чтобы на компьютере были запущены некоторые команды и некоторые другие настройки.

person Rusty Weber    schedule 06.01.2016
comment
Можете ли вы предложить какой-то пакет, который можно использовать для кроссплатформенного удаленного входа в систему? - person Rjain; 06.05.2016
comment
Забавно, что вы спросите. Я лично работаю над открытием исходного кода библиотеки именно для этого. - person Rusty Weber; 02.10.2020

Я не знаю WMI, но если вам нужен простой сервер / клиент, вы можете использовать этот простой код из учебный курс

Сервер:

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: я уверен, что есть много лучших вариантов, это просто, если хотите ...

person Kobi K    schedule 23.09.2013
comment
Спасибо, Коби, за ответ, но будет так сложно перейти к каждому клиенту и запустить там скрипт .... я пытаюсь получить доступ к нескольким машинам с 1 машины и выполнить команды там - person zewOlF; 23.09.2013

Лучший способ подключиться к удаленному серверу и выполнять команды - использовать wmiexec.py.

Просто запустите pip install impacket

Это создаст файл wmiexec.py в папке скриптов в python.

Внутри питона ›Скрипты› wmiexec.py

нам нужно запустить wmiexec.py следующим образом

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

Пожалуйста, измените местоположение wmiexec.py в соответствии с вашим

Как я использую python 3.8.5, и мое местоположение wmiexec.py будет C: \ python3.8.5 \ Scripts \ wmiexec.py

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

Измените TargetUser, TargetPassword, TargetHostname и команду ОС в соответствии с вашим удаленным компьютером.

Примечание. Вышеупомянутый метод используется для выполнения команд на удаленном сервере.

Но если вам нужно захватить вывод с удаленного сервера, нам нужно создать код Python.

import subprocess
command = 'C:\\Python36\\python.exe C:\\Python36\\Scripts\\wmiexec.py TargetUser:TargetPassword@TargetHostname "ipconfig"'
command = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE)
stdout= command.communicate()[0]
print (stdout)

Измените код соответствующим образом и запустите его.

person ImAlsoAnDeveloper    schedule 12.10.2020

уже слишком поздно?

Я лично согласен с Беатрис Лен, я использовал paramiko, возможно, это дополнительный шаг для Windows, но у меня есть пример проекта git hub, не стесняйтесь клонировать или спрашивать меня.

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

person David Castro    schedule 01.09.2018

pypsrp - клиентская библиотека протокола удаленного взаимодействия Python PowerShell

At a basic level, you can use this library to;

Execute a cmd command
Run another executable
Execute PowerShell scripts
Copy a file from the localhost to the remote Windows host
Fetch a file from the remote Windows host to the localhost
Create a Runspace Pool that contains one or multiple PowerShell pipelines and execute them asynchronously
Support for a reference host base implementation of PSRP for interactive scripts

ССЫЛКА: https://github.com/jborean93/pypsrp

person reddy nishanth    schedule 01.06.2020

Уже много ответов, но еще один вариант

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

Это клон известного psexec на языке Python. Работает без установки на удаленном компьютере с Windows.

person Red    schedule 14.07.2020