स्थानीय मशीन से एक कमांड के साथ एक प्रॉक्सी पर एससीपी?


54

मेरे पास अपने स्थानीय.machine, प्रॉक्सी.machine और target.machine हैं। local.machine का लक्ष्य.machine के साथ सीधा संपर्क नहीं है, लेकिन प्रॉक्सी.machine के माध्यम से जाने की जरूरत है।

मैं target.machine से local.machine में एक फ़ाइल स्‍कैप करना चाहता हूं। क्या यह संभव है कि local.machine से केवल एक कमांड के साथ किया जाए।

जवाबों:


64

मुझे पता है कि यह एक देर से जवाब है, लेकिन मुझे ऐसा करने का एक अच्छा तरीका मिला। यह मूल रूप से होल्गर जस्ट का जवाब है, लेकिन एक सहेजे गए कॉन्फ़िगरेशन फ़ाइल में:

आपको इसे ~/.ssh/configस्थानीय फ़ाइल पर अपनी फ़ाइल में डालना होगा, (यदि यह मौजूद नहीं है तो फ़ाइल बनाना)

Host target.machine
  User          targetuser
  HostName      target.machine
  ProxyCommand  ssh proxyuser@proxy.machine nc %h %p 2> /dev/null

फ़ाइल को सहेजने के बाद, आप बस उपयोग कर सकते हैं

ssh target.machine

किसी भी समय आप कनेक्ट करना चाहते हैं। Scp भी काम करेगा क्योंकि यह ssh config फाइल का भी सम्मान करता है। तो Nautilus, यदि आप GNOME का उपयोग कर रहे हैं और GUI का उपयोग करना चाहते हैं।


5
बस एक त्वरित नोट। यदि आप ssh के लिए -i कमांड लाइन विकल्प के माध्यम से एक वैकल्पिक पहचान फ़ाइल का उपयोग कर रहे हैं, तो आपको ProxyCommand कॉन्फ़िगरेशन और ssh कमांड लाइन दोनों के लिए उस विकल्प को निर्दिष्ट करने की आवश्यकता है।
बिलमैन

7
3 चीजें जो मदद कर सकती हैं, 1) यह मदद करेगा यदि आपने Host proxy.machineएक ही ~/.ssh/configफाइल में लाइनें भी दिखाईं , 2) उल्लेख करें कि क्या ये कमांड्स नेस्टेड हो सकते हैं (यानी क्लाइंट प्रॉक्सी होस्ट 1 से कनेक्ट होता है जो प्रॉक्सी होस्ट 2 से कनेक्ट होता है जो कनेक्ट होता है। ..target) और 3) क्या nc %h %pमतलब है
PUK

हम स्थानीय मशीन से प्रॉक्सी के साथ मशीन को लक्षित करने के लिए कैसे कॉपी कर सकते हैं?
मुलगाला

19

आप इसे एक कमांड में कर सकते हैं, लेकिन आपको प्रॉक्सी मशीन पर स्थापित नेटकैट (एनसी) की आवश्यकता है:

ssh -o "ProxyCommand ssh poxyuser@proxy.machine nc -w 1 %h 22" targetuser@target.machine

[संपादित करें: मशीनों के क्रम को मिलाया ...]


अच्छी कोशिश, लेकिन मुझे उपयोगकर्ता नाम प्रॉक्सी और लॉगिन के लिए कहां जोड़ना चाहिए?
ग्राम

मशीन नामों से पहले Jzst, एक @ के साथ। मैंने अपने उत्तर को संपादित करके दर्शाया है कि
होल्गर जस्ट

19

अब आप इसे बिना किसी आवश्यकता के वन-लाइनर के रूप में * कर सकते हैं nc:

scp -o "ProxyCommand ssh pcreds@proxy.machine -W %h:%p" tcreds@target.machine:file .

व्याख्या

pcredsऔर tcredsयदि आवश्यक हो username, तो अपने प्रॉक्सी और लक्ष्य क्रेडेंशियल्स का प्रतिनिधित्व करें username:password

यह संभव है एक अंतर्निहित नेटकैट जैसी क्षमता के कारण, ncजो मध्यवर्ती मेजबान के लिए आवश्यकता को दूर करता है। ssh -W host:portनिर्दिष्ट होस्ट और पोर्ट के लिए एक सुरंग का उपयोग करना और इसे stdin / stdout से जोड़ता है, और फिर scpसुरंग के ऊपर चलाता है।

में %hऔर आपके द्वारा निर्दिष्ट लक्ष्य होस्ट और पोर्ट के साथ बदल %pदिए ProxyCommandजाते हैं।

और भी अधिक सुविधा के लिए, आप अपने ssh कॉन्फ़िगरेशन में प्रॉक्सी को कॉन्फ़िगर कर सकते हैं:

Host target.machine
    ProxyCommand ssh pcreds@proxy.machine -W %h:%p

और बस तब से

scp tcreds@target.machine:file .

* ओपनएसएसएच 5.4 के बाद से - मार्च 2010 को जारी किया गया


1
सत्यापित यह वास्तव में अच्छी तरह से काम करता है, और छद्म नेकां प्रक्रियाओं को छद्म मशीन पर चारों ओर बिछाने को नहीं छोड़ता है।
लाकड्रैगन

1
मैं प्रॉक्सी के पोर्ट को कहां निर्दिष्ट कर सकता हूं?
Marged

1
@Marged मैं एक स्थिति यह यहां पल में प्रयास करने के लिए नहीं कर रहा हूँ, लेकिन मुझे लगता है कि आप शामिल करना सक्षम होना चाहिए -p <portnum>इससे पहले कि -Wप्रॉक्सी पोर्ट निर्दिष्ट करने के लिए किसी भी विधि में
CupawnTae

1
मुझे यह पता लगाने में थोड़ा समय लगा कि -i विकल्प (यदि आपको इसकी आवश्यकता है) उद्धरणों के अंदर जाता है । प्रॉक्सी ssh डिफ़ॉल्ट रूप से उसी निजी कुंजी का उपयोग नहीं करता है जो किसी भी -i विकल्प द्वारा निर्दिष्ट होता है जो सीधे scp को आपूर्ति करता है। मुझे लगता है कि यह स्पष्ट है जब आप इसके बारे में सोचते हैं।
Keeely

18

यदि आपको scp के बजाय rsync का उपयोग करने में कोई आपत्ति नहीं है, तो आप निम्न एक-लाइनर का उपयोग कर सकते हैं:

rsync -v --rsh "ssh proxy.machine ssh" target.machine:/remote/file /local/dir/

(आपको प्रॉक्सी मशीन तक पासवर्ड रहित पहुँच की आवश्यकता होगी)


8
$ ssh -f -N -L <localport>:<target.machine:port> user@proxy.machine
$ scp target-user@local.machine:/remote/file -P <localport> .

ठीक है, वास्तव में दो आदेश ...


1
मैं अपने प्रॉक्सी के पोर्ट को कैसे निर्दिष्ट कर सकता हूं? मेरे मामले में8080
18

@ -p <portnumber>अपने ssh कमांड में बहुत कुछ जोड़ें
weeheavy

6

एक-लाइनर? मेरे सिर के ऊपर से नहीं। आपको पहले एक प्रॉक्सी स्थापित करने की आवश्यकता है और आप इसे स्वयं से नहीं कर सकते।

इसे मैन्युअल रूप से करते समय, मैं अपनी सुरंग के लिए एक स्क्रीन सत्र खोलता हूं:

screen -S tunnel

स्क्रीन का उपयोग सुरंग को पृष्ठभूमि के गोले में रखने के लिए किया जाता है। किसी भी तकनीक का उपयोग करें जिसे आप पृष्ठभूमि में सुरंग को खुला रखना चाहते हैं (@ weeheavy का जवाब शायद सबसे सरल है)। एक बार स्क्रीन सेशन में मैं अपनी सुरंग शुरू करता हूं

ssh -L 2222:target.machine:22 [user@]proxy.machine

इसे नीचे तोड़ने के लिए, वह मूल रूप से कहता है "मेरे स्थानीय मशीन पर, पोर्ट 2222 खोलें और लोकलहोस्ट को मारने वाला कोई भी संकेत: 2222 प्रॉक्सी.machine के माध्यम से target.machine: 22 तक अनुमानित है"

एक बार जब आप ssh कनेक्शन और सुरंग स्थापित कर लेते हैं, तो स्क्रीन सत्र से "Ca d" से अलग हो जाएं। उस स्क्रीन सत्र पर वापस जाने के लिए, टाइप करेंscreen -raAd tunnel

एक बार जब आप अपने मूल शेल में वापस आ जाते हैं तो आपकी scp कमांड दिखती है

scp -P 2222 localhost:your/file/on/target.machine local/path

याद रखें कि लोकलहोस्ट पोर्ट 2222 वास्तव में सिर्फ एक सुरंग है।


3

लगता है कि scp "-o" विकल्प का समर्थन करता है, जैसे ssh करता है, हालाँकि मुझे यकीन नहीं है कि इसे प्रॉक्सी उपयोगकर्ता नाम / पासवर्ड कैसे दिया जाए:

scp -o "ProxyCommand=nc -X connect -x proxyhost:proxyport %h %p" remote_user@remote_host:remote_path local_path

आप मिलता है nc: invalid option -- Xदेखने https://stackoverflow.com/a/23616021/32453


डोप ब्रो, सीधा काम किया :)
एलोन क्रिएल-ईवन

2

कैसा रहेगा:

scp -o "ProxyCommand ssh user@myproxyserver.com nc %h %p" your.filename username@yourdestination.yourdomain.com:/whatever_location

या संभवतः उपयोगकर्ता नाम: पासवर्ड यहाँ?
रोज़गारपैक

1

आप कुछ इस तरह की कोशिश कर सकते हैं:

ssh user@proxy.machine "ssh user@target.machine 'cat > file'" < file

लेकिन यह तब काम नहीं करेगा जब आपके प्रॉक्सी.मेचिन को आपसे पासवर्ड मांगने की जरूरत है (कि SSH TTY में नहीं है, इसलिए पूछें विफल हो जाएगी)।

यदि आपके पास एक से अधिक फ़ाइल हैं, तो आप इस तरह से टार का उपयोग कर सकते हैं (अनटाइटेड, मैं आमतौर पर एक नेटकाट का उपयोग करता हूं):

tar cf - file1 file2 folder1/ | ssh user@proxy.machine "ssh user@target.machine 'tar xvf -'"

1

एक और सरल समाधान एक हस्तांतरण करने के लिए source_file से source_host एक को destination_host के माध्यम से एक proxy_host :

प्रॉक्सी_सर्वर पर लॉग इन करें :

ssh login@proxy_host

प्रॉक्सी सर्वर से, हस्तांतरण source_file से source_host को destination_host (आप एक पंक्ति के रूप में इस टाइप कर सकते हैं, को छोड़ते हुए \, या दो पंक्तियों के रूप में, नीचे दिखाया गया है):

scp login@source_host:/path_to_source_file \
  login@destination_host:/path_to_destination_directory

इसके लिए जरुरी है कि source_host पर प्रॉक्सी_होस्ट पर लॉगिन एक rsa_key का उपयोग करता है।


0

यदि आपको सार्वजनिक कुंजियों का उपयोग करने की आवश्यकता है तो आपको कुछ इस तरह की आवश्यकता होगी।

Host target-machine
  User          target-user
  HostName      target.example.com
  IdentityFile  /path/to/file.pem
  ProxyCommand  ssh bastion -W %h:%p

Host bastion
  User         bastion-user
  HostName     bastion.example.com
  IdentityFile /path/to/file.pem

0

मैंने इस लेख का अनुसरण किया और एक उत्तर मिला जो मेरे लिए काम करता है। (क्योंकि उपरोक्त उत्तर मेरे लिए काम नहीं करते हैं)।

scpइंटरमीडिएट होस्ट (उर्फ जम्प होस्ट) http://mperdikeas.github.io/networking.html.files/scp-a-file-through-jump-host.html के माध्यम से फाइल कैसे करें

और मेरा जवाब नीचे दिया गया है:

scp -oProxyCommand="ssh -W %h:%p {username}@{proxy_IP}" \
        {source_file} {remote_username}@{remote_IP}:{remote_file_path}

उदाहरण:

scp -oProxyCommand="ssh -W %h:%p ubuntu@10.60.10.145" \
        archive.gz wise@35.xxx.xxx.xxx:/home/wise/archive.gz

मुझे उम्मीद है कि यह उत्तर आपकी मदद कर सकता है।

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