Python выполнить удаленную программу - PullRequest
4 голосов
/ 13 июля 2010

Я переписываю старое приложение для Windows, использующее Python и работающее в Linux. Первоначально новое приложение должно вызывать устаревшее приложение, чтобы у нас были согласованные результаты между клиентами, все еще использующими устаревшее приложение, и клиентами, использующими новое приложение.

Итак, у меня есть ящик с Linux, который находится прямо рядом с ящиком Windows, и я хочу, чтобы процесс на ящике Linux выполнил команду на ящике Windows и зафиксировал результат (синхронно).

Моей первоначальной мыслью было написать веб-сервис для Windows, но это означало бы запуск веб-сервера на компьютере с Windows в дополнение к устаревшему приложению.

Итак, я подумал, что использование Twisted.Conch может позволить мне просто выполнить команду по сети без дополнительных затрат на работу веб-сервера, но я предполагаю, есть и издержки при запуске ssh сервер на машине с Windows.

Какими альтернативными способами я могу инициировать синхронный процесс на другом компьютере, используя Python, помимо веб-службы или ssh, или веб-служба или ssh - лучший подход? Кроме того, если веб-сервис или ssh являются лучшими маршрутами для поиска, стоит ли использовать Twisted, что мне следует рассмотреть?

Ответы [ 5 ]

5 голосов
/ 22 июля 2010

Я закончил с SSH + Twisted. На машине с Windows я установил freeSSHd в качестве службы Windows. После того, как я попытался заставить работать paramiko и столкнулся с множеством проблем с получением моих открытых / закрытых ключей, я решил попробовать Twisted, и это заняло всего несколько минут. Итак, я написал / украл это на основе документации Twisted, чтобы выполнить то, что мне было нужно, в части SSH-клиента от 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()

Это прекрасно работает!

4 голосов
/ 13 июля 2010

Другой вариант - парамико. Это библиотека Python, которая реализует SSH. Я использовал его для удаленного выполнения команд и передачи файлов в окна Windows, работающие на SSH-сервере. Проблема в том, что он не правильно захватывает стандартный вывод на окнах из-за особенностей командной оболочки windows. У вас может быть та же проблема с решением на основе витой.

Какие результаты вы пытаетесь получить?

1 голос
/ 15 июля 2010

RPC - правильный ответ ИМО.

Я думаю:

  • с использованием SimpleXMLRPCServer для машины Windows
  • с использованием xmlrpclib для Linux-машины

из стандартной библиотеки даст вам наибольшую свободу. Вы реализуете то, что вам нужно, и вам не нужно беспокоиться об интерфейсах Windows API, о слишком распространенных технологиях, таких как DCOM и т. Д., Вы находитесь в среде Python, даже на машине с Windows.

Sidenote: Twisted, конечно, всегда отличный вариант, так что не беспокойтесь об этом; Я думаю, что сервер Apples CalDav тоже работает на Twisted.

1 голос
/ 13 июля 2010

Попробуйте QAM с RabbitMQ .

0 голосов
/ 13 июля 2010

Я часто использую небольшую программу под названием winexe, основанную на Samba.

Вот как выглядит синтаксис команды , а вот некоторые опции установки .

...