मैं एक कमांड में B के माध्यम से A को मशीन करने के लिए SSH कैसे करूं?


103

मैं एक कंप्यूटर का उपयोग करना चाहता हूं, मशीन ए कहो जो मेरे विश्वविद्यालय के नेटवर्क में आधारित है। हालांकि, यह कंप्यूटर केवल विश्वविद्यालय के आंतरिक नेटवर्क के माध्यम से सुलभ है, इसलिए मैं सीधे घर से इस कंप्यूटर के लिए SSH का उपयोग नहीं कर सकता।

यहाँ अब मैं क्या कर रहा हूँ:

  1. एक अलग विश्वविद्यालय मशीन में प्रवेश करें, मशीन बी कहो

    (यह मशीन B मेरे होम कंप्यूटर से SSH के माध्यम से सुलभ है।)

  2. A से कनेक्ट करने के लिए B पर SSH का उपयोग करें।

वहाँ तेजी से ऐसा करने का एक तरीका है? केवल एक ssh कमांड का उपयोग करना।


जवाबों:


97

हाँ, ProxyCommandअपने SSH विन्यास का उपयोग कर ।

अपने होम डायरेक्टरी में एक SSH कॉन्फ़िगरेशन फ़ाइल बनाएँ (जब तक कि आप इस सिस्टम को चौड़ा नहीं करना चाहते) ~/.ssh/config:

Host unibroker          # Machine B definition (the broker)
Hostname 12.34.45.56    # Change this IP address to the address of the broker
User myusername         # Change this default user accordingly 
                        # (`user@unibroker` can overwrite it)

Host internalmachine    # Machine A definition (the target host)
ProxyCommand ssh -q unibroker nc -q0 hostname.or.IP.address.internal.machine 22

अब आप सीधे मशीन ए का उपयोग करके पहुंच सकते हैं

ssh user@internalmachine

यह भी ध्यान दें कि अब आपके पास इसके लिए एक एकल SSH होस्ट लक्ष्य नाम है, आप इसे अन्य अनुप्रयोगों में भी उपयोग कर सकते हैं। उदाहरण के लिए:

  • फाइलों को कॉपी करने के लिए एस.सी.पी.

    scp somefile user@internalmachine:~/
    
  • आपके GUI अनुप्रयोगों में:

    sftp://user@internalmachine/मशीन पर ब्राउज़ करने के लिए स्थान के रूप में उपयोग करें।

    केडीई-आधारित (डॉल्फिन): उपयोग fish://user@internalmachine/

टिप्पणियाँ

बदलें hostname.or.IP.address.internal.machineऔर बंदरगाह ( 22) मशीन तक आप पहुंचना चाहते करने के लिए के रूप में यदि आप से होगा unibrokerमशीन।

Unibroker होस्ट पर netcat संस्करणों के आधार पर, -q0विकल्प को छोड़ दिया जाना चाहिए। प्रमाणीकरण के बारे में; आप मूल रूप से अपने कार्य केंद्र से दो एसएसएच कनेक्शन स्थापित कर रहे हैं। इसका मतलब यह है कि यूनिब्रोकर होस्ट और इंटर्माचाइन होस्ट दोनों को एक के बाद एक (कीपर / पासवर्ड और होस्ट कुंजी सत्यापन के लिए) सत्यापित / प्रमाणित किया जाता है।

व्याख्या

यह ProxyCommandऔर 'netcat' के उपयोग का यह तरीका है। मुझे यह पसंद है, क्योंकि मेरा SSH क्लाइंट सीधे लक्ष्य मशीन से बात करता है ताकि मैं अपने क्लाइंट से होस्ट कुंजी सत्यापित कर सकूं और मैं ब्रोकर पर किसी अन्य कुंजी का उपयोग किए बिना अपने सार्वजनिक कुंजी प्रमाणीकरण का उपयोग कर सकूं।

प्रत्येक Hostएक नए होस्ट अनुभाग की शुरुआत को परिभाषित करता है। Hostnameउस होस्ट का लक्ष्य होस्टनाम या IP पता है। Userवह है जो आप उपयोगकर्ता के हिस्से के रूप में प्रदान करेंगे ssh user@hostname

ProxyCommandलक्ष्य मशीन के लिए पाइप के रूप में इस्तेमाल किया जाएगा। पहली मशीन के लिए SSH का उपयोग करके और सीधे ncवहाँ से एक सरल 'netcat' ( ) को सेट करने के लिए, यह मूल रूप से उन लोगों के बीच दलाल से आंतरिक मशीन के लिए एक सादा रूप से आगे है। -qविकल्प किसी भी निर्गम (सिर्फ एक निजी पसंद) मौन करने हैं।

सुनिश्चित करें कि आपके पास ब्रोकर पर नेटकैट स्थापित है (आमतौर पर उबंटू पर डिफ़ॉल्ट रूप से उपलब्ध है) - या तो नेटकैट-ओपनबेडNetcat-openbsd स्थापित करें या नेटकैट-पारंपरिकनेटकट-पारंपरिक स्थापित करें

ध्यान दें कि आप अभी भी दो बार यहाँ एन्क्रिप्शन के साथ SSH का उपयोग कर रहे हैं। जबकि netcat चैनल प्लेनटेक्स्ट है, आपके पीसी पर आपका SSH क्लाइंट अंतिम लक्ष्य मशीन के साथ एक और एन्क्रिप्टेड चैनल स्थापित करेगा।


4
मुझे -q0 विकल्प को हटाना पड़ा क्योंकि यह उस मशीन द्वारा समर्थित नहीं था जिसका मैं उपयोग कर रहा था। इसके अलावा, यह सब काम किया। यह एक FANTASTIC टिप है। बहुत बहुत धन्यवाद। :)
गेरी

मैं एक समस्या में भाग गया, आपका जवाब टर्मिनल से मेरे लिए ठीक काम करता है, लेकिन मैं इसे gui sftp का उपयोग करने में असमर्थ हूं, यह कहता है: लॉग इन करते समय निकाल दिया गया त्रुटि रहित संदेश,
विकाश बी

@VikashB खैर, यह वास्तव में काम करना चाहिए। अपनी विशिष्ट स्थिति को संभालने के लिए एक नया प्रश्न बनाने पर विचार करें।
gertvdijk

मैंने यहां सवाल किया: askubuntu.com/questions/688567/…
विकाश बी

1
@Gertvdijk के बुद्धिमान शब्द को पूरक करने के लिए, ssh proxies और जंप मेजबानों के विषय पर एक महान वाइकबुक है जो एक अमूल्य संदर्भ के रूप में काम कर सकता है।
ट्रैविस क्लार्क

51

एक ही बार में होप

ProxyCommand दृष्टिकोण का एक स्पष्ट विकल्प जो मैंने अपने दूसरे उत्तर में प्रदान किया है वह सीधे लक्ष्य मशीन के लिए 'hopping' होगा:

ssh -t user@machineB ssh user@machineA

-tपहले sshकमांड पर ध्यान दें । इसके बिना, यह विफल हो जाएगा:

Pseudo-terminal will not be allocated because stdin is not a terminal.
ssh_askpass: exec(/usr/bin/ssh-askpass): No such file or directory
Permission denied, please try again.
[...]

यह एक वास्तविक TTY को आवंटित करने के लिए बाध्य करेगा

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

सभी पूर्वोक्त कारणों से मैं ProxyCommand दृष्टिकोण की दृढ़ता से अनुशंसा करता हूं , लेकिन त्वरित कनेक्ट के लिए यह ठीक काम करता है।


Off वन ऑफ़ ’और स्थायी समाधान दोनों के साथ एक जवाब क्यों नहीं है?
संकोची

5
@demure यह है कि कैसे StackExchange साइटें काम करती हैं ... देखें: दो बार एक प्रश्न का उत्तर देने पर आधिकारिक शिष्टाचार क्या है? कहते हैं, "दो अलग-अलग उत्तरों को पोस्ट करना बेहतर है, उन्हें एक उत्तर में रखना।" । और मैं इसे एक ही समाधान नहीं मानता। स्थायी / अस्थायी रूप से वह नहीं है जो इस दृष्टिकोण को अलग तरीके से, मेरी राय में बनाता है।
gertvdijk

अन्य मार्गदर्शिकाएँ, इसके अलावा, एए-स्विच का उपयोग करने के लिए कहती हैं, लेकिन संकेत देती हैं कि इसका सुरक्षा प्रभाव है। क्या आप जानते हैं कि आगे बढ़ने का क्या मतलब है, या नहीं, प्रमाणीकरण एजेंट कनेक्शन?
डायगन

@gertvdijk सुपर निंजा यहाँ! आपके पास शीर्ष दो समाधान हैं। मैंने पहले कभी नहीं देखा है। बेहद कूल। जिस तरह से एन समाधान (जो मैं आमतौर पर देखता हूं) के साथ एक मेगा लंबे समाधान बनाने से बेहतर है।
ट्रेवर बॉयड स्मिथ

यह एक विन्यास स्थापित करने की तुलना में बहुत अधिक सुविधाजनक है जो अन्य ssh को भी बाधित करेगा।
निखिल साहू

37

आप -Jकमांड लाइन विकल्प का उपयोग कर सकते हैं :

ssh -J user@machineB user@machineA

से man ssh:

-J [user@]host[:port]
     Connect to the target host by first making a ssh connection to
     the jump host and then establishing a TCP forwarding to the
     ultimate destination from there.  Multiple jump hops may be
     specified separated by comma characters.  This is a shortcut to
     specify a ProxyJump configuration directive.

इसे ओपनएसएसएच संस्करण 7.3 (अगस्त 2016 में जारी) में पेश किया गया था । यह उबंटू में 16.10 और बाद में उपलब्ध है।


3
+1 क्योंकि यह तब भी काम करता है, जब आपको मशीन के लिए मुख्य फ़ाइल निर्दिष्ट करने की आवश्यकता होती है
शोक

1
+1, यह मेरे ProxyCommand उत्तर की तुलना में बेहतर संस्करण है यदि आपके सभी होस्ट हाल ही में एक OpenSSH संस्करण चला रहे हैं।
गर्टवडिज्क

ओपनएसएसएच सर्वर को इस मामले में ए और बी दोनों मशीनों पर स्थापित किया जाना चाहिए? क्या मैं सही समझ रहा हूँ?
मिखाइल

17

प्रयोग करके देखें

Host <visible hostname alias>
        Controlmaster auto
        User <user>
        hostname <visible hostname>
        port <port>
        IdentityFile ~/.ssh/<id file>

Host <private LAN hostname alias>
     ProxyCommand ssh -q -W <private LAN hostname>:<private LAN port> <visible hostname alias>

अपने ~ / .ssh / config में और यह सब केवल कंप्यूटर पर रहने वाली कुंजियों के साथ एक शॉट में करें।


1
यह मिक्स में नेटकैट लगाने से ज्यादा साफ है। इसके अलावा, निजी SSH कुंजी को Bमशीन पर मौजूद होने की आवश्यकता नहीं है , या तो।
डेनामेक्लामिलन

1

यह एक बहुत ही उपयोगी सुझाव है। लगभग घंटों तक गड़बड़ करने के बाद, मुझे यह नोट मिला, और इस काम की पुष्टि बिल्कुल दस्तावेज के रूप में की गई। दूरस्थ मशीन से, मशीन से थ्रू मशीन को जोड़ने के लिए:

जैसे: [xuser @ machineC ~] ssh -t MachineA ssh MachineB

"-T" महत्वपूर्ण है, ssh विफल रहता है अगर यह मौजूद नहीं है। आपको दो बार संकेत मिलेगा, पहला मशीनए पर पासवर्ड के लिए, फिर दूसरी बार मशीनबी के लिए। इसके अलावा, ध्यान दें कि आपके पास तीनों मशीनों पर परिभाषित उपयोगकर्ता "xuser" है। यदि नहीं, तो ssh सिंटैक्स का उपयोग करें: "yuser @ MachineA ..."। यह भी ध्यान दें कि यदि आप चाहें तो डॉटेड क्वाड रॉ आईपी का उपयोग कर सकते हैं। यह उपयोगी है यदि आप एक निजी स्थानीय नेट के माध्यम से लिंक कर रहे हैं जो कि दुनिया में उजागर नहीं होने वाले आईपी का उपयोग कर रहा है - यानी। आपकी स्थानीय होस्ट फ़ाइल या किसी DNS में नहीं। मशीन बी से एक फाइल प्राप्त करने के लिए, रिमोट मशीन सी सी के लिए, आप मशीन बी से मशीनए के लिए, फिर मशीनए से रिमोट मशीन सीसीपी के लिए भेज सकते हैं। (उदा। रिमोट मशीनसी, मशीनए को पिंग कर सकती है, लेकिन मशीनबी को नहीं।) केविट: मैंने फेडोरा और विंडोजएक्सपी के साथ परीक्षण किया, मशीनए एक एक्सपी-बॉक्स चल रहा है जो आईसीएस (इंटरनेट कनेक्शन साझा करना) है। जबकि MachineB और रिमोट मशीनC फेडोरा-लिनक्स बॉक्स हैं। इस सुझाव ने मेरे लिए एक महत्वपूर्ण समस्या हल कर दी - यानी। मेरे दूरस्थ साइट लैन के लिए प्रतिबंधित, मॉनिटर किए गए रिमोट एक्सेस। ध्यान दें, जब आप मशीनब से "लॉगआउट" करते हैं, तो आपको xxx.xxx.xxx.xxx बंद करने के लिए दो "कनेक्शन" देखने चाहिए। संदेश।


यदि आप सार्वजनिक कुंजी प्रमाणीकरण सेट और कॉन्फ़िगर करते हैं, तो आपको अपने पासवर्ड में प्रवेश करने के बारे में चिंता करने की आवश्यकता नहीं है। लेकिन -tअभी भी आवश्यक है।
फेलिप अल्वारेज

@FelipeAlvarez यदि आप मशीन B पर भरोसा नहीं करते हैं तो A में पासवर्ड रहित लॉगिन करने के लिए आपको दूसरा पासवर्ड दर्ज करने की चिंता करनी होगी!
माइकल

1

ProxyCommand एक मामले के लिए एक साफ समाधान है जब आप दोनों सिस्टम में शेल एक्सेस की अनुमति देते हैं। हम एक ब्रोकर (बी) के माध्यम से दूरस्थ उपयोगकर्ताओं को एक आंतरिक मशीन (ए) तक पहुंच देना चाहते थे, लेकिन उपयोगकर्ता को बेहतर सुरक्षा के लिए बी को शेल एक्सेस की अनुमति दिए बिना। यह काम किया:

लॉगिन शेल को बदलें

निम्न स्क्रिप्ट के साथ ब्रोकर पर लॉगिन शेल (उपयोग chsh) बदलें extuser(एक फ़ाइल में संग्रहीत):

#!/bin/sh   # this is essential to avoid Exec format error
ssh internaluser@A

बशर्ते दूरस्थ उपयोगकर्ता के लिए extuser @ B में कोई पासवर्ड लॉगिन स्थापित नहीं किया गया है और extuser @ B के लिए internaluser @ A में स्थापित किया गया है, तो निम्नलिखित कमांड को निष्पादित करने से दूरस्थ उपयोगकर्ता A को सीधे ले जाएगा

ssh extuser@B

युक्ति : कस्टम लॉगिन शेल में बदलने से पहले extuser @ B में आवश्यक कोई पासवर्ड लॉगिन अधिकृत_कीप सेटअप नहीं बनाएं। परिवर्तन के बाद, चूंकि यह खाता शेल के माध्यम से किसी के लिए भी अप्राप्य है, केवल एक sudoer @ B फ़ाइल को सीधे_ संपादन करके अधिकृत_की में परिवर्तन कर सकता है।

sudo vi ~extuser/.ssh/authorized_keys
sudo touch ~extuser/.hushlogin

अंतिम पंक्ति बी से लॉगिन बैनर डिस्प्ले को दबाने के लिए है, इसलिए दूरस्थ उपयोगकर्ता के पास ए के लिए पारदर्शी पहुंच है।


बहुत दिलचस्प दृष्टिकोण। हालाँकि, इसके मुख्य निम्न हैं: 1) उपयोग मानक SSH उपयोग (कोई SFTP / SCP समर्थन) तक सीमित है। 2) एक उपयोगकर्ता एक एकल के अलावा किसी अन्य लक्ष्य होस्ट का चयन नहीं कर सकता है (क्योंकि लॉगिन शेल में हार्डकोड) 3) होस्ट कुंजी का सत्यापन अंतिम लक्ष्य होस्ट (ब्रोकर एसएसएच बाइनरी के उपयोग के बाद) से कार्य केंद्र से नहीं किया जा सकता है । 4) अंतिम लक्ष्य होस्ट तक पहुंचने के लिए उपयोगकर्ताओं की निजी कुंजियाँ उपयोगकर्ता के बजाय ब्रोकर पर निवास कर रही हैं। यह एक व्यवस्थापक द्वारा उपयोगकर्ता के प्रतिरूपण के लिए अनुमति देता है (जो सामान्य रूप से संभव नहीं है)।
gertvdijk

सभी बिंदुओं के सच होने, विस्तार के लिए धन्यवाद। हालांकि, प्राथमिक उद्देश्य ए में बिना लॉगिन के बी के लिए एक विश्वसनीय उपयोगकर्ता ssh पहुँच प्रदान करना है। केवल व्यवस्थापक बी पर विश्वसनीय उपयोगकर्ता की सार्वजनिक कुंजी जोड़ सकता है (sudo के माध्यम से, लॉगिन के बिना), यह पहले से ही उपयोगकर्ता के पास है ( व्यवस्थापक) एक्सट्यूसर @ बी (बाहर विश्वसनीय उपयोगकर्ता का नहीं) की निजी कुंजी तक पहुंच, और इसे पहले स्थान पर स्थापित किया है!
सनतहर

1

आप मतलब है कि आप कई jumpers की जरूरत :)

हाल ही में, मैं अपने जम्पर 1 के लिए jumper1 jumper2 और मेरी अंतिम मशीन के साथ इस समस्या से मिला

स्थानीय स्क्रिप्ट:

#!/bin/bash
sshpass -p jumper1Passwd ssh -t jumper1@jumper1IP ./Y00.sh

1 जम्पर पर (जो मेरा राउटर है), मैंने Y00.sh नाम की एक स्क्रिप्ट रखी:

ssh -tt jumper2@jumper2 -i ~/.ssh/id_rsa sshpass -p finalPassWord ssh -tt final@final

आप अपने आईपी और पासवर्ड के साथ इनकी जगह ले सकते हैं, शुभकामनाएँ!

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.