代码之家  ›  专栏  ›  技术社区  ›  Matthew J Morrison

python执行远程程序

  •  4
  • Matthew J Morrison  · 技术社区  · 14 年前

    我正在编写一个使用python并在Linux上运行的传统Windows应用程序。最初,新应用程序需要调用旧应用程序,以便在仍在使用旧应用程序的客户和使用新应用程序的客户之间获得一致的结果。

    所以我有一个Linux框,就在一个Windows框旁边,我希望Linux框上的一个进程在Windows框上执行一个命令并捕获结果(同步)。

    我最初的想法是在Windows框中编写一个Web服务,但这意味着除了旧的应用程序之外,还要在Windows计算机上运行一个Web服务器。

    因此,我认为使用twisted.conch可能只允许我通过网络执行一个命令,而不需要额外的运行Web服务器的开销,但是我 假定 在Windows计算机上运行ssh服务器也会产生开销。

    除了Web服务或ssh之外,我可以使用python在不同的机器上启动同步进程,或者Web服务或ssh是最好的方法吗?另外,如果Web服务或ssh是最好的路径,那么我应该考虑使用扭曲的东西吗?

    5 回复  |  直到 13 年前
        1
  •  5
  •   Matthew J Morrison    14 年前

    我最终选择了ssh+twisted。在Windows计算机上,我将freeshd设置为Windows服务。在黑客试图让帕拉米科工作后,在我的公共/私人钥匙工作中遇到了很多问题,我决定尝试扭曲,只需要几分钟就可以让它工作。因此,我基于扭曲的文档编写/窃取了这个代码,以完成我在Linux上的ssh客户端所需要的工作。

    from twisted.conch.ssh import transport
    from twisted.internet import defer
    from twisted.conch.ssh import keys, userauth
    from twisted.conch.ssh import connection
    from twisted.conch.ssh import channel, common
    from twisted.internet import protocol, reactor
    
    class ClientTransport(transport.SSHClientTransport):
        def verifyHostKey(self, pubKey, fingerprint):
            return defer.succeed(1)
        def connectionSecure(self):
            self.requestService(ClientUserAuth('USERHERE', ClientConnection()))
    
    class ClientUserAuth(userauth.SSHUserAuthClient):
        def getPassword(self, prompt=None):
            return 
        def getPublicKey(self):
            return keys.Key.fromString(data=publicKey)
        def getPrivateKey(self):
            return defer.succeed(keys.Key.fromString(data=privateKey))
    
    class ClientConnection(connection.SSHConnection):
        def serviceStarted(self):
            self.openChannel(CatChannel(conn=self))
    
    class CatChannel(channel.SSHChannel):
        name = 'session'
        def channelOpen(self, data):
            data = 'abcdefghijklmnopqrstuvwxyz' * 300
            self.return_data = ''
            self.conn.sendRequest(self, 'exec', common.NS('C:\helloworld %-10000s' % data), wantReply=True)
        def dataReceived(self, data):
            self.return_data += data
        def closed(self):
            print "got %d bytes of data back from Windows" % len(self.return_data)
            print self.return_data
            self.loseConnection()
            reactor.stop()
    
    if __name__ == "__main__":
        factory = protocol.ClientFactory()
        factory.protocol = ClientTransport
        reactor.connectTCP('123.123.123.123', 22, factory)
        reactor.run()
    

    这很管用!

        2
  •  4
  •   Simon Hibbs    14 年前

    另一个选择是帕拉米科。它是一个实现ssh的python库。我使用它远程执行命令,并将文件传输到运行ssh服务器的Windows设备。问题在于,由于windows命令shell的特殊性,它无法在Windows上正确捕获stdout。基于Twisted的解决方案可能也有同样的问题。

    你想要捕捉什么样的结果?

        3
  •  1
  •   Marcelo Cantos    14 年前

    尝试 QAM 具有 RabbitMQ .

        4
  •  1
  •   zovision    14 年前

    在我看来,RPC是正确的答案。

    我想:

    • 为Windows计算机使用simplexmlRpcServer
    • 在Linux机器上使用xmlrpclib

    从标准库中可以给你最大的自由。您实现了您所需要的,并且不必担心Windows API、过度传播的技术(如DCOM等),您在Python领域,甚至在Windows机器上。

    司扥噢特: Twisted当然总是一个很好的选择,所以不要担心;我认为AppleCaldav服务器也在Twisted上运行。

        5
  •  0
  •   jdthood ewall    13 年前

    我经常用一个叫 winexe 基于桑巴。

    这里是什么 command syntax 看起来,这里有一些 installation options .