python - 连接到 RPC 服务器的安全方式

标签 python xmlrpclib

此问题与 How do we handle Python xmlrpclib Connection Refused? 有关

当我尝试使用以下代码时,我的 RPC 服务器关闭,_get_rpc() 返回 False,我很高兴。但是,如果服务器正在运行,它会以未知的方法失败。它是否试图在远程服务器上执行 .connect() ?当我需要使用 .connect() 来检测返回的代理是否有效(请参阅相关问题)时,我该如何解决这个问题?

import xmlrpclib
import socket

def _get_rpc():
    try:
        a = xmlrpclib.ServerProxy('http://dd:LNXFhcZnYshy5mKyOFfy@127.0.0.1:9001')
        a.connect()     # Try to connect to the server
        return a.supervisor
    except socket.error:
        return False


if not _get_rpc():
    print "Failed to connect"

这是问题:
ahiscox@lenovo:~/code/dd$ python xmlrpctest2.py
Failed to connect
ahiscox@lenovo:~/code/dd$ supervisord -c ~/.supervisor # start up RPC server
ahiscox@lenovo:~/code/dd$ python xmlrpctest2.py
Traceback (most recent call last):
  File "xmlrpctest2.py", line 13, in <module>
    if not _get_rpc():
  File "xmlrpctest2.py", line 7, in _get_rpc
    a.connect()     # Try to connect to the server
  File "/usr/lib/python2.6/xmlrpclib.py", line 1199, in __call__
    return self.__send(self.__name, args)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1489, in __request
    verbose=self.__verbose
  File "/usr/lib/python2.6/xmlrpclib.py", line 1253, in request
    return self._parse_response(h.getfile(), sock)
  File "/usr/lib/python2.6/xmlrpclib.py", line 1392, in _parse_response
    return u.close()
  File "/usr/lib/python2.6/xmlrpclib.py", line 838, in close
    raise Fault(**self._stack[0])
xmlrpclib.Fault: <Fault 1: 'UNKNOWN_METHOD'>

最佳答案

好吧,我只是在研究它;我的旧方法很烂,因为 xmlrpclib.ServerProxy在调用方法时尝试连接到 XmlRPC 服务器,而不是之前!

试试这个:

import xmlrpclib
import socket

def _get_rpc():
    a = xmlrpclib.ServerProxy('http://dd:LNXFhcZnYshy5mKyOFfy@127.0.0.1:9001')

    try:
        a._()   # Call a fictive method.
    except xmlrpclib.Fault:
        # connected to the server and the method doesn't exist which is expected.
        pass
    except socket.error:
        # Not connected ; socket error mean that the service is unreachable.
        return False, None

    # Just in case the method is registered in the XmlRPC server
    return True, a

connected, server_proxy = _get_rpc():
if not connected
    print "Failed to connect"
    import sys
    sys.exit(1)

总结一下,我们有3个案例:
  • XmlRPC 服务器已启动,我们在其中定义了一个名为 _() 的方法:
    ( 编辑 :我确实选择了名称 _ 因为它不太可能有具有此名称的方法,但这种情况仍然可能发生)
    在这种情况下,不会捕获异常并且代码将执行return True
  • XmlRPC 服务器已启动,其中我们没有任何方法调用
    _()
    :
    这次xmlrpclib.Fault将被提出,我们也将传递给 return True
  • XmlRPC 服务器已关闭 :
    现在socket.error将引发异常,并且
    当我们调用 a._()所以我们应该return False

  • 我不知道是否有一种简单的方法可以做到这一点,我很乐意在那之前看到它,希望这次能解决问题:)

    N.B:当你做 if a: python会再次搜索方法__nonzero__()测试 a 的 bool 值这将失败。

    N.B 2: 一些 xmlrpc 服务提供了一个专门用于进行身份验证的 rpc 路径,在这个路径中服务提供了类似 login() ... 的方法,这种方法可以代替我们案例中的 _() 方法,所以只需调用 login (),就足以知道服务是启动还是关闭(socket.error),同时如果服务启动,这个 login() 方法对用户进行身份验证。

    关于python - 连接到 RPC 服务器的安全方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4716598/

    相关文章:

    python - 通过 sqlalchemy 关系通过 backref 属性获取 parent 的 child 会导致不必要的刷新

    python - 如何将字典中的值放入变量

    python - 如何使用 DJango 在网络浏览器中显示 rsync --progress?

    python - 如何在 python 脚本中隐藏我的登录名和密码?

    python - 将 Python xmlrpclib 与 unix 域套接字一起使用?

    python - 使用 python ping Pingomatic (XMLRPC) 时出错

    python - Numpy 数组 : group by one column, 求和另一个

    python - 如何通过 Plone 中的完整路径检查文件夹是否存在?

    python - 如何在 python 中创建自定义 xmlrpc 故障错误

    java - 如何从 Java 客户端对 ejabberd 进行基于访问的 xmlrpc 调用?