python执行远程程序

时间:2010-07-13 13:23:15

标签: python windows linux twisted

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

所以我有一个Linux盒子,坐在Windows盒子旁边,我想在Linux盒子上执行一个进程,在Windows盒子上执行命令并同步捕获结果。

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

那么我认为使用Twisted.Conch可能只允许我通过网络执行命令而不需要运行Web服务器的额外开销,但我假设运行Windows机器上的ssh服务器。

除了Web服务或ssh之外,我可以使用Python在不同的计算机上启动同步过程有哪些替代方法,或者是Web服务或ssh最好的方法?另外,如果Web服务或ssh是最好的路径,Twisted是否应该考虑使用?

5 个答案:

答案 0 :(得分:5)

我最终选择了SSH + Twisted。在Windows机器上,我将freeSSHd设置为Windows服务。在试图让paramiko工作并遇到大量问题让我的公钥/私钥工作之后,我决定尝试使用Twisted,并且只需要几分钟就能完成它。因此,我根据Twisted文档编写/窃取了这个内容,以便从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()

这一直很有效!

答案 1 :(得分:4)

另一种选择是paramiko。它是一个实现SSH的Python库。我用它来远程执行命令并将文件传输到运行SSH服务器的Windows框。问题是由于windows命令shell的特殊性,它无法在Windows上正确捕获stdout。基于twisted的解决方案可能会遇到同样的问题。

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

答案 2 :(得分:1)

使用QAM尝试RabbitMQ

答案 3 :(得分:1)

RPC是IMO的正确答案。

我想:

  • 将SimpleXMLRPCServer用于Windows机器
  • 使用xmlrpclib作为linux机器
来自标准库的

会给你最大的自由。你实现了你需要的东西,你不必担心Windows API,过度使用DCOM等技术,你在python领域,甚至在Windows机器上。

旁注: 扭曲当然总是一个很好的选择,所以不要担心;我认为Apples CalDav服务器也在Twisted上运行。

答案 4 :(得分:0)

我经常使用一个名为winexe的小程序,基于Samba。

这是command syntax的样子,这里有一些installation options