कैसे एक बैश स्क्रिप्ट लिखने के लिए, जो सामान करने के लिए किसी अन्य मशीन पर लॉग करता है?


11

क्या बैश स्क्रिप्ट लिखना संभव है, कि

  1. मशीन A से शुरू किया जाएगा, ssh द्वारा एक अलग मशीन B पर लॉग इन किया जाएगा (दोनों मशीनें A और B लिनक्स-मशीन होंगी)
  2. मशीन B पर कुछ फ़ाइलों को कॉपी करता है
  3. इन मशीनों पर एक पायथन स्क्रिप्ट दी गई अजगर स्क्रिप्ट चलाता है।
  4. मशीन A पर वापस परिणामों को स्थानांतरित करता है
  5. मशीन B से लॉग ऑफ होता है।

क्या यह तकनीकी रूप से उल्लेखनीय है?

जवाबों:


15

बेशक यह उल्लेखनीय है:

scp file user@host:
ssh user@host path_to_script
scp user@host:file_to_copy ./

और बस...

लेकिन एक समस्या है: आपसे तीन बार पासवर्ड मांगा जाएगा। इससे बचने के लिए आप ssh कीज़ उत्पन्न कर सकते हैं और इन कुंजियों द्वारा उपयोगकर्ताओं को अधिकृत कर सकते हैं।

Ssh कुंजियाँ चलाने के लिए ssh-keygen -t rsa, प्रश्नों का उत्तर दें और सार्वजनिक कुंजी को दूरस्थ होस्ट (मशीन B) में ~/.ssh/authorized_keysफ़ाइल करने के लिए कॉपी करें । ~/.ssh/id_rsaस्थानीय मशीन (ए) पर निजी कुंजी को बचाया जाना चाहिए ।


यदि सार्वजनिक कुंजी एक विकल्प है, तो आप पासवर्ड संकेतों को कम करने के लिए कुछ क्रूड कर सकते हैं जैसेcat file | ssh user@host 'cat > /destination/of/file; /path/to/script &>/dev/null; cat results' > /destination/of/results
पैट्रिक

आप पासवर्ड का उपयोग करना चाहते हैं, तो आप हमेशा परिभाषित करते हुए OpenSSH के कनेक्शन पूलिंग इस्तेमाल कर सकते हैं ControlMaster=yesऔर ControlPath=/path/to/socketfile, और उसके बाद के साथ एक ssh कनेक्शन शुरू -fएक पृष्ठभूमि ssh को चलाने के लिए। एक ही सॉकेट फ़ाइल का उपयोग करने के लिए सभी बाद के SSH कनेक्शनों को बताएं।
jsbillings

4

मैं एक ही sshकनेक्शन / सत्र में सब कुछ करना संभव है :

ssh user@host "cat > remote_dst; command; cat remote_src" < local_src > local_dst

इस:

  1. प्रतियां local_srcकरने के लिए remote_dst,
  2. निष्पादित करता है command,
  3. की नकल remote_srcकरता है local_dst

लेकिन अगर commandलिखता है stdout, परिणाम भी साथ में है local_dst। यदि commandइनपुट से पढ़ता है stdin, तो यह प्राप्त होगा और EOF


3

जब आप इसे एक ssh सत्र के अंदर कर सकते हैं, तो चल रहे आदेशों के साथ प्रतिलिपि फ़ाइलों को संयोजित करना थोड़ा मुश्किल है।

इस कार्य से निपटने का सबसे आसान तरीका तीन ऑपरेशनों के लिए अलग-अलग SSH सत्र चलाना है:

rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

इसके लिए मशीनबी को तीन बार प्रमाणित करने की आवश्यकता होती है। कई बार प्रमाणित करने से बचने के लिए अनुशंसित तरीका ओपनएसएसएच के आधुनिक संस्करणों में कनेक्शन साझा करने की सुविधा का उपयोग करना है: बी के लिए एक मास्टर कनेक्शन को एक बार और सभी के लिए शुरू करें, और एसएसएच को स्वचालित रूप से उस मास्टर कनेक्शन पर पिग्गीबैक करने दें। अपने लिए एक पंक्ति जोड़ें ControlMaster autoऔरControlPath~/.ssh/config फिर पृष्ठभूमि में एक मास्टर कनेक्शन शुरू करें , फिर अपने कार्य करें।

ssh -fN machineB                         # start a master connection in the background
# Subsequent connections will be slaves to the existing master connection
rsync -a inputs/ machineB:inputs/
ssh machineB 'some command -i inputs -o outputs'
rsync -a machineB:outputs/ outputs/

फ़ाइलों की प्रतिलिपि बनाने के लिए scp या rsync का उपयोग करने के बजाय, SSHFS के अंतर्गत दूरस्थ फ़ाइल सिस्टम को माउंट करना आसान हो सकता है । यह एक मास्टर कनेक्शन स्थापित करने का ख्याल रखेगा, वैसे (यह मानते हुए कि आपने अपना ~/.ssh/configसंकेत ऊपर दिया है)।

mkdir /net/machineB
sshfs machineB: /net/machineB
cp -Rp inputs /net/machineB/
ssh machibeB 'some command -i inputs -o outputs'
cp -Rp /net/machineB/outputs .
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.