2012-10-03 9 views
5

क्या रिमोट मशीन पर एक एसएसएच सत्र शुरू करने के कोई उदाहरण हैं जो बंदरगाह का उपयोग करके बंदरगाह के भीतर से पोर्ट अग्रेषण विकल्पों के साथ हैं, जिससे कोई सुरंग के माध्यम से सामान्य टीसीपी ट्रैफिक पाइप कर सकता है?मैं पाइथन ट्विस्ट के भीतर से एसएसएच पोर्ट अग्रेषण कैसे कर सकता हूं?

परिदृश्य:

मैं एक कस्टम व्यावर्तित आधारित Protobuf RPC सेवा और एक मुड़ आधारित आरपीसी स्थापित ग्राहक के साथ एक मशीन चलाने वाले किसी सर्वर है। सर्वर एसएसएच भी चला रहा है। सीधे सर्वर पर आरपीसी सेवा से बात करने की बजाय, मैं आरपीसी क्लाइंट से एसएसएच का उपयोग कर सर्वर से कनेक्ट करना चाहता हूं, सर्वर पर सेटअप पोर्ट अग्रेषण, और एसएसएच सुरंग के माध्यम से प्रोटोबफ का उपयोग कर आरपीसी सेवा के साथ संवाद करना चाहता हूं।

मैं पहले से ही पोर्ट अग्रेषण मैन्युअल रूप से सेट करने में सक्षम हूं और आरपीसी क्लाइंट आरपीसी क्लाइंट को क्लाइंट बॉक्स पर स्थानीय पोर्ट पर इंगित करके आरपीसी सेवा से बात कर रहा हूं, मैं बस इतना उत्सुक हूं कि मैं यह कैसे कर सकता हूं सीधे ग्राहक के भीतर।

उत्तर

4

यह आश्चर्यजनक होगा अगर कन्च के साथ साफ चीजों को करने के लिए ट्विस्ट में बेहतर प्रलेखन किया गया था (आखिरकार, कितने अन्य प्रोग्राम करने योग्य एसएसएच पुस्तकालय हैं?)। उस खुश दिन तक, conch कमांड लाइन उपकरण के कार्यान्वयन को पढ़ने में बड़ी सहायता हो सकती है।

यहाँ हम देख सकते हैं जहां कमांड लाइन से बंदरगाह अग्रेषण विकल्प SSH कनेक्शन पर कुछ कार्रवाई में बदल जाता है:

http://twistedmatrix.com/trac/browser/trunk/twisted/conch/scripts/conch.py#L188

मुझे लगता है कि आप एक स्थानीय अग्रेषण नियम के बारे में पूछ रहे हैं, तो localForwards लूप मोटे तौर पर कर रहा है जो आप करना चाहते हैं।

+0

धन्यवाद जीन-पॉल! – Bryan

4

एक सुरंग को लागू करना ट्विस्ट एसएसएच क्लाइंट जो स्थानीय पोर्ट अग्रेषण करता है आश्चर्यजनक रूप से सरल हो सकता है।

बस एक basic Twisted Conch SSH client बनाते हैं, और में पोर्ट अग्रेषण हिस्सा लागू serviceStarted अपने ग्राहक की SSH कनेक्शन वर्ग के विधि:

from twisted.conch.ssh import forwarding 

LOCALPORT = 8888 
REMOTEHOST = "127.0.0.1" 
REMOTEPORT = 9999 

class Connection(connection.SSHConnection): 

    def serviceStarted(self): 
     Channel = forwarding.SSHListenClientForwardingChannel 
     Factory = forwarding.SSHListenForwardingFactory 
     factory = Factory(self, (REMOTEHOST, REMOTEPORT), Channel) 
     s = reactor.listenTCP(LOCALPORT, factory) 

इसके लिए बस इतना है (REMOTEHOST ssh को इंगित करने के लिए सेट कर रहा है यही कारण है कि सर्वर से ही यही है क्योंकि आपने कहा है कि आप कनेक्ट कर रहे हैं)।

संबंधित मुद्दे