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

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

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

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

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

4
Matthew J Morrison 13 Июл 2010 в 17:23

5 ответов

Лучший ответ

Я закончил с 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()

Это отлично работает!

5
Matthew J Morrison 22 Июл 2010 в 14:50

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

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

0
jdthood 17 Авг 2011 в 17:05

RPC это правильный ответ IMO.

Я думаю:

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

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

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

1
zovision 15 Июл 2010 в 12:10

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

1
Marcelo Cantos 13 Июл 2010 в 13:59

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

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

4
Simon Hibbs 13 Июл 2010 в 14:36