Как подключиться к удаленной машине 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()
Ответы
Ответ 1
Вы можете подключить один компьютер к другому компьютеру в сети, используя следующие два метода:
- Используйте библиотеку 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 вы можете подключиться к удаленному компьютеру. И вы можете получить доступ ко всем данным удаленного компьютера. Это возможно двумя способами:
-
Подключение по виртуальному соединению.
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)
Чтобы отключить:
import win32api
import win32net
win32net.NetUseDel('\\\\192.168.1.18',username,win32net.USE_FORCE)
-
Установите удаленный компьютер в локальной системе.
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.
Источник: Подключить удаленную систему.
Ответ 2
Вместо этого вы можете использовать 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
.
Вот еще один пример из этой страницы для запуска Powershell script на удаленном хосте:
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
Ответ 3
Возможно, вы можете использовать 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)
Ответ 4
Для подключения
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
Ответ 5
Я не знаю 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
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
он также имеет всю необходимую информацию для простых клиент-серверных приложений.
Просто преобразуйте сервер и используйте простой протокол для вызова функции из python.
P.S: я уверен, что есть много лучших вариантов, это просто, если вы хотите...
Ответ 6
Я лично нашел pywinrm
library, чтобы быть очень эффективным. Однако для этого требуется выполнение некоторых команд на машине и некоторых других настройках, прежде чем они будут работать.
Ответ 7
У клиентских машин загружен python? если это так, я делаю это с помощью psexec
На моей локальной машине я использую подпроцесс в моем .py файле для вызова командной строки.
import subprocess
subprocess.call("psexec {server} -c {}")
-c копирует файл на сервер, поэтому я могу запустить любой исполняемый файл (который в вашем случае может быть .bat, полным тестов соединения или вашего .py файла сверху).
Ответ 8
это слишком поздно?
Я лично согласен с Беатрис Лен, я использовал paramiko, может быть, это дополнительный шаг для Windows, но у меня есть пример проекта git hub, не стесняйтесь клонировать или спросить меня.
https://github.com/davcastroruiz/django-ssh-monitor