首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >python执行远程程序

python执行远程程序
EN

Stack Overflow用户
提问于 2010-07-13 13:23:15
回答 5查看 2.8K关注 0票数 4

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

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

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

因此,我认为使用Twisted.Conch可能只允许我在网络上执行一个命令,而不需要额外的运行web服务器的开销,但是我假设在Windows机器上运行ssh服务器也有开销。

除了web服务或ssh之外,我还可以使用Python在另一台机器上启动同步进程,或者web服务或ssh是最好的方法?另外,如果web服务或ssh是追求的最佳途径,那么是否应该考虑使用Twisted?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-07-22 14:50:18

最后我和SSH + Twisted一起去了。在windows机器上,我将freeSSHd设置为Windows服务。在试图让帕拉米科去上班的过程中,为了让我的公钥/私钥工作,我遇到了很多麻烦,于是我决定尝试Twisted,只花了几分钟就能让它正常工作。因此,我在Twisted文档的基础上编写/窃取了这个文档,以便从Linux实现我所需要的SSH客户端。

代码语言:javascript
复制
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()

这真是太棒了!

票数 5
EN

Stack Overflow用户

发布于 2010-07-13 14:36:48

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

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

票数 4
EN

Stack Overflow用户

发布于 2010-07-13 13:25:38

尝试QAMRabbitMQ

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3237558

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档