2016-04-21 18 views
0

Ich bin bereit, auf meinem Server einen SSH-Daemon bereitzustellen, von dem ich weiß, welche Befehle ausgeführt wurden. Aber ich weiß nicht, wie man die Befehle des Benutzers bekommt. Ich erreiche einen SSH-Server basierend auf twisted.conch.ssh.session. Ich kann alle outdoReceived von SSHSessionProcessProtocol erhalten, aber es ist schwierig, die Befehle des Benutzers aus dem stdout genau zu extrahieren, weil diese stark auf die Eingabeaufforderung von Linux ($ PS1) angewiesen sind.Python SSH Server (twisted.conch) bekomme die Befehle des Benutzers

import sys 
    import checkers 
    from twisted.python import components, log, logfile 
    from twisted.cred import portal 
    from twisted.internet import reactor 
    from twisted.conch.ssh import factory, keys, session, filetransfer 
    from twisted.conch.unix import UnixSSHRealm, SSHSessionForUnixConchUser, UnixConchUser 
    import keyvalue 
    if __name__ == "__main__": 
     sshFactory = factory.SSHFactory() 
     sshFactory.portal = portal.Portal(UnixSSHRealm()) 
     sshFactory.portal.registerChecker(checkers.UsernamePasswordChecker()) 

     sshFactory.publicKeys = { 
     'ssh-rsa': keys.Key.fromString(keyvalue.publicKey)} 
     sshFactory.privateKeys = { 
     'ssh-rsa': keys.Key.fromString(keyvalue.privateKey)} 
     components.registerAdapter(
     SSHSessionForUnixConchUser, UnixConchUser, session.ISession) 
     log.startLogging(sys.stdout) 

     reactor.listenTCP(2222, sshFactory) 
     reactor.run() 

Antwort

0

Sie haben Recht; es ist sehr schwierig, die Befehle des Benutzers genau zu erhalten, weil es (im allgemeinen Fall) wörtlich unmöglich ist, zwischen Benutzereingaben zu unterscheiden, die an die Shell gehen, und Benutzereingaben, die zu anderen Programmen gehen.

Sie sollten in Erwägung ziehen, Ihre eigene Shell zu schreiben, die in Twisted ausgeführt wird, und die Befehle zu protokollieren, die der Benutzer in diese eingibt. Aber wenn Sie möchten, dass sie buchstäblich ihre Login-Shell ausführen, haben Sie kein Glück.

+0

danke, wenn ich die Befehle aus dem Benutzer stdin in dataReceived von SSHSession, nicht aus stdout extrahieren will. Ich kann den Eingabestrom des Benutzers erhalten, der Backspace, Delete, Home, Linkspfeil, Rechtspfeil keyStroke usw. enthalten kann, wie 'lsss \ x1b [D \ x08 \ x08 \ r' welche keyStrok sind 'lsss left-arrow Backspace-Rücktaste '. Aber wie kann ich die letzten Ergebnisse bekommen, die 'ls' sind? – chzijian

+0

Twisted hat einige Dienstprogramme in 'twisted.conch.insults' für die Tastatureingabe selbst, aber das wäre, wenn Sie Ihre eigene Terminal-basierte UI schreiben würden. Wenn Sie diesen Eingabestream in einen Befehl einlesen möchten, müssen Sie einen eigenen Parser dafür schreiben. – Glyph