कई मेजबानों और कई कमांडो को ssh


2

मुझे कई मेजबानों के माध्यम से लूप और एसएचएस करने और प्रत्येक पर कमांड की एक श्रृंखला चलाने की आवश्यकता है।

कुछ इस तरह:

for i in $(jot -w '%02.0f' 14 1)
>do ssh user@host$i sudo -i "command1; command2; command3"
>done

लेकिन मैं इसे सही ढंग से काम करने के लिए नहीं कर सकता। मैंने Google पर विभिन्न चीजों को देखा है जैसे sudo sh -c, sudo को पाइप करना, आदि, लेकिन यह पता नहीं लगा सकता।

  • मैं एक नियमित उपयोगकर्ता के रूप में ssh'ing कर रहा हूं जो बिना किसी पासवर्ड के sudo कर सकता है (मूल रूप से ssh सक्षम नहीं है)
  • कमांड 1 नहीं लौट रहा है, इसलिए कमांड 2 को चलने से रोकना नहीं चाहिए, आदि ;
  • मैं लूप को एक मैक से चला रहा हूं, इसलिए jot -w, जो कि seq -fलिनक्स में लगभग बराबर है
  • CentOS 5.4 को ssh'ing
  • मैं इसे रूट $ PATH के साथ चलाना चाहूंगा ताकि मुझे कमांड्स के लिए पूर्ण पथ निर्दिष्ट न करना पड़े, लेकिन यह पूरी तरह से आवश्यक नहीं है

अग्रिम में धन्यवाद!


1
बैश विकल्प या तो 'जोट' या seq: printf '%02d ' {1..14}या बैश 4 में: for i in {01..14}(बैश <4 अग्रणी शून्य को अनदेखा करता है)।
डेनिस विलियमसन

जवाबों:


6

मुझे पता है कि उद्धरण सही होना बहुत कष्टप्रद है। इसके बजाय मैं बस एक पाइप के माध्यम से रिमोट होस्ट पर बैश करने के लिए कमांड पास करता हूं। इस तरह आपको अपने ssh कमांड लाइन में भागने के अधिकार के बारे में चिंता करने की ज़रूरत नहीं है। यदि आप अंतःक्रियात्मक रूप से जुड़े थे, तो बस पाइप में वही पास करें जो आप टाइप करेंगे।

CMDS="sudo bash -c '/usr/bin/id; /usr/bin/id; '/usr/bin/id"
for i in 0 1; do
  echo $CMDS | ssh -t host$i bash
done

जो लौटता है

uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)
uid=0(root) gid=0(root) groups=0(root)

6

Ssh पर उद्धृत कमांड स्ट्रिंग्स को पास करने की कोशिश करना हमेशा एक चुनौती होती है। आप उल्लेख नहीं करते हैं कि आपको किस प्रकार के त्रुटि संदेश मिल रहे हैं, लेकिन यहां कुछ विचार दिए गए हैं:

कई सिस्टम पर डिफ़ॉल्ट sudo कॉन्फ़िगरेशन के लिए आवश्यक है कि आपके सत्र में एक मान्य TTY जुड़ा हो। इसके लिए या तो (a) "-t" विकल्प के साथ ssh कॉल करना होता है, या (b) आपके सुडोल कॉन्फ़िगरेशन से "रिक्वायरमेंट" विकल्प को हटा देना चाहिए।

यह मेरे लिए काम करता है (गंतव्य RHEL5 सिस्टम का एक सेट है):

for i in 0 1; do
  ssh -t host$i sudo -i "echo one; echo two; echo 'three four'"
done

इसका परिणाम यह होगा:

one
two
three four
Connection to host0 closed.
one
two
three four
Connection to host1 closed.

कई प्रकार के उपकरण हैं जो आपके जीवन को आसान बना देंगे यदि आप इस तरह की बात करते हैं:

इत्यादि। मैं आमतौर पर केवल शेल स्क्रिप्ट का उपयोग करता हूं, खुद।


1
क्या आप सुनिश्चित हैं कि आपके पास आपकी आज्ञा सही है? जब मैं ssh -t host sudo -i "/usr/bin/id; /usr/bin/id"परिणाम चलाता हूं तो मुझे सुझाव मिलता है कि दूसरी कमांड विशेषाधिकार प्राप्त नहीं है।
ज़ॉदाचेचे

ज़ॉर्दाचे सही है, आपको अलग-अलग कमांड के रूप में उद्धरण / एस्केप या एसएचएस चलेगा sudo -i echo oneऔर echo twoआदि की एक और परत की आवश्यकता है । कोशिश करें: ssh -t host$i "sudo -i 'id; echo \" three four\"; id'"(यह उद्धरणों की तीन परतें हैं - एकल उद्धरणों के अंदर [दोहरे आदेश से उत्पन्न] [डबल कमांड के अंदर [कमांड को सुडो को पारित किया गया] [ssh को पारित किया गया]]। यह मनमाने ढंग से भ्रमित हो सकता है ...
गॉर्डन डेविसन

1

मुझे लगता है कि pssh आप के साथ काम करने की जरूरत है।



0

BatchLogin पर एक नज़र:

http://batchlogin.sourceforge.net/

BatchLogin एक मुफ्त सॉफ्टवेयर (GPL) लाइसेंस प्राप्त उपकरण है जो आपको विविध परिवेशों में सीरियल प्रारूप में सर्वर से कनेक्शन प्रबंधित करने की अनुमति देता है। इसकी सीमाएँ हैं, लेकिन अधिकांश भाग के लिए, किसी भी स्क्रिप्ट या डेटा फ़ाइल को "ज़ोन" (IE: iDMZ, DMZ, आदि) की जटिलता की परवाह किए बिना, कई सर्वर वातावरण में स्वचालित रूप से स्थानांतरित और निष्पादित किया जा सकता है। यह इस तरह से होता है कि शेल स्क्रिप्ट और सर्वर तक पहुंच को "प्रति व्यवस्थापक" आधार पर आसानी से प्रबंधित किया जा सकता है।

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