[Twisted-Python] question about twisted conch (SSH) and wxPython

Astan Chee stanc at al.com.au
Mon Jul 18 01:51:14 EDT 2005


Hi Guys,
Im trying to make a psudo SSH client GUI, but it seems that I although I 
can 'ls' to a remote machine using twisted.conch, I cant `ls -al`. Also 
I cant seem to to ssh commands that have spaces in them. Although Im 
using a windows environment to SSH, i dont think that is the problem.
Here is a snippet of my code. Obviously I've already called 
reactor.run() and included appropriate modules and variables. I dont 
understand why ls works and ls -al doesnt. Also I was wondering if there 
are any existing command line SSH clients written with twisted similar 
to putty, but written in python.
Thanks!

class SimpleTransport(transport.SSHClientTransport):
    def verifyHostKey(self, hostKey, fingerprint):
        print 'host key fingerprint: %s' % fingerprint
        return defer.succeed(1)

    def connectionSecure(self):
        self.requestService(
            SimpleUserAuth(USER,
                SimpleConnection()))

class SimpleUserAuth(userauth.SSHUserAuthClient):
    def getPassword(self):
        return defer.succeed(PASSWORD)

    def getGenericAnswers(self, name, instruction, questions):
        print 'Name %s' % name
        print 'Instruction %s' % instruction
        answers = []
        for prompt, echo in questions:
            if echo:
                answer = raw_input(prompt)
            else:
                answer = getpass.getpass(prompt)
            answers.append(answer)
        return defer.succeed(answers)
           
    def getPublicKey(self):
        path = os.path.expanduser('~/.ssh/id_dsa')
        # this works with rsa too
        # just change the name here and in getPrivateKey
        if not os.path.exists(path) or self.lastPublicKey:
            # the file doesn't exist, or we've tried a public key
            return
        return keys.getPublicKeyString(path+'.pub')

    def getPrivateKey(self):
        path = os.path.expanduser('~/.ssh/id_dsa')
        return defer.succeed(keys.getPrivateKeyObject(path))

class SimpleConnection(connection.SSHConnection):
    def serviceStarted(self):
        self.openChannel(TrueChannel(2**16, 2**15, self))
        self.openChannel(FalseChannel(2**16, 2**15, self))
        self.openChannel(LsChannel(2**16, 2**15, self))

class TrueChannel(channel.SSHChannel):
    name = 'session' # needed for commands

    def openFailed(self, reason):
        print 'true failed', reason
   
    def channelOpen(self, ignoredData):
        self.conn.sendRequest(self, 'exec', common.NS('true'))

    def request_exit_status(self, data):
        status = struct.unpack('>L', data)[0]
        #print 'true status was: %s' % status
        self.loseConnection()

class FalseChannel(channel.SSHChannel):
    name = 'session'

    def openFailed(self, reason):
        print 'false failed', reason

    def channelOpen(self, ignoredData):
        self.conn.sendRequest(self, 'exec', common.NS('false'))

    def request_exit_status(self, data):
        status = struct.unpack('>L', data)[0]
        #print 'false status was: %s' % status
        self.loseConnection()
       
class LsChannel(channel.SSHChannel):
    name = 'session'

    def openFailed(self, reason):
        print 'false failed', reason

    def channelOpen(self, ignoredData):
        self.conn.sendRequest(self, 'exec', common.NS('ls -al'))
        self.data = ''

    def dataReceived(self, data):
        self.data += data

    def closed(self):
        print 'got data from ls: %s' % repr(self.data)
        self.loseConnection()
        reactor.stop()
       
class CatChannel(channel.SSHChannel):
    name = 'session'

    def openFailed(self, reason):
        print 'echo failed', reason

    def channelOpen(self, ignoredData):
        self.data = ''
        d = self.conn.sendRequest(self, 'exec', common.NS('cat'), 
wantReply = 1)
        d.addCallback(self._cbRequest)

    def _cbRequest(self, ignored):
        self.write('hello conch\n')
        self.conn.sendEOF(self)

    def dataReceived(self, data):
        self.data += data

    def closed(self):
        print 'got data from cat: %s' % repr(self.data)
        self.loseConnection()





More information about the Twisted-Python mailing list