python执行远程程序

Mat*_*son 4 python linux windows 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是否应该考虑使用?

Mat*_*son 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()
Run Code Online (Sandbox Code Playgroud)

这一直很好!