【问题标题】:Python SSH Server(twisted.conch) get the user's commandsPython SSH Server(twisted.conch) 获取用户的命令
【发布时间】:2016-04-21 02:33:50
【问题描述】:

我愿意在我的服务器上部署一个 SSH 守护程序,我可以知道执行了哪些命令。但我不知道如何获取用户的命令。 我实现了一个基于twisted.conch.ssh.session的SSH服务器。我可以在 SSHSessionProcessProtocol 的 outReceived 中得到所有的标准输出,但是很难准确地从标准输出中提取用户的命令,因为这在很大程度上依赖于 Linux($PS1) 的提示。

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

【问题讨论】:

    标签: python ssh twisted.internet twisted.conch


    【解决方案1】:

    你是对的;准确获取用户的命令非常困难,因为(在一般情况下)字面上不可能区分进入 shell 的用户输入和进入其他程序的用户输入。 p>

    您可能需要考虑编写自己的在 Twisted 中运行的 shell,并将用户键入的命令记录到其中。但如果你想让他们真正运行他们的登录 shell,那你就不走运了。

    【讨论】:

    • 谢谢,如果我想在 SSHSession 的 dataReceived 中从用户的标准输入中提取命令,而不是从标准输出中提取命令。我可以得到用户的输入流,其中可能包含退格、删除、home、左箭头、右箭头 keyStroke 等等,比如 'lsss\x1b[D\x08\x08\r' 其中 keyStrok 是 'l s s s left-arrow退格退格' 。但是我怎样才能得到'ls'的最后一个结果。
    • Twisted 在twisted.conch.insults 中有一些实用程序用于自己进行键盘输入,但前提是您正在编写自己的基于终端的 UI。如果您想将该输入流解析为命令,则需要为它编写自己的解析器。
    最近更新 更多