मुझे अक्सर एक विशेष क्लस्टर से एक मनमाना कंप्यूटर में 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