扭曲的井盖:如何在应用中访问服务器?
我需要在运行时连接到我的twisted应用程序,我正在尝试让twisted.manhole为我工作。我的系统是Mac OSX 10.6,默认安装了twisted 8.2。
使用twistd的示例服务器可以正常工作。启动时会有关于md5、sha和twisted.protocols.telnet的弃用警告,但manhole服务器实际上能正常工作,我可以访问我应用程序的内部信息:
host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
twisted.manhole.telnet.ShellFactory
Twisted 8.2.0
username: admin
password: *****
>>> dir()
['_', '__builtins__', 'factory', 'service']
>>> factory
<twisted.manhole.telnet.ShellFactory instance at 0x101256440>
>>> service
<twisted.application.internet.TCPServer instance at 0x10124ff38>
>>> service.parent
<twisted.application.service.MultiService instance at 0x1014b0cf8>
>>>
现在我尝试将这个集成到我的应用程序中:
# test_manhole.tac
from twisted.application.internet import TCPServer
from twisted.application.service import Application, IServiceCollection
from twisted.manhole.telnet import ShellFactory
shell_factory = ShellFactory()
shell_factory.username = 'admin'
shell_factory.password = 'admin'
shell_factory.namespace['some_value'] = 42
shell_tcp_server = TCPServer(4040, shell_factory)
application = Application('test')
serviceCollection = IServiceCollection(application)
shell_tcp_server.setServiceParent(serviceCollection)
在一个终端中运行上面的代码:
host:server user$ twistd -noy test_manhole.tac
(omitting the same DeprecationWarnings about md5, sha and twisted.protocols.telnet as earlier)
2011-08-24 16:52:13+1000 [-] Log opened.
2011-08-24 16:52:13+1000 [-] twistd 8.2.0 (/usr/bin/python2.6 2.6.1) starting up.
2011-08-24 16:52:13+1000 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2011-08-24 16:52:13+1000 [-] twisted.manhole.telnet.ShellFactory starting on 4040
2011-08-24 16:52:13+1000 [-] Starting factory <twisted.manhole.telnet.ShellFactory instance at 0x1012cfdd0>
2011-08-24 16:52:13+1000 [-] start service: <twisted.application.internet.TCPServer instance at 0x1012cff80>
在第二个终端中,运行一个telnet客户端:
host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
twisted.manhole.telnet.ShellFactory
Twisted 8.2.0
username: admin
password: *****
>>> dir()
['_', '__builtins__', 'factory', 'service', 'some_value']
>>> factory
<twisted.manhole.telnet.ShellFactory instance at 0x1012cfdd0>
>>> service
>>> service == None
True
>>> service.parent
...
exceptions.AttributeError: 'NoneType' object has no attribute 'parent'
>>> some_value
42
看起来这个服务对象无法用来访问应用程序的内部信息。
好的,因为twisted.protocols.telnet
似乎已经被twisted.conch.telnet
取代,所以我尝试使用更新的模块:
# test_manhole_2.tac
from twisted.application.service import Application, IServiceCollection
from twisted.conch.manhole_tap import makeService
options = \
{
# for some reason, these must
# all exist, even if None
'namespace' : None,
'passwd' : 'users.txt',
'sshPort' : None,
'telnetPort' : '4040',
}
shell_service = makeService(options)
application = Application('test')
serviceCollection = IServiceCollection(application)
shell_service.setServiceParent(serviceCollection)
“密码文件”users.txt
可以只包含一行示例用户名和密码,比如admin:admin
。
启动测试服务器:
host:server user$ twistd -noy test_manhole_2.tac
(omitting DeprecationWarnings about md5 and sha)
2011-08-24 17:44:26+1000 [-] Log opened.
2011-08-24 17:44:26+1000 [-] twistd 8.2.0 (/usr/bin/python2.6 2.6.1) starting up.
2011-08-24 17:44:26+1000 [-] reactor class: twisted.internet.selectreactor.SelectReactor.
2011-08-24 17:44:26+1000 [-] twisted.internet.protocol.ServerFactory starting on 4040
2011-08-24 17:44:26+1000 [-] Starting factory <twisted.internet.protocol.ServerFactory instance at 0x10181e710>
2011-08-24 17:44:26+1000 [-] start service: <twisted.application.service.MultiService instance at 0x1012553b0>
2011-08-24 17:44:26+1000 [-] start service: <twisted.application.internet.TCPServer instance at 0x10181e998>
在第二个终端中,运行一个telnet客户端——注意,有些内容实际上是猜测,因为有问题的Mac OSX readline(或者其他什么原因)似乎吞掉了一些终端输出:
host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Username: admin
Password: *****
>>> dir()
['__builtins__']
所以现在看起来我从一个无用的service
对象变成了根本没有对象。
twisted.manhole应该怎么正确使用呢?
1 个回答
4
继续使用 twisted.conch
,然后在命名空间字典里放一些东西。
namespace = {"your_application_object": some_object}
options = {
# for some reason, these must
# all exist, even if None
'namespace' : namespace,
'passwd' : 'users.txt',
'sshPort' : None,
'telnetPort' : '4040',
}