पहले से स्थापित SSH चैनल का उपयोग करना


50

मेरे पास दो मशीनों के बीच पहले से ही स्थापित ssh कनेक्शन है।

क्या शेल मशीन से रिमोट मशीन पर कमांड भेजने का एक तरीका है जो स्थानीय मशीन पर चलाया जाता है, पहले से ही खुले कनेक्शन का उपयोग कर, और दूसरे एसश सत्र शुरू किए बिना?

जवाबों:


56

यदि आप पहले से योजना बनाते हैं तो ओपनएसएसएच के हाल के पर्याप्त संस्करणों के साथ यह बहुत सरल है।

पहली बार एक मास्टर कनेक्शन खोलें। बाद के कनेक्शन के लिए, मौजूदा मास्टर कनेक्शन के माध्यम से मार्ग दास कनेक्शन। अपने आप में ~/.ssh/config, कनेक्शन साझाकरण स्वचालित रूप से होने के लिए सेट करें:

ControlMaster auto
ControlPath ~/.ssh/control:%h:%p:%r

यदि आप एक मौजूदा कनेक्शन के रूप में उसी (उपयोगकर्ता, पोर्ट, मशीन) के लिए एक ssh सत्र शुरू करते हैं, तो दूसरे सत्र को पहले से अधिक टनल किया जाएगा। दूसरे कनेक्शन को स्थापित करने के लिए किसी नए प्रमाणीकरण की आवश्यकता नहीं है और यह बहुत तेज़ है।


ऐसा लगता है कि दूसरा व्यक्ति / var / log / safe या /var/log/auth.log में पंजीकृत नहीं होगा। हालांकि, क्या दूसरा / in / var / log / wtmp में पंजीकृत होगा?
SOUser

@ XichenLi /var/log/secureऔर /var/log/auth.logलॉग इन SSH कनेक्शन; एक गुलाम कनेक्शन वहाँ दिखाई नहीं देता है क्योंकि यह मौजूदा कनेक्शन पर पिग्गीबैक करता है। यदि आपका ssh सत्र एक टर्मिनल आवंटित करता है (अर्थात ssh somehostबिना किसी आदेश के आपूर्ति की जाती है, या ssh -t), (वह (सामान्य रूप से) लॉग इन होता है wtmp, तो इस बात की परवाह किए बिना कि टर्मिनल कैसे दिखाई देता है (कनेक्शन, टर्मिनल एमुलेटर एप्लिकेशन,… को स्थापित करने के लिए जो भी विधि का उपयोग किया गया था)।
गिल्स एसओ- बुराई को रोकना '

2
आप ControlPersist 600स्वचालित रूप से हटाए जाने से पहले सॉकेट के कुछ सेकंड के निष्क्रिय होने में भी उपयोग कर सकते हैं । अन्यथा मास्टर कनेक्शन समाप्त होने पर यह स्वचालित रूप से बंद हो जाएगा। यह दूरस्थ रूप से आदेशों की एक श्रृंखला को क्रियान्वित करने के लिए अच्छा नहीं है (उदाहरण के लिए विभिन्न फ़ोल्डरों के लिए rsync आदेशों की एक श्रृंखला)

2
यदि आप वैश्विक कॉन्फ़िगरेशन को संपादित नहीं करना चाहते हैं, तो आप SSH क्लाइंट के विकल्पों -S(निर्दिष्ट सॉकेट) और -M(मास्टर कनेक्शन बनाएँ ) का भी उपयोग कर सकते हैं ।
यांकी

22

यह nc टूल और ssh सुरंगों का उपयोग करके प्राप्त करना बहुत आसान है ।

1. खुली ssh सुरंग

अपने ssh सत्र में, ~Cएक नई पंक्ति टाइप करें। आपको ssh "सर्विस कंसोल" प्रॉम्प्ट मिलेगा जो इस तरह दिखता है:

ssh> 

Ssh सुरंग खोलने के लिए स्थानीय फ़ॉर्वर्ड कमांड में टाइप करें :

ssh> -L22000:targethost:22001
Forwarding port.

targethostजिस मशीन से आप जुड़े हुए हैं उसका होस्टनाम या आईपी पता कहाँ है।

अब, लक्ष्य मशीन पर ssh सर्वर को मानने से मना किया गया था सुरंगों के लिए, आपके पास वांछित कनेक्शन अग्रेषण है: sshआपकी मशीन पर क्लाइंट 22000 पोर्ट को सुनता है, और यह 22001 पोर्ट पर भेजे गए किसी भी ट्रैफ़िक को आगे भेज देगा targethost

2. रिमोट मशीन पर एक नेटवर्क सर्वर शुरू करें

यह आपके पहले से ही खुले ssh सत्र में प्रवेश के रूप में सरल है निम्नलिखित कमांड:

remote$ nc -l localhost 22001 | sh

यह 22001 पोर्ट पर सुनने वाले एक टीसीपी सर्वर को शुरू करेगा - जो हमारी ssh टनल का टारगेट पोर्ट है - और प्राप्त डेटा (संभवतः शेल कमांड) को targethostशेल इंस्टेंस पर रूट करता है ।

3. सुरंग के ऊपर अपनी स्क्रिप्ट भेजें

local$ cat yourscript.sh | nc localhost 22000

यह आपकी ssh टनल को स्क्रिप्ट की बॉडी भेजेगा और एंड पर एक शेल में निष्पादित किया जाएगा targethost। आप ssh सत्र के साथ अपने टर्मिनल में स्क्रिप्ट का आउटपुट देखेंगे।


मैं इस बात पर भी ध्यान दूंगा कि ssh सुरंग (चरण १.) इस परिदृश्य में कड़ाई से आवश्यक नहीं है; आप सर्वर को खोलना शुरू कर सकते हैं और इसे सीधे इंटरनेट पर कनेक्ट कर सकते हैं। हालाँकि, आपको टनल का उपयोग करने की आवश्यकता होगी यदि लक्ष्य होस्ट सीधे नहीं पहुँचा जा सकता है (जैसे कि NAT के पीछे), या ssh एन्क्रिप्शन वांछित है।


3
बहुत बढ़िया जवाब। तकनीकी रूप से, सेवा कंसोल में जाने के लिए, ~चरित्र को एक नई रेखा के बाद आना चाहिए, इसलिए LF ~ Cसंभवतः एक बेहतर अनुक्रम है।
एलेक्सिओस

@ एलेक्सियो, सही।
ulidtko

कमाल की चाल! रिकॉर्ड के लिए, ssh मैन पेज इसके बारे में कुछ और जानकारी दिखाता है (नीचे स्क्रॉल करके "ESCAPE CHARACTERS" नामक अनुभाग पर जाएं)
Carles Sala

@CarlesSala यह जानकर भी अच्छा है कि less, सामान्य डिफ़ॉल्ट पेजर, खोज का समर्थन करता है, जो आपके कीवर्ड को जानने के बाद आपको कुछ स्क्रॉलिंग से बचा सकता है: बस टाइप करें man ssh /ESCAPEऔर आप वहां हैं।
20

@ulidtko यकीन है, लेकिन जहाँ तक मुझे पता है, कोई एक CLI कमांड को SO कमेंट में लिंक नहीं कर सकता है, इसलिए मुझे html मैन पेज एक बेहतर विकल्प लगा ;-)
Carles Sala
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.