在RPyC中传递函数参数

2 投票
2 回答
1753 浏览
提问于 2025-04-18 13:55

我想把很多逻辑封装成一个Python函数,然后把这个函数当作参数传给远程的RPyC方法,希望在服务器上执行这个函数。但是RPyC把这个函数当作回调函数,在本地执行。有没有办法解决这个问题?我能不能强制服务器在服务器上执行这个函数,而不是在客户端执行?

谢谢。

2 个回答

1

RPyC可以传输一些基本的数据类型,比如int(整数)、long(长整数)、bool(布尔值)、str(字符串)、float(浮点数)、unicode(Unicode字符)、bytes(字节)、slice(切片)、complex(复数)、tuple(元组,包含简单类型)、forzenset(不可变集合,包含简单类型),还有一些特殊的值,比如None(空值)、NotImplemented(未实现)和Ellipsis(省略号)

。这意味着你可以发送Unicode字符,也可以把代码作为字符串发送,然后在服务器端用eval来执行它。

不过要注意,如果这样做的话,我就可以在你的服务器上执行一些像os.unlink(sys.argv[0])这样的命令,或者其他你可能不想让它执行的东西。换句话说,允许服务器运行任意代码是一个巨大的安全隐患。

如果你是在服务器与服务器之间的情况下,这样做是可以的,但我觉得你可能并不需要这样,除非你完全信任双方。但如果是客户端与服务器的应用,那就不行了。

如果你决定这样做,使用eval可能不是一个好的选择,因为这会让你的服务器暴露得太多。你需要探索一些方法来限制可能性,根据你想让你的bunch of logic做什么,搜索一下“python eval security”,你会发现一些有趣的讨论。

3

teleport_function这个功能让我可以把客户端的函数传送到服务器上。

http://rpyc.readthedocs.org/en/latest/api/utils_classic.html#rpyc.utils.classic.teleport_function

撰写回答