2016-04-21 26 views
0

我願意在我的服務器上部署一個SSH守護進程,我可以知道哪些命令已執行。但我不知道如何獲取用戶的命令。 我實現了一個基於twisted.conch.ssh.session的SSH服務器。我可以在SSHSessionProcessProtocol的outReceived中獲得所有stdout,但是很難準確地從stdout中提取用戶的命令,因爲這很大程度上依賴於Linux($ PS1)的提示。Python SSH服務器(twisted.conch)獲取用戶命令

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() 

回答

0

你是對的;要準確獲取用戶的命令是非常困難的,因爲(通常情況下)字面上不可能來區分進入shell的用戶輸入和轉到其他程序的用戶輸入。

您可能想要考慮編寫自己的Twisted內部運行的shell,並將用戶鍵入的命令記錄到該文件中。但如果你想讓他們真正運行他們的登錄shell,那麼你運氣不好。

+0

謝謝,如果我想從用戶的stdin提取SSHSession的dataReceived中的命令,而不是從stdout中提取命令。我可以得到用戶的輸入流,其中可能包含退格,刪除,home,左箭頭,右箭頭keyStroke等,如'lsss \ x1b [D \ x08 \ x08 \ r',其中keyStrok是'lsss left-arrow退格退格「。但我怎麼能得到'ls'的最後結果。 – chzijian

+0

Twisted在'twisted.conch.insults'中有一些實用程序用於自己執行鍵盤輸入,但如果您正在編寫自己的基於終端的用戶界面,那就是。如果你想把這個輸入流解析成一個命令,你需要爲它編寫你自己的解析器。 – Glyph

相關問題