To start things off, we're going to create a simple server that just gives you remote access to a Python interpreter. We will use a telnet client to access this server.
Run the following command at your shell prompt:
$ twistd telnet -p 4040 -u admin -w admin
The Application has a telnet server that you specified to be on port 4040, and it will start listening for connections on this port. Try connecting with your favorite telnet utility to 127.0.0.1 port 4040.
$ telnet localhost 4040 Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. twisted.manhole.telnet.ShellFactory Twisted 1.1.0 username: admin password: admin >>>
Now, you should see a Python prompt:
>>>
. You can type any valid Python code
here. Let's try looking around.
>>> dir() ['__builtins__']
Ok, not much. let's play a little more:
>>> import __main__ >>> dir(__main__) ['__builtins__', '__doc__', '__name__', 'os', 'run', 'string', 'sys'] >>> service <twisted.application.internet.TCPServer instance at 0x10270f48> >>> service._port <twisted.manhole.telnet.ShellFactory on 4040> >>> service.parent <twisted.application.service.MultiService instance at 0x1024d7a8>
The service object is the service used to serve the telnet shell,
and that it is listening on port 4040 with something called a
ShellFactory
.
Its parent is a twisted.application.service.MultiService
,
a collection of services. We can keep getting the parent attribute
of services until we hit the root of all services.
As you can see, this is quite useful - we can introspect a
running process, see the internal objects, and even change
their attributes. The telnet server can of course be used from straight
Python code; you can see how to do this by reading the code for
twisted.tap.telnet
.
A final note - if you want access to be more secure, you can even have the telnet server use SSL. Assuming you have the appropriate certificate and private key files, you can run:
$ twistd telnet -p ssl:443:privateKey=mykey.pem:certKey=cert.pem -u admin -w admin
See twisted.application.strports
for more examples of
options for listening on a port.