SSH सुरंग के माध्यम से SSH कनेक्शन के लिए शॉर्टकट कैसे कॉन्फ़िगर करें


22

मेरी कंपनी के उत्पादन सर्वर (FOO, BAR ...) दो गेटवे सर्वर (ए, बी) के पीछे स्थित हैं। सर्वर FOO से कनेक्ट करने के लिए, मुझे अपने उपयोगकर्ता नाम JOHNDOE के साथ सर्वर A या B के साथ एक ssh कनेक्शन खोलना होगा, फिर A (या B) से मैं मानक उपयोगकर्ता नाम के साथ SSH कनेक्शन खोलने वाले किसी भी उत्पादन सर्वर तक पहुँच सकता हूँ (चलो इसे कॉल करें) वेबी)।

इसलिए, हर बार मुझे कुछ करना होगा:

ssh johndoe@a
...
ssh webby@foo
...
# now I can work on the server

जैसा कि आप कल्पना कर सकते हैं, यह एक परेशानी है जब मुझे उपयोग करने की आवश्यकता होती है scpया अगर मुझे जल्दी से कई कनेक्शन खोलने की आवश्यकता होती है।

मैंने ssh कुंजी कॉन्फ़िगर की है और मैं कुछ शॉर्टकट के लिए .ssh / config का उपयोग कर रहा हूं।

मैं सोच रहा था कि क्या मैं टाइप करने के लिए किसी तरह का ssh कॉन्फ़िगरेशन बना सकता हूं

ssh foo

और SSH को मेरे लिए सभी कनेक्शनों को खोलने / अग्रेषित करने दें। क्या यह संभव है?

संपादित करें

वोमबले का उत्तर ठीक वैसा ही है जैसा मैं देख रहा था, लेकिन अभी लगता है कि मैं नेटकैट का उपयोग नहीं कर सकता क्योंकि यह गेटवे सर्वर पर स्थापित नहीं है।

weppos:~ weppos$ ssh foo -vv
OpenSSH_5.1p1, OpenSSL 0.9.7l 28 Sep 2006
debug1: Reading configuration data /Users/xyz/.ssh/config
debug1: Applying options for foo
debug1: Reading configuration data /etc/ssh_config
debug2: ssh_connect: needpriv 0
debug1: Executing proxy command: exec ssh a nc -w 3 foo 22
debug1: permanently_drop_suid: 501
debug1: identity file /Users/xyz/.ssh/identity type -1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_rsa type 1
debug2: key_type_from_name: unknown key type '-----BEGIN'
debug2: key_type_from_name: unknown key type 'Proc-Type:'
debug2: key_type_from_name: unknown key type 'DEK-Info:'
debug2: key_type_from_name: unknown key type '-----END'
debug1: identity file /Users/xyz/.ssh/id_dsa type 2
bash: nc: command not found
ssh_exchange_identification: Connection closed by remote host

जवाबों:


36

काइल के जवाब के और अधिक ठोस संस्करण के रूप में, आप अपनी ~/.ssh/configफ़ाइल में क्या रखना चाहते हैं :

host foo
  User webby
  ProxyCommand ssh a nc -w 3 %h %p

host a
  User johndoe

फिर, जब आप "ssh foo" johndoe@aचलाते हैं , तो SSH SSH को , चलाने netcat( nc) के लिए प्रयास करेगा , फिर webby@fooइस सुरंग के माध्यम से SSH का प्रदर्शन करेगा । जादू!

बेशक, ऐसा करने के लिए, नेटवे को गेटवे सर्वर पर स्थापित करने की आवश्यकता है; यह पैकेज हर बड़े वितरण और OS के लिए उपलब्ध है।


अति उत्कृष्ट! मैं यह पता लगाने की कोशिश कर रहा था कि मैं पहले कभी भी उस सटीक स्थिति में नहीं गया था। मैं अपना जवाब वहां रखूंगा, अगर भविष्य में यह किसी अन्य व्यक्ति की कम विशिष्ट स्थिति में मदद कर सकता है।
काइल ब्रान्ड

मैंने अपने कनेक्शन के क्रिया आउटपुट सहित अपने मूल प्रश्न को अपडेट किया है। ऐसा लगता है कि मैं netcat का उपयोग नहीं कर सकता। क्या यह डिफ़ॉल्ट रूप से उपलब्ध होना चाहिए?
सिमोन कारलेटी

हमेशा नहीं, क्या आपके पास इसे स्थापित करने की शक्ति है? आप टेलनेट के साथ भी ऐसा करने में सक्षम हो सकते हैं, मैंने कभी यह कोशिश नहीं की है ...
काइल ब्रान्ड

तुम भी अपने घर निर्देशिका के लिए netcat डाउनलोड करने और वहाँ संकलन करने में सक्षम हो सकता है। तब आप प्रॉक्सी कमांड में पूर्ण पथ का उपयोग कर सकते हैं, अर्थात / घर / उपयोगकर्ता नाम / बिन / एनसी
काइल ब्रान्ड

मैंने अभी सिस्टम सेटिंग्स की जाँच की है। Ubuntu netcat डिफ़ॉल्ट रूप से उपलब्ध लगता है, दुर्भाग्य से गेटवे सर्वर OpenSUSE द्वारा संचालित हैं। मैं गेटवे सर्वर पर भी netcat स्थापित करने पर विचार करने जा रहा हूँ।
सिमोन कारलेटी

7

आप अपनी ~ / .ssh / config फाइल में ProxyCommand निर्देश का उपयोग कर सकते हैं, उदाहरण के लिए रिले के रूप में netcat का उपयोग करने के लिए:

host server2
    ProxyCommand ssh server1 nc server2 22

आप बस 'ssh server2' का उपयोग करेंगे। इस निर्देश की मैन पेज जानकारी 'मैन ssh_config' में मिली है


5

मैं एक अलग दृष्टिकोण पसंद करता हूं जो गेटवे सर्वर के लिए एक पूर्व-प्रमाणित सुरंग बनाए रखता है। इन ~/.ssh/config:

Host a
    ControlMaster auto
    ControlPath ~/.ssh/control-master/%r@%h:%p

फिर में .bashrc:

s () {
        if ( ssh -O check a 2>&1 > /dev/null 2>&1 )
        then
                ssh -t a ssh $1
        else
                if [[ -S ~/.ssh/control-master/insyte@a:22 ]]
                then
                        echo "Deleting stale socket..."
                        rm ~/.ssh/control-master/insyte@a:22
                fi
                echo "Opening master session..."
                if ssh -Nf a
                then
                         ssh -t a ssh $1
                fi
        fi
 }

तो फू से कनेक्ट करने के लिए:

s foo

पहली बार जब आप इसे कनेक्ट करते हैं तो यह आपको "ए" के खिलाफ प्रमाणित करेगा और एक निरंतर, पृष्ठभूमि वाली एसश सुरंग को खोलेगा। "S" के बाद की कॉल पूर्व-निर्देशित सुरंग के माध्यम से लगभग तुरंत खुल जाएगी।

बहुत अच्छा काम करता है।


2

इस प्रकार की कार्यक्षमता ओपनएसएसएच के नए संस्करणों में मौजूद है और इसका उपयोग करके किया जा सकता है

ssh -W server2 server1

server2आपका इच्छित गंतव्य कहां है और server1आपका प्रॉक्सी होस्ट है। आप ProxyCommandअपने ssh config में विकल्प का उपयोग करके इसे आसान बना सकते हैं , जैसे कुछ:

host = *.example.com
user = packs
port = 22
ProxyCommand ssh -W %h:%p server1

ऐसा लगता है कि इसे काम करने के लिए, आपको सभी तीन स्थानों पर OpenSSH 5.4+ की आवश्यकता है: डेस्कटॉप, मध्यस्थ, गंतव्य। (खैर, पहला और आखिरी, निश्चित रूप से)।
स्टीव बेनेट

@SteveBennett: मैं कुछ समय के लिए इस पद्धति का उपयोग कर रहा हूं, यह बहुत अच्छा काम करता है। मुझे आरएचईएल 5 सिस्टम के एक जोड़े पर नेटकैट विधि पर वापस लौटना पड़ा, जो कष्टप्रद था।
स्कॉट पैक

2

जब netcatप्रॉक्सी पर उपलब्ध नहीं है, तो इस चाल की कोशिश करें:

host foo
  User webby      
  ProxyCommand ssh a 'exec 3<>/dev/tcp/foo/22; cat <&3 & cat >&3;kill $!'

host a
  User johndoe

तब आपको सक्षम होना चाहिए ssh foo

इसके अलावा, यदि आपके पास ssh का हाल का संस्करण है (यानी, -Wमानक इनपुट और आउटपुट को अग्रेषित करने के लिए कमांड के साथ ), तो आप उपयोग करने में सक्षम हो सकते हैं:

host foo
  User webby
  ProxyCommand ssh -W foo:%p a

host a
  User johndoe

अंत में, सिर्फ इसलिए कि मैं इसे शांत पाया (और इसलिए नहीं कि यह आपके विशेष मामले में काम करेगा, उपयोगकर्ता नाम अंतर के कारण), एक मित्र का ब्लॉग पोस्ट बताता है कि इस तरह की चीज़ को गतिशील और पुनरावर्ती श्रृंखला SSH परदे के पीछे कैसे बनाया जाता है (कुछ बातों के साथ) यह अच्छी तरह से काम नहीं करता है):

host */*
  ProxyCommand ssh ${$(dirname %h)/\%%/@} nc ${$(basename %h)#*%%} %p

और फिर ssh machine1/machine2आपको एक खोल देना चाहिए machine2, जिसके माध्यम से सुरंग बनाई गई हो machine1

मुझे आश्चर्य है कि अगर sedइसके बजाय कस्टम कमांड का उपयोग किया जाता है dirnameऔर basenameविभिन्न उपयोगकर्ता नामों के साथ समस्या को हल नहीं किया जा सकता है?


2

ऐसा करने से पूरा किया जा सकता है ssh -At johndoe@a ssh webby@foo-Aआदेश आगे अपने ssh एजेंट है, जबकि (आप प्रॉक्सी पर पुन: प्रमाणीकृत करने से बच सकते हैं तो) -tसुनिश्चित एक टर्मिनल प्रॉक्सी पर मौजूद है। निम्नलिखित बैश फ़ंक्शन उपयोगी हो सकता है:

ssh-bounce () {
    local cmd=""
    for i in "$@"; do
        cmd+="ssh -At $i "
    done
    $cmd
}

यह अब तक का सबसे सरल उपाय है। अब इसे सिर्फ एक और 35 अपवोट चाहिए। (Btw-a मेरे लिए कुछ भी नहीं करता है।)
स्टीव बेनेट

0
weppos:~ weppos$ ssh foo -vv
[..]
bash: nc: command not found

Netcat पर स्थापित नहीं है a। जब आप चलाते हैं ssh host "command arg", commandतो hostआपके स्थानीय मशीन पर नहीं, बल्कि निष्पादित होता है ।


हाँ मैं जानता हूँ। यह ठीक वैसा ही है जैसा मैंने एक टिप्पणी में बताया है कि वोमेल का जवाब क्या है। :)
सिमोन कारलेटी

0

OpenSSH 7.3 (2016-08-01) के बाद से ProxyJumpविकल्प और संबंधित -Jकमांड-लाइन ध्वज एक या अधिक SSH गढ़ों या "जंप मेजबानों" के माध्यम से अधिक सरल अप्रत्यक्षता की अनुमति देने के लिए उपलब्ध है।

वोमल के समाधानnc में पाए जाने वाले बाहरी कमांड पर निर्भरता को हटाता है ।

ssh -J johndoe@a webby@foo 

अपने वर्कस्टेशन से गेटवे सर्वर aतक उपयोगकर्ता जॉन्डो और एसएसएच सत्र को स्थापित करने के लिए एसएसएच कनेक्शन स्थापित करेगा ताकि उपयोगकर्ता वेबबी के लिए फू को होस्ट किया जा सके।

सरल बनाने के लिए कि ~/.ssh/configआप और आप दोनों के लिए मेजबान परिभाषाएँ बना सकते हैंssh foo

Host a
    User johndoe

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