【问题标题】:Execute arbitrary python code remotely - can it be done?远程执行任意 python 代码 - 可以吗?
【发布时间】:2020-03-22 21:30:02
【问题描述】:

我正在研究一个网格系统,它有许多非常强大的计算机。这些可用于非常快速地执行 python 函数。我的用户有许多 python 函数需要很长时间才能在工作站上计算,理想情况下他们希望能够在远程强大的服务器上调用一些函数,但让它看起来在本地运行。

Python 有一个名为“apply”的旧函数 - 现在 Python 支持扩展调用语法(例如 **arguments),现在它几乎没用了,但是我需要实现一些像这样工作的东西:

rapply = Rapply( server_hostname ) # Set up a connection
result = rapply( fn, args, kwargs ) # Remotely call the function
assert result == fn( *args, **kwargs ) #Just as a test, verify that it has the expected value. 

Rapply 应该是一个可以用来在远程服务器上远程执行一些任意代码(fn 可以是任何东西)的类。它将发回rapply 函数将返回的结果。 “结果”的值应该与我在本地调用函数的值相同。

现在让我们假设fn 是一个用户提供的函数,我需要某种方式通过网络将它发送到执行服务器。如果我能保证 fn 总是很简单,它可能只是一个包含 python 源代码的字符串......但如果它不是那么简单呢?

如果fn 可能具有本地依赖项怎么办:它可能是一个使用在不同模块中定义的类的简单函数,是否有封装fnfn 需要的所有非标准内容的方法-图书馆?一个理想的解决方案不需要这个系统的用户对 python 开发有太多的了解。他们只是想编写他们的函数并调用它。

澄清一下,我没有兴趣讨论可以使用哪种网络协议来实现客户端和服务器之间的通信。我的问题是如何将函数及其依赖项封装为可以序列化和远程执行的单个对象。

我也对在远程服务器上运行任意代码的安全隐患不感兴趣 - 让我们说这个系统纯粹是为了研究而设计的,它位于一个防火墙严密的环境中。

【问题讨论】:

  • 是什么阻止您为客户端和服务器提供共享代码库?
  • Celery 不是天生就这样做的吗?我认为当您将函数定义为“任务”时,它们会被打包并发送给远程运行它们的工作人员,并使用您放入作业队列的参数。

标签: python grid


【解决方案1】:

看看PyRO(Python 远程对象)它能够在集群中的所有计算机上设置服务,并直接或通过名称服务器和发布-订阅机制间接调用它们。

【讨论】:

    【解决方案2】:

    听起来您想要执行以下操作。

    • 定义共享文件系统空间。

    • 将您的所有 python 源代码放在这个共享文件系统空间中。

    • 定义将“执行文件”代码块的简单代理或服务器。

    • 然后您的客户端联系代理(带有 POST 方法的 REST 协议适用于
      这)与代码块。 代理保存代码块并对该代码块执行execfile

    由于所有代理共享一个公共文件系统,它们都具有相同的 Python 库结构。

    我们使用一个简单的 WSGI 应用程序,我们称之为“批处理服务器”。我们有用于创建和检查远程请求的 RESTful 协议。

    【讨论】:

    • 协议 (REST) 稍微超出了这个问题的范围。共享python代码是个好主意,这实际上是我们目前的解决方案。问题是为了让代码进入服务器,它必须被共享(因此不是完全任意的)。
    • @Salim Fadhley:不是我说的。我说 REST 协议包含代码。代码保存到文件中。该文件由 execfile 处理。可以发送任意代码。仅预安装依赖项。
    • 明白,您的解决方案是“发送未编译的 python 代码”——这正是我在我的问题中提出的。我正在寻找一种替代方法来解决如果该代码在另一个文件中包含对用户开发的类的导入的问题。
    • 用户开发的类必须安装在共享目录中。在site-packages 中,或者在site-packages 中带有.pth 文件的用户特定目录中。
    【解决方案3】:

    Stackless 能够腌制和取消腌制正在运行的代码。不幸的是,当前的实现不支持此功能。

    【讨论】:

    • 有趣的答案 - 遗憾的是我坚持使用 python 2.4,但是这个得到了赞成!
    • 无堆栈的链接已损坏。
    • 谢谢,修复了链接并更新了无堆栈实现当前状态的答案。
    【解决方案4】:

    您可以使用现成的集群解决方案,例如 Parallel Python。您可以相对轻松地设置multiple remote slaves and run arbitrary code on them

    【讨论】:

      【解决方案5】:

      您可以使用 SSH 连接到远程 PC 并直接在另一台计算机上运行命令。你甚至可以将 python 代码复制到机器上并执行它。

      【讨论】:

      • 但是你怎么知道要复制什么?应该以什么形式复制?这本质上是一个问题。 SSHing 超出了问题的范围(见上文)。
      【解决方案6】:

      语法:

      猫 ./test.py | sshpass -p 'password' ssh user@remote-ip "python - script-arguments-if-any for test.py script"

      1) 这里的“test.py”是本地 python 脚本。 2) sshpass 用于将ssh密码传递给ssh连接

      【讨论】:

        猜你喜欢
        • 2015-09-20
        • 1970-01-01
        • 2022-01-17
        • 1970-01-01
        • 2011-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-21
        相关资源
        最近更新 更多