扭曲检修孔:如何访问应用程序中的服务器?

2024-05-23 15:48:42 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要在运行时连接到我的twisted应用程序,我正试图让twisted.manhole为我工作。我在MacOSX10.6上,默认安装Twisted8.2。在

sample server using twistd起作用了。在启动时有关于md5、sha和twisted.protocols.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']
>>> 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>
>>> 

现在,我尝试将其集成到我的应用程序中:

^{pr2}$

在shell中运行上述代码:

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>

在第二个shell中,运行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>

在第二个shell中,运行telnet客户端-请注意,其中一些实际上是猜测,因为有缺陷的Mac OSX readline(或其他原因)似乎吞下了一些shell输出:

host:client user$ telnet localhost 4040
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
Username: admin
Password: *****

>>> dir()
['__builtins__']

所以现在看来我已经从一个无用的service对象变成了根本没有对象。在

怎么样扭曲人孔正确使用?在


Tags: instancelocalhosthostapplicationfactoryservicetwistedshell
1条回答
网友
1楼 · 发布于 2024-05-23 15:48:42

继续使用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',
}

相关问题 更多 >