2010-07-13 9 views
4

Je réécris une application Windows héritée en utilisant Python et en cours d'exécution sur Linux. Initialement, la nouvelle application doit appeler l'application héritée afin que nous obtenions des résultats cohérents entre les clients utilisant toujours l'application héritée et les clients utilisant la nouvelle application. J'ai donc une machine Linux, assise juste à côté d'une boîte Windows et je veux un processus sur la machine Linux pour exécuter une commande sur la machine Windows et capturer le résultat (de manière synchrone). Ma première pensée était d'écrire un service Web sur la boîte de Windows, mais cela signifierait l'exécution d'un serveur Web sur la machine Windows en plus de l'application héritée.python exécuter le programme distant

Alors je pensais que l'utilisation Twisted.Conch pourrait me permettre de simplement exécuter une commande sur le réseau sans charge supplémentaire de l'exécution d'un serveur web, mais je suppose il y a aussi en tête avec l'exécution d'un serveur ssh sur le Machine Windows Quelles sont les autres façons de lancer un processus synchrone sur un autre ordinateur, en utilisant Python, en plus d'un service Web ou SSH, ou est-ce qu'un service Web ou SSH est la meilleure approche? Aussi, si un service web ou SSH sont les meilleurs itinéraires à suivre, est-ce que Twisted est quelque chose que je devrais envisager d'utiliser?

+2

synchrone - ce qui signifie «en temps réel», je veux que l'exécution sur Linux fasse une pause et attende une réponse de Windows. Par opposition à asynchrone où je voudrais soumettre une unité de travail à Windows, puis continuer à faire d'autres choses sur Linux et être averti lorsque Windows a été fini. –

Répondre

5

Sur la machine Windows, j'installe freeSSHd en tant que service Windows. Après avoir essayé de faire fonctionner Paramiko et de rencontrer des tonnes de problèmes pour faire fonctionner mes clés publiques/privées, j'ai décidé d'essayer Twisted, et cela n'a pris que quelques minutes pour que ça fonctionne. Donc, j'ai écrit/volé ce basé sur la documentation Twisted pour accomplir ce dont j'avais besoin en ce qui concerne le côté client SSH de Linux.

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() 

Cela a fonctionné très bien!

1

Essayez QAM avec RabbitMQ.

+1

Merci, je vais jeter un coup d'oeil - si je finis par l'utiliser sur les autres réponses soumises, je vais accepter celui-ci. –

0

J'utilise fréquemment un petit programme appelé winexe, basé sur Samba.

Voici ce que l'command syntax ressemble, et voici quelques installation options.

+0

cela pourrait potentiellement fonctionner - je suis un peu éteint par le manque de documentation que j'ai pu trouver. –

+0

Compréhensible. Il ne semble pas y avoir une page de manuel incluse avec l'installation, mais au moins 'winexe --help' donne une liste très complète de toutes les options de commande. – ewall

4

Une autre option est paramiko. C'est une bibliothèque Python qui implémente SSH. Je l'ai utilisé pour exécuter à distance des commandes et transférer des fichiers vers des boîtes de fenêtres exécutant un serveur SSH. Le problème est qu'il ne capture pas correctement stdout sur les fenêtres en raison des particularités de la commande shell Windows. Vous pouvez avoir le même problème avec une solution basée sur tordu.

Quels types de résultats tentez-vous de capturer? RPC est la bonne réponse IMO.

+0

Je ne suis pas encore tout à fait sûr de ce que les résultats vont ressembler, à ce stade, je suppose que je vais avoir besoin de les obtenir à partir de stdout. –

+0

J'accepte cette réponse, pas parce qu'elle est nécessairement "correcte" Je ne pense pas qu'il y ait vraiment une bonne ou une mauvaise réponse à cette question, mais je vais aller sur la route SSH et utiliser probablement Paramiko. –

1

Je pense:

  • utilisant SimpleXMLRPCServer pour la machine Windows
  • utilisant xmlrpclib pour la machine linux

de la bibliothèque standard vous donnera la plus grande liberté. Vous implémentez ce dont vous avez besoin et vous n'avez pas à vous soucier des API Windows, des technologies surchargées comme DCOM, etc., vous êtes en terrain python, même sur la machine Windows.

Sidenote: Twisté est bien sûr toujours une excellente option, alors ne vous inquiétez pas à ce sujet; Je pense que le serveur CalDav d'Apple fonctionne aussi sur Twisted. J'ai fini par aller avec SSH + Twisted