0

どのコマンドが実行されたかを知ることができる SSH デーモンをサーバーにデプロイしたいと考えています。しかし、ユーザーのコマンドを取得する方法がわかりません。twisted.conch.ssh.session に基づいて SSH サーバーを実現します。SSHSessionProcessProtocol の outReceived ですべての stdout を取得できますが、Linux($PS1) のプロンプトに大きく依存しているため、stdout からユーザーのコマンドを正確に抽出することは困難です。

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

1 に答える 1

0

あなたは正しいです; シェルへのユーザー入力と他のプログラムへのユーザー入力を区別することは (一般的には) 文字通り不可能であるため、ユーザーのコマンドを正確に取得することは非常に困難です。

Twisted 内で実行される独自のシェルを作成し、ユーザーが入力したコマンドをそこに記録することを検討してください。しかし、文字通りログインシェルを実行させたい場合は、運が悪い.

于 2016-04-22T01:17:33.430 に答える