वहाँ एक SSH विन्यास फाइल के लिए एक और एक को शामिल करने के लिए एक रास्ता है?


131

मामले में यह मायने रखता है:

  • ओएस: उबंटू 10.04
  • SSH: OpenSSH_5.3p1 डेबियन-3ubuntu5

मैं एक और एक को शामिल करने के लिए एक एसएसएच कॉन्फिग फ़ाइल चाहता हूँ। उपयोग का मामला यह होगा कि मैं अपनी डिफ़ॉल्ट .ssh/configफ़ाइल में जो कुछ भी चाहता हूं उसे परिभाषित करूं और फिर एक अतिरिक्त फ़ाइल (जैसे ~/.ssh/foo.config) में कुछ अतिरिक्त चीजों को प्री-पेंड कर दूं । मैं दूसरी फ़ाइल पहले वाले को शामिल करना चाहता हूँ, हालाँकि, मुझे पहले एक में सब कुछ डुप्लिकेट नहीं करना है। क्या वह करने योग्य है? धन्यवाद!


जवाबों:


140

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

Include

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

उदाहरण के लिए आप में हो सकता है ~/.ssh/config:

Include config.d/home

Host github.com
    HostName github.com
    User git

और इसमें ~/.ssh/config.d/home:

Host laptop
    HostName laptop.lan

टिप्पणियों से, सभी फ़ाइलों को config.dनिर्देशिका में शामिल करने के लिए नीचे का उपयोग करें :

Include config.d/* 

13
$ ssh -V
Pieter

7
Include config.d/*सभी प्रविष्टियों को शामिल करने के लिए उपयोग करें config.d
साइमन वुडसाइड

17
फीट: यह फ़ाइल के शीर्ष में जाना है और Hostप्रविष्टियों की सूची में जोड़ा नहीं जा सकता है ।
dtk

2
उबंटू 16.04 पर कोशिश की। हालांकि, यह काम करता है, लेकिन स्वत: पूर्ण टूट गया है जो इसे कम उपयोगी बनाता है। आप ubuntu पर ssh उन्नत करने के लिए चाहते हैं, इस लिंक की जाँच gist.github.com/stefansundin/0fd6e9de172041817d0b8a75f1ede677
cwhsu

@dtk इसके लिए धन्यवाद। यही मुझे स्टम्पिंग कर रहा था
एडम कीनन

28

नहीं, मेरी जानकारी में यह संभव नहीं है।

यहां संबंधित खुली सुविधा अनुरोधों / बग टिकटों के लिंक दिए गए हैं:

https://bugzilla.mindrot.org/show_bug.cgi?id=1585

https://bugs.launchpad.net/ubuntu/+source/openssh/+bug/739495


2
इसके अलावा डेबियन पर यह बग: bugs.debian.org/cgi-bin/bugreport.cgi?bug=631189
Lluís

8
हे भगवान। यह ढुलमुल है। 2016-04-15 13:01:08 ईएसटी से: Slightly modified patch applied, this will be in openssh-7.3
ओशरेनक

यह उत्तर उस समय सही था, लेकिन अब पुराना है।
मार्क स्टोसबर्ग

25

यदि आप ssh क्लाइंट शुरू करना चाहते हैं, तो आप इसे bash में कर सकते हैं:

#files are .ssh/config and ~/.ssh/foo.config
alias ssh='ssh -F <(cat .ssh/config ~/.ssh/foo.config)'

तब आप सामान्य रूप से ssh का उपयोग करते हैं और इसमें उस क्रम में पढ़ी गई दोनों फाइलें होंगी।

सर्वर डेमॉन के लिए sshdआप ऐसा ही कर सकते हैं, बस -fइसके बजाय उपयोग करें -Fऔर इसे नीचे लिखें जहां आप सीधे डेमन शुरू करते हैं। आपको एक उपनाम की आवश्यकता नहीं है।

मैन पेज के अनुसार एक दूसरी संभावना है कि सिस्टम वाइड कॉन्फ़िगरेशन /etc/ssh/ssh_configऔर उपयोगकर्ता को एक में रखा जाए ~/.ssh/config

अपडेट करें जाहिर है कुछ बैश संस्करणों के साथ कुछ समस्या है और डिवाइस कैसे बनाए जाते हैं। (देखें http://bugs.alpinelinux.org/issues/1465 )

यह एक वर्कअराउंड है (हालांकि मेरी राय में बदसूरत):

mkfifo /tmp/ssh_fifo
cat ~/.ssh/config ~/.ssh/foo.config >/tmp/ssh_fifo & 
ssh -F /tmp/ssh_fifo myserver
rm /tmp/ssh_fifo

इसलिए यदि आप चाहें, तो आप इसमें से एक समारोह (या एक स्क्रिप्ट) बना सकते हैं:

ssh() {
    tmp_fifo=$(mktemp -u --suffix=_ssh_fifo)
    mkfifo "$tmp_fifo" 
    cat ~/.ssh/config ~/.ssh/foo.config >"$tmp_fifo" 2>/dev/null & 
    /usr/bin/ssh -F "$tmp_fifo" "$@"
    rm "$tmp_fifo"
}

1
अफसोस की बात यह है कि यह OSX के ssh पर काम नहीं करता है: उपयोगकर्ता कॉन्फिग फाइल / dev / fd / 63 नहीं खोल सकता: खराब फाइल डिस्क्रिप्टर
Ash बर्लिन-टेलर

यह मेरे लिए भी (उबंटू 11.10) लिनक्स पर काम नहीं करता है, जैसा कि @AshBerlin ने पोस्ट किया है।
सिजोन जे S

@AshBerlin आप इसे भी आजमा सकते हैं, यह OSX के लिए भी काम करना चाहिए, जब तक कि बग ठीक न हो जाए
estani

Ssh तीन स्थानों की जाँच करता है, 1. कमांड लाइन, 2. ~/.ssh/config, 3. /etc/ssh/ssh_config, आपको ~/.ssh/configकमांड लाइन पर भी पास होने की आवश्यकता नहीं है । बस alias ssh='ssh -F ~/.ssh/foo.config'और ~/.ssh/configउसके बाद उठना चाहिए। जब तक आपका मन नहीं करता है foo.configकि पहले लोड किया जाए जो उपरोक्त वर्कअराउंड से क्लीनर होना चाहिए।
जिम

1
@ नहीं, यह उस तरह काम नहीं करता है। पहले पाया गया प्रयोग किया जाता है। या तुमने कोशिश की? मैन पेज से "-F configfile: एक वैकल्पिक प्रति-उपयोगकर्ता कॉन्फ़िगरेशन फ़ाइल निर्दिष्ट करता है । यदि कमांड लाइन पर एक कॉन्फ़िगरेशन फ़ाइल दी गई है, तो सिस्टम-वाइड कॉन्फ़िगरेशन फ़ाइल (/ etc / ssh / ssh_config) को अनदेखा किया जाएगा।"
एस्टानी

17

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

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

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


14

इसी तरह अन्य 'बदसूरत' के लिए यहाँ एक लाइनर है:

alias ssh="cat ~/.ssh/config.d/* > ~/.ssh/config; ssh"

ध्यान दें कि sftpकमांड विन्यास पुनर्गणना को ट्रिगर नहीं करेगा।
वास्यानोविकोव

2
(मुझे अभी भी उत्तर पसंद है क्योंकि यह "config.d /" का उपयोग करता है और बहुत सरल है।)
VasyaNovikov

2
सरल, सुंदर, अभी तक
हैकी

6

खैर, मैं यह करने के लिए धोखा। मेरी bash .profile-ish फ़ाइलों में मेरे पास एक ब्लॉक है जो लॉगिन पर मेरे होम डायरेक्टरी के विभिन्न टुकड़ों को बदल देता है, इसलिए मैं हर बार एक नया जेनरेट करता हूं। उदाहरण:

rm ~/.ssh/config
cat ~/conf/myservers.sshconfig >> ~/.ssh/config

[ -f ~/conf/workservers.sshconfig ] && cat ~/conf/workservers.sshconfig >> ~/.ssh/config
(or something like this:)
for i in `ls ~/conf/sshconfigs` ; do
    cat $i >> ~/.ssh/config
done

chmod 600 ~/.ssh/config

इससे मुझे ssh config फाइल में कॉन्फिग ब्लॉक जोड़ने की भी सुविधा मिलती है, अगर मैं होस्ट A या B पर हूं, लेकिन अपने होम सिस्टम पर नहीं।

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


3

मैं व्यक्तिगत रूप से 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

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


आप आगे एक कदम जाने के लिए और पर फ़ाइल परिवर्तन fswatch के साथ इस गठबंधन, स्वचालित संकलन के लिए कर सकता है
काफिले

3

दूसरा, FUSE- आधारित समाधान (स्वयं परीक्षण नहीं किया गया):

https://github.com/markhellewell/sshconfigfs

"एक बड़ी फ़ाइल का प्रबंधन जारी रखने के बजाय, [...] इसके बजाय एक विन्यास" फ़ाइल का निर्माण करें "गतिशील रूप से कई छोटी तार्किक चोटियों से।"

मैंने FIFOs के माध्यम से ऐसा करने वाला एक लेख भी पाया है: http://www.linuxsysadmintutorials.com/multiple-ssh-client-configuration-files/


1
मुझे टिप्पणी की सामग्री पर्याप्त वर्णनात्मक लगती है - यह कहता है "FUSE" (शायद विस्तार का विस्तार बेहतर होगा); लिंक सिर्फ एक कार्यान्वयन के लिए है।
अवीव

1
कम जवाब समस्या के बारे में पता नहीं था, जवाब का विस्तार किया। ऐसा लगता है कि मुझे ईमेल सूचनाओं की अनुपस्थिति में समय-समय पर अपने उत्तरों के लिए साइट की जांच करनी होगी :) अब तक फ़ेव का उपयोग करना सीखा। टिप्पणियों के लिए धन्यवाद।
amontero

2

इनमें से कोई भी अन्य समाधान gitअन्य कार्यक्रमों या अन्य कार्यक्रमों के लिए काम नहीं करता है ssh

मैंने एक त्वरित और गंदे को एक साथ थप्पड़ मारा है, लेकिन आप उस पर सुधार करना चाहते हैं।

इसे अपने में जोड़ें ~/.bashrc

mkdir -p ~/.ssh/config.d/
[ -e ~/.ssh/config ] && mv ~/.ssh/config ~/.ssh/config.bak.$(date -Ins)
cat ~/.ssh/config.d/* > ~/.ssh/config

हर बार जब आप एक सत्र शुरू करते हैं, तो यह सभी फाइलों को एक साथ मिला देगा ~/.ssh/config.d। (पंक्ति 3)

इस संस्करण के साथ नकारात्मक पक्ष यह है कि यदि आप ~/.ssh/configअगले सत्र को बदलते हैं तो आप अपने परिवर्तनों को खो देंगे, इसलिए यह रोकने के लिए कि मैं मौजूदा फ़ाइल को एक .bak फ़ाइल में स्थानांतरित करता हूं। (पंक्ति 2) समस्या यह है कि आप थोड़ी देर के बाद .bak फ़ाइलों की एक पूरी बहुत कुछ करने जा रहे हैं।


कुछ is_anything_changedशर्त जोड़ने के साथ बहुत बढ़िया
vp_arth

1

आप आसानी से Ubuntu पर SSH संस्करण को v7.3 (Ubuntu Ubuntu 16.04 पर परीक्षण किया गया) को याककी से पैकेज इंस्टॉल करके अपग्रेड कर सकते हैं:

echo "deb http://archive.ubuntu.com/ubuntu yakkety main" > /etc/apt/sources.list.d/yakkety.list
apt-get update
apt-get install -y ssh
rm /etc/apt/sources.list.d/yakkety.list
apt-get update

SSH संस्करण की जाँच करें

ssh -V
OpenSSH_7.3p1 Ubuntu-1, OpenSSL 1.0.2g 1 Mar 2016

उपयोग करने के लिए SSH कॉन्फ़िगर करें ~ / .ssh / config.d निर्देशिका से शामिल है

mkdir ~/.ssh/config.d
sed -i '1iInclude config.d/*' ~/.ssh/config

0

मेरा गूंगा जवाब:

  • क्सिअल (16.04) पर ओपनएसएसएच> 7.3 स्थापित करने की कोशिश की
  • इसे बनाया गया गड़बड़ पसंद नहीं आया

इसलिए मैंने इसके लिए समझौता किया:

  • अपनी अलग ओपनएसएसएच फाइल को अंदर रखें ~/.ssh/config.d/
  • जब आप एक को बदलते हैं, करते हैं cat ~/.ssh/config.d/* > ~/.ssh/config
  • उस शानदार दिन पर जब आप OpenSSH 7.3p1 या नए संस्करण वाले डिस्ट्रो संस्करण में अपग्रेड करते हैं, आप इसके बजाय एक फ़ाइल बना सकते हैं जिसमें सम्‍मिलित है

Include config.d/*


0

मैं अपनी मशीन पर SSH को न तो अपग्रेड कर सकता हूं और न ही।

मैंने GNU बनाने के लिए ssh कॉन्फिग फाइल तभी तैयार की है जब जरूरत हो :

# Concatenates all the .config files.
aInput  = *.config
aOutput = ~/.ssh/config

aCurrentMakefile = $(lastword $(MAKEFILE_LIST))

$(aOutput): $(shell ls $(aInput)) $(aCurrentMakefile)
    @echo "Generating $(aOutput)"
    @echo "# File generated by $(aCurrentMakefile) on $(shell date +'%F %T.%6N')" > $(aOutput)
    @cat $(aInput) >> $(aOutput)

तब ssh को अलियास किया जाता है

alias ssh='make -s -f ~/Tools/config.d/makefile -C ~/Tools/config.d && ssh'

यह एक सम्मोहन की तरह काम करता है।

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