क्या आपके पास एक से अधिक ~ / .ssh / config फाइल हो सकती है?


82

हमारे पास एक गढ़ सर्वर है जिसे हम कई मेजबानों से कनेक्ट करने के लिए उपयोग करते हैं, और हमारे .ssh / config एक हजार से अधिक लाइनों तक बढ़ गए हैं (हमारे पास सैकड़ों होस्ट हैं जो हम कनेक्ट करते हैं)। यह थोड़ा बोझिल होने लगा है और मैं जानना चाहूंगा कि क्या एकाधिक फ़ाइलों में .ssh / config फाइल को तोड़ने का कोई तरीका है। आदर्श रूप से, हम यह निर्दिष्ट करेंगे कि अन्य फ़ाइलों को संभवतः .ssh / config फ़ाइल के रूप में माना जाएगा:

~/.ssh/config
  ~/.ssh/config_1
  ~/.ssh/config_2
  ~/.ssh/config_3
  ...

मैंने ssh / config पर प्रलेखन पढ़ा है, और मुझे नहीं लगता कि यह संभव है। लेकिन हो सकता है कि किसी और ने भी इसी तरह का मुद्दा उठाया हो और इसका हल ढूंढ लिया हो।


प्रत्येक उपयोगकर्ता अपने स्वयं के उपयोगकर्ता नाम के साथ गढ़ होस्ट में प्रवेश करें। इसके अलावा, आप कौन सी कॉन्फिग फाइल में डाल रहे हैं जिसमें प्रत्येक होस्ट के लिए एंट्री की आवश्यकता होती है? क्या आप कुछ डिफॉल्ट सेट नहीं कर सकते हैं जो आम हैं?
जेड डैनियल्स


1
जल्द ही, ओपनएसएसएच 7.3 में यह संभव होना चाहिए। Bugzilla.mindrot.org/show_bug.cgi?id=1585#c25
azmeuk

जवाबों:


51

~/.ssh/configफ़ाइल अन्य फ़ाइलें, संभवतः फाइल अनुमति के लिए SSH का चेक से संबंधित सहित के लिए एक निर्देश की जरूरत नहीं है।

इसके आसपास के सुझावों में एक स्क्रिप्ट को सिस्टम में या तो रिपॉजिटरी पर चेकइन हुक के माध्यम से एक साथ कई बदलावों को शामिल किया जा सकता है। एक भी कठपुतली या Augeas जैसे उपकरण में लग सकता है।

हालाँकि, आप इसे एप्रोच करते हैं, हालाँकि, आपको फ़ाइल के बाहर से एकल फाइल बनने के लिए अलग-अलग फाइलों को बदलना होगा।

$ cat ~/.ssh/config_* >> ~/.ssh/config

नोट: ओवरराइट: > बनाम परिशिष्ट:>>

अद्यतन दिसंबर 2017:

7.3p1 और ऊपर से, इसमें शामिल विकल्प है। जो आपको कॉन्फ़िगरेशन फ़ाइलों को शामिल करने की अनुमति देता है।

Include
    Include the specified configuration file(s).  Mul‐
    tiple pathnames may be specified and each pathname
    may contain glob(3) wildcards and, for user config‐
    urations, shell-like “~” references to user home
    directories.  Files without absolute paths are
    assumed to be in ~/.ssh if included in a user con‐
    figuration file or /etc/ssh if included from the
    system configuration file.  Include directive may
    appear inside a Match or Host block to perform con‐
    ditional inclusion.

धन्यवाद जेफ, यह एक अच्छा विचार है। मैं कठपुतली या Augeas के बारे में बहुत अधिक नहीं जानता, इसलिए चीजों को यथासंभव सरल रखने के लिए, आपका समाधान सबसे अच्छा लगता है। मैं कॉन्फ़िगर को कई कॉन्फिगर में तोड़ सकता हूं, और जब भी किसी एक फाइल को संशोधित किया जाता है, तो .ssh / config फाइल को फिर से बनाने के लिए एक सरल स्क्रिप्ट बनाएं। मुझे नहीं पता कि यह एक समाधान कितना साफ है, लेकिन यह मेरे उद्देश्यों के लिए चाल और काम करने लगता है।
रैंगलर

52

आप इस तरह ssh विकल्प में उपयोग करने के लिए वर्तमान विन्यास फाइल निर्दिष्ट कर सकते हैं:

ssh -F /path/to/configfile

लगता है यह एकमात्र तरीका है।

इसके अलावा एक कॉन्फिग को दूसरे में शामिल करने के लिए भी है।


पर्ल के नेट का उपयोग करते समय एक अच्छा विकल्प है :: ओपनएसएसएच मॉड्यूल (जैसे कई निजी कुंजी फ़ाइलों के लिए।), जहां मॉड्यूल सभी संभावनाएं नहीं देता है।
बजे जिमी कोएरटिंग

36

एसएच 7.3 (1 अगस्त, 2016 को जारी) के साथ शुरू, एक Includeनिर्देश उपलब्ध है।

शामिल करें : निर्दिष्ट कॉन्फ़िगरेशन फ़ाइल शामिल करें। कई पथ नामों को निर्दिष्ट किया जा सकता है और प्रत्येक पथनाम में ग्लोब वाइल्डकार्ड और शेल-जैसे "~" उपयोगकर्ता होम निर्देशिकाओं के संदर्भ हो सकते हैं। पूर्ण पथ के बिना फ़ाइलों को माना जाता है ~/.ssh। सशर्त समावेशन करने के लिए एक Includeनिर्देश Matchया Hostब्लॉक के अंदर एक निर्देश दिखाई दे सकता है ।

(यहां हल की गई बग रिपोर्ट की लिंक दी गई है, जिसमें पैच भी शामिल है: https://bugzilla.mindrot.org/show_bug.cgi?id=1585#c24 )


2
यह बहुत अच्छा है। इसके लिए तत्पर हैं। अंत में इस समस्या को सही तरीके से हल करना चाहिए :)
रैंगलर

2
बस configफ़ाइल के शीर्ष पर शामिल निर्देश जोड़ें । मैं यह पता नहीं लगा सकता कि यह नीचे काम क्यों नहीं कर रहा है।
पाइलोवर

17

मैं व्यक्तिगत रूप से ssh config संकलित करने के लिए उन आदेशों का उपयोग करता हूं:

alias compile-ssh-config='echo -n > ~/.ssh/config && cat ~/.ssh/*.config > ~/.ssh/config'
alias ssh='compile-ssh-config && ssh'
# (This will get used by other programs depending on the ~/.ssh/config)
# (If you need you can run the compile-ssh-config command via cron etc.)

या:

alias compile-ssh-config='echo -n > ~/.ssh/config-compilation && cat ~/.ssh/*.config > ~/.ssh/config-compilation'
alias ssh='compile-ssh-config && ssh -F ~/.ssh/config-compilation'
# (This is saver and won't over write an existing ~/.ssh/config file)

चूंकि:

alias ssh='ssh -F <(cat .ssh/*.config)'

मेरे लिए काम नहीं करता है, लौट रहा है:

ssh: Can't open user config file /dev/fd/63: Bad file descriptor

आशा है कि यह किसी भी मदद की होगी।


ssh -F <(cat .ssh/*.config)आदर्श होगा। मैं भी इसके साथ आया था, लेकिन मुझे वही त्रुटि मिल रही है। किसी को पता है कि यहाँ समस्या क्या है?
बीमारी

2
ssh चेक फ़ाइल की अनुमति देता है, मुझे लगता है कि इस तरह के रीडायरेक्ट उस चेक का समर्थन नहीं करता है।
कैमडेन नार्कट सेप

2

मैं भी cat config_* > configपूरे विन्यास उत्पन्न करने के लिए उपयोग करेगा । लेकिन मैं इसके लिए कठपुतली / cengine आदि का उपयोग नहीं करूंगा, अगर वे अभी तक जगह में नहीं हैं (BTW: क्यों नहीं एक विन्यास प्रबंधन का उपयोग करें))।

मैं एक पैकेज (डिबेट, आरपीएम) उत्पन्न करूंगा और इसे स्थानीय भंडार में रखूंगा। और बाद की स्क्रिप्ट में बिल्ली आपके कॉन्फिग को जनरेट करती है। शायद आप एक स्थानीय फ़ोल्डर भी शामिल करते हैं ... फायदा यह है, कि ssh / config अपडेट एक दैनिक आधार पर सक्रिय होता है जबकि cron-apt और Co रन।


0

आप मेकफाइल का उपयोग कर सकते हैं ~/.ssh:

    config: config.in config.app.in
        > $@
        (for f in $+; do cat $$f; echo; done) | sed '$$ d' >> $@

    config.app.in:
        (echo "# Generated with foobar.sh."; \
            foobar.sh) > $@
    .PHONY: config.app.in

फिर अपने मौजूदा configको ले जाएं config.inऔर makeजेनरेट करने के लिए दौड़ें config


0

मैं config.dअपने विन्यास आयोजन के लिए एक निर्देशिका की अवधारणा के साथ खेल रहा हूं । तो उपरोक्त ढेर विकल्पों में जोड़ने के लिए, यहाँ मेरे लिए क्या काम कर रहा है।

निर्देशिका संरचना कुछ इस तरह है

~/.ssh/config.d
├── system_1
├── system_2
├── system_3
├── personal_boxen
├── git_things
├── random
└── rubbish

फ़ंक्शन जो ~ / .ssh / config बनाता है और मेरे शेल के रन-कॉन्फ़िगर में रहता है वह इस प्रकार है

sshMakeConfig() {
    echo '# AUTOGENERATED by sshMakeConfig()' > ~/.ssh/config
    for i in ~/.ssh/config.d/*
        do echo "#${i}" | tee -a ~/.ssh/config
        cat ${i} >> ~/.ssh/config
    done
}

sshMakeConfigयदि आप प्रत्येक शेल सत्र पर एक नया कॉन्फिगरेशन सुनिश्चित करना चाहते हैं तो वैकल्पिक रूप से अपने रन-कॉन्फिगर के नीचे जोड़ें

किसी भी समय मुझे अपने ~ / .shsh / config को फिर से जोड़ने की जरूरत है, मैं ऐसा sshMakeConfigकिसी न किसी रूप में चलाकर (सीधे, मेरे रन- कॉन्फिगर को सोर्स करके , या एक नया शेल शुरू करके) करता हूं

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