web-dev-qa-db-ja.com

Pythonを使用してコマンドを実行するためにリモートWindowsマシンに接続する方法は?

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

次の2つの方法を使用して、ネットワーク内のコンピューターを別のコンピューターに接続できます。

  • 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."

ネトス

2番目の方法は、netuseモジュールを使用することです。

Netuseを使用すると、リモートコンピューターに接続できます。そして、リモートコンピューターのすべてのデータにアクセスできます。次の2つの方法で可能です。

  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を使用する前に、pythonも使用してpywin32をシステムにインストールする必要があります。


ソース: リモートシステムの接続

7
Ashish Jain

代わりに 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スクリプトを実行する このページ の別の例を次に示します。

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

たぶん、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)
5
Beatrice Lin

接続用

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
2
fhulprogrammer

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から関数を呼び出すだけです。

PS:優れたオプションがたくさんあると確信しています。必要な場合は単純なオプションです...

1
Kobi K

私は個人的に pywinrm library が非常に効果的であることを発見しました。ただし、マシンで実行するいくつかのコマンドと、動作する前に他のいくつかのセットアップが必要です。

1
Rusty Weber

クライアントマシンにpythonロードされていますか?ある場合、これを psexec で実行しています。

ローカルマシンでは、.pyファイルのサブプロセスを使用してコマンドラインを呼び出します。

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

-cはファイルをサーバーにコピーするので、実行可能ファイルを実行できます(これは、接続テストの完全な.batまたは上記の.pyファイルです)。

0
Chet Meinzer

手遅れですか?

個人的にはBeatrice Lenに同意します。paramikoはWindowsの追加のステップかもしれませんが、プロジェクトgitハブのサンプルがあります。

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

0
David Castro