क्या मैं एक सर्वर पर दूसरे सर्वर पर स्टडआउट करने के लिए पाइप कर सकता हूं?


74

stdoutएक CentOS सर्वर stdinपर दूसरे CentOS सर्वर पर पाइप किया जाना चाहिए । क्या यह संभव है?

अपडेट करें

स्कॉटपैक, मिकीबी और जोफेल सभी के पास वैध उत्तर हैं। मैंने स्कॉट को जवाब दिया, क्योंकि भले ही मेरा सवाल सुरक्षा की आवश्यकता के रूप में निर्दिष्ट नहीं था, लेकिन यह हमेशा सुरक्षित है। हालाँकि, अन्य दो साथियों के सुझाव भी काम करेंगे।


1
यह ध्यान देने योग्य है कि गैर-एसएस दृष्टिकोण का (केवल) प्रमुख लाभ थ्रूपुट गति है; यदि आप एक तेज़ नेटवर्क पर हैं और सुरक्षा अनावश्यक है तो यह दो विंडो में दो कमांड टाइप करने की अतिरिक्त असुविधा के लायक हो सकता है।
रैंडम 832

जवाबों:


94

यह एक नायाब हाँ है।

जब sshकोई रिमोट सर्वर पर कमांड को निष्पादित करने के लिए उपयोग करता है तो यह कुछ प्रकार के फैंसी आंतरिक इनपुट / आउटपुट पुनर्निर्देशन करता है। वास्तव में, मुझे यह ओपनएसएसएच के सूक्ष्म रूप से अच्छे लक्षणों में से एक लगता है। विशेष रूप से, यदि आप sshकिसी दूरस्थ प्रणाली पर एक मनमाना कमांड निष्पादित करने के लिए उपयोग करते हैं , तो ssh मैप करेगा STDINऔर STDOUTउस कमांड को निष्पादित करेगा।

एक उदाहरण के प्रयोजनों के लिए, मान लें कि आप एक बैकअप टारबॉल बनाना चाहते हैं, लेकिन इसे स्थानीय स्तर पर संग्रहीत या नहीं करना चाहते हैं। आइए इस वाक्य रचना में एक गणधर हैं:

$ tar -cf - /path/to/backup/dir | ssh remotehost "cat - > backupfile.tar"

हम एक टारबॉल बना रहे हैं, और इसे STDOUTसामान्य सामान के लिए लिख रहे हैं । चूंकि हम एक दूरस्थ कमांड को निष्पादित करने के लिए ssh का उपयोग कर रहे हैं, इसलिए STDIN को मैप किया जाता STDINहै cat। जिसे हम एक फाइल पर रीडायरेक्ट करते हैं।


11
यह "फैंसी आंतरिक इनपुट / आउटपुट पुनर्निर्देशन" का कोई प्रकार नहीं है - बस सादा, उबाऊ नियमित सामान। ssh STDIN से पढ़ता है, किसी भी अन्य टूल की तरह, और इसे दूरस्थ प्रक्रिया में भेजता है। :)
डैनियल पिटमैन

7
@ डैनियलपिटमैन: लेकिन इसे "फैंसी आंतरिक" कचरा कहने का मज़ा ही कुछ और है
स्कॉट पैक

7
इसी तरह, netcatदोनों सिरों पर एक महान सरल, आसान संचार चैनल बनता है। tar cf - /path/to/dir | nc 1.2.3.4 5000एक सर्वर nc -l -p 5000 > backupfile.tarपर, दूसरे पर।
मिकीबी

1
@ मायकेबी: अच्छी बात है। Netcat एक स्पष्ट-पाठ प्रोटोकॉल है, इसलिए संवेदनशील डेटा के साथ सावधान रहें। मैं एक स्थानीय नेटवर्क और पोर्ट स्कैनिंग पर नेटवर्क ड्राइव अधिग्रहण (ala dd) जैसी अधिक विशिष्ट चीजों के लिए netcat का उपयोग करता हूं।
स्कॉट पैक

2
@ मायकेबी: आप लोग अपनी फ्लाइंग और अपनी पैंट की सीटों के साथ क्या करते हैं!
स्कॉट पैक

28

मेजबानों के बीच पाइपिंग डेटा का एक सुविधाजनक तरीका जब आपको netcatकनेक्शन पर दोनों सिरों पर तार का उपयोग करने की सुरक्षा के बारे में चिंता करने की आवश्यकता नहीं है ।

इससे आप उन्हें अतुल्यकालिक रूप से सेट कर सकते हैं:

"रिसीवर" पर (वास्तव में, आपके पास दो-तरफ़ा संचार होगा, लेकिन यह इस तरह से सोचना आसान है), भागो:

nc -l -p 5000 > /path/to/backupfile.tar

और "प्रेषक" पर, भागो:

tar cf - /path/to/dir | nc 1.2.3.4 5000

जानकर बहुत अच्छा लगा। यह अच्छा है यदि भौतिक कनेक्शन पर भरोसा किया जाता है जैसे शायद एक बैकअप नेटवर्क या यदि कनेक्शन पहले से ही सुरंग है।
वेस्ले

या अगर डेटा कुछ है जो वैसे भी सार्वजनिक है।
सैमुअल एडविन वार्ड

1
+1 नेटकैट एक अमूल्य उपकरण है, खासकर जब आपके पास कोई ssh सर्वर नहीं चल रहा हो।
kwarrick

21

Uni- और द्विदिश कनेक्शन बनाने के लिए एक बहुत शक्तिशाली उपकरण है socat। संभावनाओं पर एक छोटी नज़र के लिए, इसके मैनपेज में उदाहरण देखें ।

यह netcatपूरी तरह से और इसी तरह के उपकरणों की जगह लेता है और इसमें ssl एन्क्रिप्टेड कनेक्शन के लिए समर्थन है। शुरुआती लोगों के लिए, यह पर्याप्त सरल नहीं हो सकता है, लेकिन यह जानना कम से कम अच्छा है कि यह मौजूद है।


1
@WesleyDavid: आपके "अपडेट" के लिए: पूर्णता के लिए, मैंने अपने उत्तर में जोड़ा है कि समाज को एसएसएल का समर्थन प्राप्त है, इसलिए एन्क्रिप्शन भी संभव है। हालांकि, ssh ज्यादातर मामलों में बेहतर और आसान समाधान है, इसलिए मैंने स्कॉटपैक का जवाब भी चुना होगा।
जोफेल

5

टी एल; डॉ

जब आपके पास एक गढ़ सर्वर का उपयोग किया जाना चाहिए, तो चीजें केवल थोड़ी अधिक जटिल हो जाती हैं ।

  1. आप ऐसा करने sshके लिए आदेश के रूप में पारित कर सकते हैं ssh:

    • cat local_script.sh | ssh -A usera@bastion ssh -A userb@privateserver "cat > remote_copy_of_local_script.sh; bash remote_copy_of_local_script.sh"
  2. छद्म टर्मिनलों से सावधान रहें


ध्यान दें कि यहां मुख्य महत्व का बिंदु यह है कि sshअधिकांश उपकरण की तरह, बस डिफ़ॉल्ट रूप से व्यवहार करता है stdoutऔर stdinसही है।

हालाँकि, जब आप जैसे विकल्प देखना शुरू करते हैं Disable pseudo-terminal allocation.और Force pseudo-terminal allocation.आपको थोड़ा परीक्षण और त्रुटि करने की आवश्यकता हो सकती है। लेकिन, एक सामान्य नियम के रूप में आप ttyव्यवहार में परिवर्तन नहीं करना चाहते हैं जब तक कि आप टर्मिनल एमुलेटर (एक मानव प्रकार में) में गारबेड / बाइनरी जंक को ठीक करने की कोशिश नहीं कर रहे हैं।

उदाहरण के लिए, मैं उपयोग करना चाहता हूं -Atताकि मेरे कार्य केंद्र के ssh- एजेंट को आगे बढ़ाया जाए, और ताकि tmux को दूरस्थ रूप से चलाने से बाइनरी बाइनरी न हो (जैसे ssh -At bastion.internal tmux -L bruno attach)। और, कर्ता के लिए भी (जैसे sudo docker exec -it jenkins bash)।

हालाँकि, उन दो -tझंडों से डेटा भ्रष्टाचार पर नज़र रखने में थोड़ी मुश्किल होती है, जब मैं ऐसा कुछ करने की कोशिश करता हूँ:

# copy /etc/init from jenkins to /tmp/init in testjenkins running as a container
ssh -A bastion.internal \
ssh -A jenkins.internal \
sudo tar cf - -C /etc init | \
sudo docker exec -i testjenkins \
bash -c 'tar xvf - -C /tmp'

# note trailing slashes to make this oneliner more readable.

2

केवल एक कमांड द्वारा अपनी ssh सार्वजनिक कुंजी को दूसरे होस्ट में रखने का प्रयास करें

ssh root@example.com 'cat >> .ssh/authorized_keys' < .ssh/id_rsa.pub

2

मुझे यह सबसे आसान लगता है, जिस उपयोगकर्ता के लिए आप कमांड चला रहे हैं, उसके लिए सर्वर के बीच कोई पासवर्ड हैंडशेकिंग स्थापित करने के बाद:

असम्पीडित

tar cf - . | ssh servername "cd /path-to-dir && tar xf -"

मक्खी पर संपीड़न

tar czf - . | ssh servername "cd /path-to-dir && tar xzf -"

यदि आपके sshपहले से ही संपीड़न के लिए कॉन्फ़िगर किया गया है, तो टार फ़ाइल पर संपीड़न का उपयोग करना बहुत बुरा विचार है।
एंथन

@ एंथन क्यों इतना बुरा है, और अगर ssh संपीड़न पहले से ही सक्षम है तो कोई कैसे जांच करेगा?
टॉम हेल

1
@TomHale आपके सिस्टम की गति के आधार पर, यह समग्र ऑपरेशन को धीमा कर सकता है, क्योंकि दूसरी संपीड़न में समय लगता है, लेकिन अतिरिक्त बाइट्स को दाढ़ी बनाने की संभावना नहीं है। Compressionकिसी भी विन्यास फाइल में सेट किया जा सकता है, इसके लिए एक त्वरित जांच यह देखने के लिए है कि क्या ssh -v localhost exit 2>&1 | fgrep -i compressकोई आउटपुट देता है (AFAIK कॉन्फ़िगरेशन को डंप करने का कोई विकल्प नहीं है क्योंकि ssh ने इसे पढ़ा है)।
एंथन

tarएक -C pathध्वज है जो कमांड cऔर xकमांड दोनों के लिए काम करता है । आपको cdवहां एक अलग कमांड नहीं डालनी है। (लेकिन यह ध्यान रखना अच्छा है कि आप एक से अधिक कमांड चला सकते हैं।)
ब्रूनो ब्रोंस्की

@ ब्रूनो, -Cएक GNU एक्सटेंशन है (हालाँकि अब bsdtar और schily tar द्वारा समर्थित है)
स्टीफन चेज़लस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.