2010-07-13 10 views
4

저는 파이썬을 사용하고 Linux에서 실행되는 레거시 Windows 응용 프로그램을 다시 작성하고 있습니다. 처음에는 레거시 응용 프로그램을 계속 사용하는 고객과 새 응용 프로그램을 사용하는 고객간에 일관된 결과를 얻을 수 있도록 새 응용 프로그램이 레거시 응용 프로그램을 호출해야합니다.python 실행 원격 프로그램

Windows 상자 바로 옆에 앉아있는 Linux 상자가 있고 Windows 상자에서 명령을 실행하고 결과를 동 기적으로 캡처하는 Linux 상자의 프로세스가 필요합니다.

처음에는 Windows 상자에 웹 서비스를 작성하는 것이지만 레거시 응용 프로그램 외에도 Windows 컴퓨터에서 웹 서버를 실행하는 것이 좋습니다.

그렇다면 Twisted.Conch를 사용하면 웹 서버를 실행하는 데 추가 오버 헤드없이 네트워크를 통해 명령을 실행할 수 있다고 생각했지만 으로 가정합니다. 또한 ssh 서버를 실행하는 오버 헤드가 있습니다. Windows 컴퓨터.

다른 컴퓨터에서 파이썬을 사용하거나 웹 서비스 또는 ssh 외에 동기식 프로세스를 시작하거나 웹 서비스 또는 ssh를 사용하는 것이 가장 좋은 방법은 무엇입니까? 또한, 웹 서비스 또는 ssh가 추구 할 수있는 가장 좋은 경로라면 Twisted를 사용하여 고려해야 할 사항이 있습니까?

+2

동시 적으로 - "실시간"을 의미하며, Linux에서 실행을 일시 중지하고 Windows의 응답을 기다리고 싶습니다. 비동기 적으로 Windows에 작업 단위를 제출하는 곳과 반대로, Linux에서 다른 작업을 계속하고 Windows가 끝나면 알림을받습니다. –

답변

5

SSH + Twisted로 끝났습니다. Windows 컴퓨터에서 나는 Windows 서비스로 freeSSHd를 설치합니다. Paramiko가 작동하도록 해킹 한 후 공개/개인 키를 가져 오는 데 문제가 발생하면 Twisted를 사용하기로 결정하고 작동시키기 위해 몇 분 밖에 걸리지 않았습니다. 그래서 필자는 Linux에서 SSH 클라이언트 측까지 필요한 것을 성취하기 위해 Twisted 문서를 기반으로 작성/훔쳤습니다.

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

위대한 기능을 수행했습니다.

1

QAMRabbitMQ으로 시도하십시오.

+1

고마워, 내가 살펴볼 게 - 내가 다른 제출 된 답변을 통해 이것을 사용하게되면 나는 이것을 받아 들일 것이다. –

0

저는 종종 Samba 기반의 winexe이라는 작은 프로그램을 사용합니다.

다음은 command syntax의 모습입니다. 여기에 일부 installation options입니다.

+0

이것은 잠재적으로 작동 할 수 있습니다 - 나는 내가 발견 할 수 있었던 문서의 부족에 의해 조금 꺼져 있습니다. –

+0

이해할 수 있습니다. 설치에 포함 된 맨 페이지는 보이지 않지만 최소한 "winexe --help"는 모든 명령 옵션의 전체 목록을 제공합니다. – ewall

4

또 다른 옵션은 paramiko입니다. 그것은 SSH를 구현하는 파이썬 라이브러리입니다. 필자는 원격으로 명령을 실행하고 파일을 SSH 서버를 실행하는 Windows 상자로 전송하는 데 사용했습니다. 문제는 Windows 명령 셸의 특성으로 인해 Windows에서 stdout을 제대로 캡처하지 못하는 것입니다. 비틀기에 기반한 솔루션에서도 동일한 문제가 발생할 수 있습니다.

어떤 종류의 결과를 캡처하려고합니까?

+0

아직 결과가 어떻게 보이는지는 모르겠지만,이 시점에서 나는 표준 출력으로부터 그 결과를 얻을 필요가 있다고 가정하고 있습니다. –

+0

필자는이 대답을 받아들입니다. 필연적으로 "정확합니다"라고 생각하지는 않습니다. 실제로이 질문에 대한 옳고 그른 대답은 아니라고 생각합니다.하지만 SSH 경로를 사용하고 Paramiko를 사용할 가능성이 큽니다. –

1

RPC가 올바른 대답입니다.

나는 생각한다

  • 당신에게 가장 자유를 줄 것 표준 라이브러리에서 리눅스 머신

에 대한 XMLRPCLIB를 사용하여 윈도우 머신

  • 에 대한 SimpleXMLRPCServer를 사용하여. 필요한 것을 구현하고 Windows API, DCOM과 같은 과도한 기술 등을 걱정할 필요가 없습니다. Windows 시스템에서도 파이썬 토지에 있습니다.

    사이드 노트 : Twisted는 물론 항상 훌륭한 옵션이므로 걱정하지 마십시오. 내 생각에 사과 CalDav 서버는 Twisted에서도 실행된다고 생각합니다.

  • 관련 문제