डायनामिक रूप से SSH होस्ट प्रविष्टियाँ ~ / .ssh / config में जनरेट करें


9

मुझे ssh पर मेजबानों के पूरे ढेर का प्रशासन करना है। हालाँकि मैं उन्हें केवल एक निश्चित गेटवे ssh सर्वर के माध्यम से एक्सेस कर सकता हूँ।

मेरे पास निम्नलिखित हैं ~/.ssh/config:

Host mygateway-www
Hostname www
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

हालाँकि मुझे इनमें से बहुत सारी मशीनों से जुड़ना है। दर्जनों प्रविष्टियों को मेरे स्थान पर रखने के बजाय ~/.ssh/config, क्या मुझे इस तरह से कुछ हो सकता है:

Host mygateway-*
Hostname ???WHAT GOES HERE????
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh mygateway nc %h 22

मुझे पता है कि आप तर्क %hमें उपयोग कर सकते हैं Hostname, लेकिन वह होस्टनाम होगा। मुझे वास्तव में किसी प्रकार के स्ट्रिंग प्रतिस्थापन की आवश्यकता है, जैसे बैश की ${VAR%thingie}। क्या यह संभव है?

जवाबों:


24

यह निम्नलिखित SSH विन्यास फाइल के साथ किया जा सकता है:

Host *
  ServerAliveInterval 120

Host gateway.somewhere.com
  User jdoe

Host gateway+*
  User jdoe
  ProxyCommand ssh -T -a $(echo %h |cut -d+ -f1).somewhere.com nc $(echo %h |cut -d+ -f2) %p 2>/dev/null
  ControlMaster auto
  ControlPath ~/.ssh/ssh-control_%r@%h:%p

आप तब अपने आंतरिक मेजबान तक पहुंचते हैं जैसे:

ssh gateway+internalhost01.somewhere.com
ssh gateway+internalhost02.somewhere.com

सही हाफ के लिए आपके द्वारा चुना गया नाम जंप होस्ट द्वारा रिजॉल्व होना चाहिए।

उपयोगकर्ता पैरामीटर को उस स्थिति में निर्दिष्ट किया जाता है जब आपको होस्ट के विभिन्न वर्गों पर अलग-अलग उपयोगकर्ताओं को मैन्युअल रूप से मैप करने की आवश्यकता होती है। ControlMaster और ControlPath को SSH कनेक्शन को फिर से उपयोग करने की अनुमति देने के लिए निर्दिष्ट किया गया है।


6

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

बस कोशिश करें:

Host *.domain  
  IdentityFile ~/.ssh/id_rsa  
  ProxyCommand ssh mygateway /usr/bin/nc %h 22

उस दृष्टिकोण के साथ समस्या यह है कि होस्टनाम काफी सामान्य है (उदाहरण के लिए db1, www, mail2), जबकि मैं चाहता हूं कि वे प्रोजेक्ट असवेल के साथ उपसर्ग करें, क्योंकि मुझे 'db2' नामक एक अलग मशीन पर ssh करने की आवश्यकता हो सकती है। इसलिए मेजबान में उपसर्ग
रोरी

2
तो आप वास्तव में अपने DNS को फिर से कॉन्फ़िगर करना चाहते हैं। सबसे सरल (लेकिन सबसे बोझिल समाधान) अपनी मेजबान फ़ाइल को संशोधित करना है। दूसरी ओर आप हमेशा एक .invalid डोमेन के साथ अपने वर्कस्टेशन में एक स्थानीय DNS सर्वर जोड़ सकते हैं और आपके द्वारा पसंद किए जाने वाले होस्टनाम का उपयोग कर सकते हैं।
मार्टिन एम।

पहले के +1। प्रत्येक प्रोजेक्ट के लिए एक उपडोमेन बनाएँ। DNS आपके जीवन को आसान बनाने के लिए है;)
Dan Carley

1

ऐसा लगता है कि ऐसा करने का कोई तरीका नहीं है।


1

मुझे एक समान समस्या थी और एक स्क्रिप्ट लिखना समाप्त हो गया जिसने मेरे लिए सभी बॉयलरप्लेट उत्पन्न किए। अब मैं ~ / ssh / config नहीं बदलता, मैं ~ / ssh / config.in बदल देता हूँ और अपनी स्क्रिप्ट फिर से चलाता हूँ।


1
अपनी स्क्रिप्ट साझा करने के लिए देखभाल? मैंने ऐसा करने के बारे में सोचा है, लेकिन ऐसा लगता है कि एक मजबूत और सामान्य समाधान सही होने के लिए बहुत काम कर सकता है। यहां तक ​​कि अगर आपका समाधान अभी तक नहीं है, तो यह जानना उपयोगी होगा कि आपको क्या लगता है कि यह सही है, और यदि आप इसे करना चाहते हैं तो आप क्या करेंगे।
iconoclast

मेरा विचार .ssh/config.dप्रत्येक टेम्पलेट के लिए एक फ़ाइल के साथ होना था , जहाँ प्रत्येक टेम्पलेट फाइनल में एक या अधिक प्रविष्टियाँ उत्पन्न करेगा ~/.ssh/config। सार्वभौमिक चर के साथ एक फ़ाइल भी होगी, लेकिन प्रत्येक टेम्पलेट के अपने स्वयं के चर हो सकते हैं जो शीर्ष पर सूचीबद्ध ग्लोबल्स पर पूर्वता लेंगे। ~/.ssh/configफ़ाइल बात-जब तक आप इसे करने के लिए सीधे तौर पर संपादित जिसे आप सुरक्षित करना चाहता था बनाया कभी नहीं के रूप में मांग पर या पर एक उत्पन्न किया जा सकता है अनुसूची-यह नहीं होता।
iconoclast

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

समझा जा सकता। मेरे द्वारा बताए गए दृष्टिकोण पर किसी भी प्रतिक्रिया की सराहना की जाएगी, खासकर अगर मैं या तो कुछ महत्वपूर्ण आवश्यकता या मामले का उपयोग कर रहा हूं, या फिर कुछ बड़ी (या छोटी) बाधाएं।
iconoclast

1
मुझे लगता है कि यह एक अच्छा दृष्टिकोण है, शायद मेरे द्वारा उपयोग किए जाने वाले दृष्टिकोण से थोड़ा कम भ्रमित है। मैंने कई होस्ट की घोषणाओं को स्मृति में पढ़ा, फिर कई गैर-मेजबान घोषणाओं को पढ़ा। गैर-होस्ट घोषणाएँ वर्तमान समूह में प्रत्येक होस्ट पर तब तक लागू की जाती हैं जब तक कि कोई अन्य होस्ट न हो। मैं होस्ट को फ़ाइल में कई बार घोषित करने की अनुमति देता हूं, जिसमें ग्लोबिंग का उपयोग करना शामिल है। अंत में मैं स्मृति में जो कुछ भी बना रहा हूं, वह सब लिखता हूं।
माइकल हॉफमैन

1

Hostnameघोषणा के माध्यम से सीधे होस्टनाम को ओवरराइड करने को निर्दिष्ट करने पर ध्यान न दें और इसके बजाय इसे रनटाइम पर निर्धारित करें। इसे कमांड के रूप में ProxyCommandउपयोग करके, इसे भाग के रूप में मूल्यांकित करके %hकरें ( %pहार्डकॉफ़्ट पोर्ट के बजाय 22 के रूप में भी उपयोग करें )

Host mygateway-*
   #Hostname ???WHAT GOES HERE????
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc $(echo %h|sed 's/^mygateway-//') %p

एक और भी अधिक सामान्य श्लोक हो सकता है, जिसके तहत आप किसी भी मेजबान को निर्दिष्ट कर सकते हैं बिना एक के -रूप में व्यवहार किया जा सकता है, या किसी अन्य मिलान श्लोक के अनुसार, लेकिन -कोई भी निर्दिष्ट करने के लिए एक सामान्य दृष्टिकोण है <gateway>-<target>:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh $(echo %h|cut -d - -f1) nc $(echo %h|cut -d - -f2-) %p

इसके अतिरिक्त, SSH क्लाइंट के नए संस्करण [-W host:port]सीधे nc(netcat) के समान कार्य करने के विकल्प का समर्थन करते हैं । जैसे, हम संशोधित का उपयोग कर सकते हैं:

Host *-*
   # Assume LHS of "-" is GW and RHS of "-" is target host
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh -W $(echo %h|cut -d - -f2-):%p $(echo %h|cut -d - -f1)

बेशक, यदि आपके पास मेजबानों की एक सीमित सूची थी, तो आप हमेशा ऐसा कर सकते हैं:

Host host1 host2 host3 hostN
   IdentityFile ~/.ssh/id_rsa
   ProxyCommand ssh mygateway nc %h %p

उम्मीद है की यह मदद करेगा!


0

मेरे पास एक ही सेटअप वाला एक क्लाइंट था और मैंने अपनी समस्या को हल करने के लिए डीएसईएचएस का उपयोग किया ।
अन्य चीजों के बीच DSSH आपको गेटवे होस्ट के माध्यम से दूरस्थ मेजबान में पारदर्शी रूप से प्रवेश करने की अनुमति देता है।

बक्सों का इस्तेमाल करें

  • सिस्को राउटर्स से कॉन्फ़िगरेशन पैरामीटर लीजिए जिसमें "एना" लॉगिन की आवश्यकता होती है
  • सर्वरों में लॉग इन करें, जिसमें PermitRootLogin को सीधे रूट के रूप में अक्षम किया गया है (स्वचालित रूप से su - और पासवर्ड टाइप करके), जबकि लगातार स्थिति का संरक्षण
  • उन्नत तर्क जैसे कस्टम तर्क जोड़ें
  • लक्ष्य सर्वर को पाने के लिए कई कनेक्शन के माध्यम से सुरंग

5
मैं कुछ यादृच्छिक थर्ड पार्टी ssh क्लाइंट का उपयोग करना शुरू नहीं करूँगा जो जावा का उपयोग करता है, उन चीजों के लिए जो मैं ~ / .ssh / config में कर सकता हूं।
रॉरी

लिंक मृत है
iconoclast

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