在另一台计算机上运行的python脚本的远程控制功能

时间:2018-08-23 00:00:24

标签: python

因此,假设我对两台计算机都拥有完全控制权,那么我将它们分别称为计算机A和计算机B。

在计算机A上,有一个python脚本在后台运行并具有多种功能,其中一个功能可以创建并显示消息框:(这只是一个示例)

def msg_box(text,title):
    MessageBox = ctypes.windll.user32.MessageBoxW
    MessageBox(None, text, title, 0)

我想做的是从计算机B访问在计算机A上运行的脚本的功能,在使用msg_box函数的情况下,我希望能够在计算机B上使用我拥有的任何参数来调用它想要,它将在计算机A上执行。我是初学者,并且我不知道如何在计算机之间建立此链接,我提醒您,我对这两个计算机都拥有完全控制权,并且它们已连接到我的本地网络。有人建议我使用ssh服务器,有人可以给我一些想法吗?

1 个答案:

答案 0 :(得分:0)

这听起来像是Pyro4 package的工作。这是一个基于他们的"Simple Example"的示例,并带有一些额外的代码来自动启动名称服务器并通过网络进行监听。

首先在每台计算机上使用此命令来安装Pyro4:

pip install pyro4

在服务器上,将此脚本另存为server.py,然后通过python server.py在终端窗口中运行它:

# saved as server.py
import Pyro4, Pyro4.naming
import socket, threading

# Define an object that will be accessible over the network.
# This is where all your code should go...
@Pyro4.expose
class MessageServer(object):
    def show_message(self, msg):
        print("Message received: {}".format(msg))


# Start a Pyro nameserver and daemon (server process) that are accessible
# over the network. This has security risks; see 
# https://pyro4.readthedocs.io/en/stable/security.html
hostname = socket.gethostname()
ns_thread = threading.Thread(
    target=Pyro4.naming.startNSloop, kwargs={'host': hostname}
)
ns_thread.daemon = True   # automatically exit when main program finishes
ns_thread.start()
main_daemon = Pyro4.Daemon(host=hostname)

# find the name server
ns = Pyro4.locateNS()
# register the message server as a Pyro object
main_daemon_uri = main_daemon.register(MessageServer)
# register a name for the object in the name server
ns.register("example.message", main_daemon_uri)

# start the event loop of the main_daemon to wait for calls
print("Message server ready.")
main_daemon.requestLoop()

在客户端上,将其另存为client.py并使用python client.py运行它:

# saved as client.py
import Pyro4
import sys

print("What is your message?")
msg = sys.stdin.readline().strip()

# lookup object uri on name server and create a proxy for it
message_server = Pyro4.Proxy("PYRONAME:example.message")
# call method on remote object
message_server.show_message(msg)

请注意,将Pyro设置为侦听您的网络存在安全风险。因此,在进行此操作之前,您应该阅读他们的section on security。但这足以让您入门。

如果您想要一个仅使用标准库的解决方案,则可以在a different answer中查看我基于套接字的客户端-服务器设置。或者,您可以考虑在服务器上设置flask网络服务器,然后在客户端上使用urllib2访问服务器并调用正确的操作(可能通过GET或{{1 }}请求)。但是这些都比这困难得多。

另一个选择是使用不同的进程间通信程序包,例如PyZMQ,redis,mpi4py或zmq_object_exchanger。有关一些想法,请参见this question