2011-07-21 14 views
5

मुझे जावा प्रोग्राम से रिमोट सर्वर में एसएसएच करने और एसएसएच से दूसरे सर्वर में एसएसएच करने में सक्षम होना चाहिए। मेरे पास अपने क्लाइंट पर दोनों सर्वरों के लिए प्रमाण-पत्र हैं।जेएसएच का उपयोग कर किसी अन्य एसएसएच सर्वर के पीछे सर्वर पर एसएसएच कैसे करें?

आदेश स्वचालित रूप से ऐप के भीतर नियमित स्ट्रिंग (कोई उपयोगकर्ता इनपुट) के रूप में पारित नहीं होंगे। मुझे दूसरे सर्वर पर उन कस्टम कमांड को चलाने में सक्षम होना चाहिए और आउटपुट और कुछ सरल तर्क के आधार पर रनटाइम के दौरान कौन से आदेश जारी करना है, यह तय करने में सक्षम होना चाहिए।

क्या मैं ऐसा करने के लिए जेएसएच का उपयोग कर सकता हूं और यदि हां, तो मुझे कहां देखना चाहिए? (उदाहरण, जानकारी)

========================================= ====================

जोड़ा:

सूत्र में अपवाद "मुख्य" com.jcraft.jsch.JSchException: UnknownHostKey: मेजबान .net। RSA कुंजी फ़िंगरप्रिंट 'blahblahblah'

अब तक के रूप में

है, मैं known_hosts फ़ाइल को संशोधित करने और वहाँ में मैन्युअल रूप से मेजबान जोड़कर इस समस्या को हल करने कर रहा हूँ। क्या मैं इस छोटी समस्या को सेटिंग्स द्वारा बाईपास कर सकता हूं, जहां कहीं भी जेएसएच को यस को स्वचालित रूप से दबाया जा सकता है जब यह हाँ-कोई सवाल नहीं पूछा जाता है?

उत्तर

10

फ़ायरवॉल के पीछे दूसरे सर्वर से कनेक्ट करने के लिए, सिद्धांत दो सिद्धांत हैं।

मूर्ख व्यक्ति को पहले सर्वर (एक निष्पादन चैनल से) पर ssh पर कॉल करना होगा, जो सही सर्वर को इंगित करता है। इसे जेएसएच के साथ एजेंट अग्रेषण की आवश्यकता होगी, और दूसरे सर्वर तक पहुंचने के लिए जेएसएच एपीआई भी प्रदान नहीं करेगा, केवल एसएसएच कमांड लाइन।

बेहतर एक टीसीपी सुरंग बनाने के लिए पहले सर्वर से कनेक्शन का उपयोग करना होगा, और दूसरे सर्वर से कनेक्ट करने के लिए इस सुरंग का उपयोग करना होगा। जेएसएच विकी में ProxySSH class (कुछ उदाहरण कोड के साथ) शामिल है जो एक जेएसएच सत्र का उपयोग दूसरे जेएसएच सत्र के लिए सुरंग के रूप में करने की अनुमति देता है। (अस्वीकरण: यह वर्ग मेरे द्वारा मुख्य रूप से लिखा गया था, JSch लेखक की ओर से कुछ समर्थन के साथ।)

जब आप दूसरे सर्वर से अपना कनेक्शन, या तो एक shell चैनल या अपने आदेश पर अमल करने के लिए exec चैनलों की एक श्रृंखला का उपयोग करें। (JSch विकी में Shell, Exec or Subsystem Channel देखें अवलोकन करने के लिए, और जानकारी के लिए Javadocs।)


अपने अज्ञात मेजबान कुंजी समस्या के लिए:

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

सुविधाजनक संस्करण configuration optionStrictHostKeyCheckingno को स्थापित कर रही है - इस होस्ट कुंजी के लिए अज्ञात मेजबान कुंजी जोड़ देगा दायर:

JSch.setConfig("StrictHostKeyChecking", "no"); 

(आप भी इसे अलग-अलग सत्र पर, सेट कर सकते हैं यदि आप केवल सुरंग सत्र के लिए इसे सेट करना चाहते हैं, न कि सुरंग सत्र के लिए। या yes या ask के साथ सुरंग सत्र के लिए इसे ओवरराइड करें - वहां एमआईटीएम खतरे अधिक हो सकता है।)

मध्यम मार्ग वास्तव में उपयोगकर्ता से पूछने में सक्षम होना चाहिए (जिसके बाद फिंगरप्रिंट की तुलना किसी सूची में करनी चाहिए) - इसके लिए, UserInfo इंटरफ़ेस को कार्यान्वित करें और ऑब्जेक्ट को सत्र में प्रदान करें। (JSch विकी एक example implementation using Swing JOptionPanes होता है, यदि आपके क्लाइंट के कार्यक्रम जीयूआई के साथ एक सिस्टम पर चलता है जो आप बस का उपयोग कर सकते हैं।)

स्वीकार किए जाते हैं मेजबान चाबियों का बचत काम करने के लिए, आप एक फ़ाइल नाम तर्क के साथ JSch.setKnownHosts विधि का उपयोग करना चाहिए , एक इनपुटस्ट्रीम तर्क के साथ नहीं - अन्यथा आपके स्वीकार करने के लिए आपके ग्राहक के प्रत्येक पुनरारंभ के लिए दोहराया जाना होगा।

+0

बढ़िया काम करता है! क्या मैं उस गेटवे के पीछे दो या दो से अधिक विभिन्न एसएसएच सर्वरों तक पहुंचने के लिए एक ही गेटवे का उपयोग कर सकता हूं? –

+0

एनवीएम, हाँ आप कर सकते हैं। –

+0

@ मार्टिन: हाँ, मैंने इसे इस तरह इस्तेमाल किया है (लगभग एक ही गेटवे के पीछे छिपे हुए 23 सर्वर तक पहुंचने के लिए)। –

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