SSH config फ़ाइल में निष्पादन योग्य स्क्रिप्ट से HostName कैसे प्राप्त करें?


10

मुझे अक्सर एक विशेष क्लस्टर से एक मनमाना कंप्यूटर में ssh करने की आवश्यकता होती है (क्लस्टर में सभी मशीनें समान हैं)। हालाँकि, क्लस्टर में उपलब्ध मशीनों का सेट अक्सर बदलता रहता है, इसलिए मेरे पास एक स्क्रिप्ट है जो उपलब्ध होने वाले क्लस्टर से एक मनमाना होस्टनाम लौटाती है और मेरी आवश्यकताओं से मेल खाती है (जैसे, ऑनलाइन और सही ओएस चलाना)।

यह भी ध्यान दें, कि मैं प्रमाणीकरण के लिए Kerberos (GSSAPIAuthentication) क्रेडेंशियल फॉरवर्डिंग का उपयोग कर रहा हूं।

अभी, मैं उपयोग करने में ssh ssh `get_host`। मैं इसके बजाय निष्पादित करना चाहूंगा ssh cluster। एक ज्ञात होस्टनाम के साथ, यह निम्नलिखित में से आसान है /ssh/config:

Host cluster
    HostName static_host.cluster.domain.tld
    GSSAPIAuthentication yes
    GSSAPIDelegateCredentials yes

मैं HostNameअपनी स्क्रिप्ट का उपयोग करके गतिशील रूप से कैसे चुन सकता हूं ? (या एसएसएच में मेरे वांछित कार्य का समर्थन करने के लिए एक अलग तरीका है?) मैं निम्नलिखित की तरह कुछ करना चाहूंगा, लेकिन यह काम नहीं करता है:

Host cluster
    HostName `get_host`   # This does not work
    ...

ग्रैविटी ने दिखाया कि ProxyCommandएक स्क्रिप्ट हो सकती है जो होस्टनाम को प्राप्त करती है और sshइसके उपयोग से netcatया इसके लिए कनेक्शन को आगे बढ़ाती हैsocat । हालाँकि, यह Kerberos क्रेडेंशियल्स को अग्रेषित नहीं कर रहा है। इस के साथ मदद की सराहना की है।

संपादित करें:

आप केर्बरोस के साथ ऐसा नहीं कर सकते जैसा कि मैं चाहूंगा (स्वीकृत उत्तर में टिप्पणियां देखें)। इसलिए, मैं कमांड-लाइन तर्क पर गतिशील पुनर्लेखन करने के लिए ssh-wrapperएक sshउपनाम के रूप में , इस स्क्रिप्ट का उपयोग कर रहा हूं ssh। यह मजबूत नहीं है, लेकिन यह मेरे लिए काम करता है।

#!/bin/bash

# Mapping between host aliases and dynamically-generated hostname
declare -A MAP
MAP[cluster]=`gethost`

# Find and replace on all positional args
args=$*
for key in ${!MAP[@]}; do
    replace=${MAP[$key]}
    args=`echo ${args} | sed "s/\(^\|[[:space:]]\)${key}\(\$\|[[:space:]]\)/${replace}/"`
done

# Execute using called-name if not this script
if [ "ssh-wrapper" != "`basename $0`" ]; then
    exec $0 ${args}
# Otherwise, assume ssh and execute
else
    exec ssh ${args}
fi

जवाबों:


6

~/.ssh/config:

Host cluster
    ProxyCommand ~/bin/cluster-connect

~/bin/cluster-connect:

#!/bin/bash
socat stdio tcp:$(get_host):22

धन्यवाद। यह (या netcat $(get_host) 22) कनेक्शन के लिए बहुत अच्छा काम करता है। लेकिन, यह मेरी केर्बोस क्रेडेंशियल्स को पारित करने के लिए प्रतीत नहीं होता है। मुझे अपनी फ़ाइल में मिल गया है GSSAPIAuthentication yesऔर इसके GSSAPIDelegateCredentials yesतहत , और वे काम करते हैं यदि HostName को खोजबीन दी जाती है, लेकिन अगर मैं Proxyommommand के माध्यम से मार्ग नहीं करता हूं। विचार? मैं सवाल का भी संशोधन करूंगा। Host cluster.ssh/config
डेविड बी।

मुझे नहीं लगता कि आप इसे प्राप्त कर सकते हैं - sshसही टिकट पाने के लिए लक्ष्य होस्टनाम पता होना चाहिए, और इसे गतिशील रूप से प्रदान करने का कोई तरीका नहीं है (केवल एक आवरण का उपयोग करने का छोटा है जो बस चलता है ssh $(get_host) "$@", जैसा कि मैंने समझा था कि आप नहीं चाहते हैं )। यह काम कर सकता है यदि क्लस्टर के सभी सर्वरों में एक ही केर्बोस प्रिंसिपल है, लेकिन मुझे नहीं लगता कि कोई भी कभी भी ऐसा करता है।
user1686

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

डायनामिक खोज / बदलें? ...
user1686

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