~soren/nova/iptables-security-groups

« back to all changes in this revision

Viewing changes to vendor/Twisted-10.0.0/doc/conch/examples/sshsimpleserver.py

  • Committer: Jesse Andrews
  • Date: 2010-05-28 06:05:26 UTC
  • Revision ID: git-v1:bf6e6e718cdc7488e2da87b21e258ccc065fe499
initial commit

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
#!/usr/bin/env python
 
2
 
 
3
# Copyright (c) 2009 Twisted Matrix Laboratories.
 
4
# See LICENSE for details.
 
5
 
 
6
from twisted.cred import portal, checkers
 
7
from twisted.conch import error, avatar
 
8
from twisted.conch.checkers import SSHPublicKeyDatabase
 
9
from twisted.conch.ssh import factory, userauth, connection, keys, session
 
10
from twisted.internet import reactor, protocol, defer
 
11
from twisted.python import log
 
12
from zope.interface import implements
 
13
import sys
 
14
log.startLogging(sys.stderr)
 
15
 
 
16
"""
 
17
Example of running another protocol over an SSH channel.
 
18
log in with username "user" and password "password".
 
19
"""
 
20
 
 
21
class ExampleAvatar(avatar.ConchUser):
 
22
 
 
23
    def __init__(self, username):
 
24
        avatar.ConchUser.__init__(self)
 
25
        self.username = username
 
26
        self.channelLookup.update({'session':session.SSHSession})
 
27
 
 
28
class ExampleRealm:
 
29
    implements(portal.IRealm)
 
30
 
 
31
    def requestAvatar(self, avatarId, mind, *interfaces):
 
32
        return interfaces[0], ExampleAvatar(avatarId), lambda: None
 
33
 
 
34
class EchoProtocol(protocol.Protocol):
 
35
    """this is our example protocol that we will run over SSH
 
36
    """
 
37
    def dataReceived(self, data):
 
38
        if data == '\r':
 
39
            data = '\r\n'
 
40
        elif data == '\x03': #^C
 
41
            self.transport.loseConnection()
 
42
            return
 
43
        self.transport.write(data)
 
44
 
 
45
publicKey = 'ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAGEArzJx8OYOnJmzf4tfBEvLi8DVPrJ3/c9k2I/Az64fxjHf9imyRJbixtQhlH9lfNjUIx+4LmrJH5QNRsFporcHDKOTwTTYLh5KmRpslkYHRivcJSkbh/C+BR3utDS555mV'
 
46
 
 
47
privateKey = """-----BEGIN RSA PRIVATE KEY-----
 
48
MIIByAIBAAJhAK8ycfDmDpyZs3+LXwRLy4vA1T6yd/3PZNiPwM+uH8Yx3/YpskSW
 
49
4sbUIZR/ZXzY1CMfuC5qyR+UDUbBaaK3Bwyjk8E02C4eSpkabJZGB0Yr3CUpG4fw
 
50
vgUd7rQ0ueeZlQIBIwJgbh+1VZfr7WftK5lu7MHtqE1S1vPWZQYE3+VUn8yJADyb
 
51
Z4fsZaCrzW9lkIqXkE3GIY+ojdhZhkO1gbG0118sIgphwSWKRxK0mvh6ERxKqIt1
 
52
xJEJO74EykXZV4oNJ8sjAjEA3J9r2ZghVhGN6V8DnQrTk24Td0E8hU8AcP0FVP+8
 
53
PQm/g/aXf2QQkQT+omdHVEJrAjEAy0pL0EBH6EVS98evDCBtQw22OZT52qXlAwZ2
 
54
gyTriKFVoqjeEjt3SZKKqXHSApP/AjBLpF99zcJJZRq2abgYlf9lv1chkrWqDHUu
 
55
DZttmYJeEfiFBBavVYIF1dOlZT0G8jMCMBc7sOSZodFnAiryP+Qg9otSBjJ3bQML
 
56
pSTqy7c3a2AScC/YyOwkDaICHnnD3XyjMwIxALRzl0tQEKMXs6hH8ToUdlLROCrP
 
57
EhQ0wahUTCk1gKA4uPD6TMTChavbh4K63OvbKg==
 
58
-----END RSA PRIVATE KEY-----"""
 
59
 
 
60
 
 
61
class InMemoryPublicKeyChecker(SSHPublicKeyDatabase):
 
62
 
 
63
    def checkKey(self, credentials):
 
64
        return credentials.username == 'user' and \
 
65
            keys.getPublicKeyString(data=publicKey) == credentials.blob
 
66
 
 
67
class ExampleSession:
 
68
    
 
69
    def __init__(self, avatar):
 
70
        """
 
71
        We don't use it, but the adapter is passed the avatar as its first
 
72
        argument.
 
73
        """
 
74
 
 
75
    def getPty(self, term, windowSize, attrs):
 
76
        pass
 
77
    
 
78
    def execCommand(self, proto, cmd):
 
79
        raise Exception("no executing commands")
 
80
 
 
81
    def openShell(self, trans):
 
82
        ep = EchoProtocol()
 
83
        ep.makeConnection(trans)
 
84
        trans.makeConnection(session.wrapProtocol(ep))
 
85
 
 
86
    def eofReceived(self):
 
87
        pass
 
88
 
 
89
    def closed(self):
 
90
        pass
 
91
 
 
92
from twisted.python import components
 
93
components.registerAdapter(ExampleSession, ExampleAvatar, session.ISession)
 
94
 
 
95
class ExampleFactory(factory.SSHFactory):
 
96
    publicKeys = {
 
97
        'ssh-rsa': keys.Key.fromString(data=publicKey)
 
98
    }
 
99
    privateKeys = {
 
100
        'ssh-rsa': keys.Key.fromString(data=privateKey)
 
101
    }
 
102
    services = {
 
103
        'ssh-userauth': userauth.SSHUserAuthServer,
 
104
        'ssh-connection': connection.SSHConnection
 
105
    }
 
106
    
 
107
 
 
108
portal = portal.Portal(ExampleRealm())
 
109
passwdDB = checkers.InMemoryUsernamePasswordDatabaseDontUse()
 
110
passwdDB.addUser('user', 'password')
 
111
portal.registerChecker(passwdDB)
 
112
portal.registerChecker(InMemoryPublicKeyChecker())
 
113
ExampleFactory.portal = portal
 
114
 
 
115
if __name__ == '__main__':
 
116
    reactor.listenTCP(5022, ExampleFactory())
 
117
    reactor.run()