python执行远程程序

python执行远程程序,python,windows,linux,twisted,Python,Windows,Linux,Twisted,我正在使用Python编写一个在Linux上运行的遗留Windows应用程序。最初,新应用程序需要调用遗留应用程序,以便我们在仍然使用遗留应用程序的客户和使用新应用程序的客户之间获得一致的结果 所以我有一个Linux盒子,就在Windows盒子旁边,我想要Linux盒子上的一个进程在Windows盒子上执行一个命令并捕获结果(同步) 我最初的想法是在Windows机器上编写一个web服务,但这意味着除了传统应用程序之外,还要在Windows机器上运行一个web服务器 因此,我认为使用Twiste

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

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

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

因此,我认为使用Twisted.Conch可能允许我在网络上执行命令,而无需运行web服务器的额外开销,但我假设在Windows计算机上运行ssh服务器也会有开销


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

尝试。

< P>我经常使用一个名为“代码> WiXeE的小程序,基于SAMBA。< /P>
下面是它的外观,下面是一些。

另一个选项是paramiko。它是一个实现SSH的Python库。我使用它远程执行命令,并将文件传输到运行SSH服务器的windows机箱。问题是,由于windows命令shell的特殊性,它无法在windows上正确捕获标准输出。基于twisted的解决方案也可能存在同样的问题


你想得到什么样的结果?

RPC是正确的答案

我认为:

  • 在windows计算机上使用SimpleXMLRPCServer
  • 在linux机器上使用xmlrpclib
从标准的图书馆将给你最大的自由。您实现了您所需要的,并且不必担心windows API、过度膨胀的技术(如DCOM)等,您身处python之地,甚至在windows机器上也是如此

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

我最终选择了SSH+Twisted。在windows计算机上,我将freeshd设置为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()

这一直很有效

谢谢,我会看一看-如果我最终在提交的任何其他答案上使用这个,我会接受这个。同步-意思是“实时”,我希望Linux上的执行暂停,等待Windows的响应。与异步方式不同的是,我将向Windows提交一些工作单元,然后在Linux上继续执行其他操作,并在Windows完成时收到通知。这可能会起作用-我对能够找到的文档的缺乏感到有点厌烦。可以理解。安装中似乎也没有包含手册页,但至少
winexe--help
给出了所有命令选项的完整列表。我还不完全确定结果会是什么样子,在这一点上,我假设我需要从stdout获得它们。我接受这个答案,并不是因为它一定是“正确的”,我不认为这个问题的答案是对的或错的,但我将使用SSH路由,并且很可能使用Paramiko。