2008-10-28 13 views
14

मैं एक आदेश या शायद इस तरह के रूप आइटम के साथ कुछ कमांड चलाने की तुलना में इसी तरह के सवाल के लिए थोड़ा के आसपास खोज की है, लेकिन अन्य:मैं समानांतर में एकाधिक सर्वरों पर एसएसएच पर दूरस्थ रूप से चल रहे आदेशों को स्वचालित कैसे कर सकता हूं?

ssh [email protected] -t sudo su - 
हालांकि

, क्या हुआ अगर मैं अनिवार्य रूप से पर एक स्क्रिप्ट चलाने की जरूरत है (चलो कहें) एक बार में 15 सर्वर। क्या यह बाश में काम करने योग्य है? एक परिपूर्ण दुनिया में मुझे इसे खींचने के लिए संभव होने पर एप्लिकेशन इंस्टॉल करने से बचने की आवश्यकता है।

  1. तैनात एक नया बिलाव कंटेनर
  2. कंटेनर में एक आवेदन तैनात है, और यह कॉन्फ़िगर
  3. कॉन्फ़िगर एक अपाचे vhost
  4. : तर्क के लिए, का सिर्फ इतना कहना है कि मैं 10 मेजबान भर में निम्न कार्य करने देना
  5. पुनः लोड अपाचे

मैं एक स्क्रिप्ट है कि यह सब करता है, लेकिन यह निर्भर करता है पर मुझे, सभी सर्वरों में प्रवेश करने के लिए एक स्क्रिप्ट एक रेपो से नीचे खींच, और फिर इसे चल रहा है। यदि यह बैश में करने योग्य नहीं है, तो आप किस विकल्प का सुझाव देते हैं? क्या मुझे एक बड़ा हथौड़ा चाहिए, जैसे पर्ल (पायथन को प्राथमिकता दी जा सकती है क्योंकि मैं गारंटी दे सकता हूं कि पाइथन आरएचईएल पर्यावरण में सभी बक्से पर है yum/up2date के लिए धन्यवाद)? अगर कोई मुझे किसी भी उपयोगी जानकारी के लिए इंगित कर सकता है तो इसकी सराहना की जाएगी, खासकर यदि यह बाश में करने योग्य है। मैं पर्ल या पायथन के लिए बस जाऊंगा, लेकिन मैं बस उन लोगों को भी नहीं जानता (उस पर काम कर रहा हूं)। धन्यवाद!

+0

उपयोग 'sudo -sH'' sudo सु -' के बजाय। – Zenexer

+0

क्या आप और अधिक पूछ रहे हैं कि कई लाइनों को दूरस्थ रूप से कैसे निष्पादित किया जाए, या एक साथ कई होस्टों में समानांतर में "निष्पादित" कैसे करें? समानांतर के लिए, https://serverfault.com/a/875812/27813 – rogerdpack

उत्तर

8

अक्सर, मैं तो बस उम्मीद के मूल Tcl संस्करण का उपयोग करेंगे। आपको केवल स्थानीय मशीन पर रखना होगा। अगर मैं पर्ल का उपयोग कर प्रोग्राम के अंदर हूं, तो मैं इसे Net::SSH::Expect के साथ करता हूं। अन्य भाषाओं में समान "उम्मीद" उपकरण होते हैं।

+3

इस मार्ग को चला गया। टिप (और संपादन) के लिए धन्यवाद। अन्य के अच्छे विचार थे, लेकिन मैं कुछ 300 लाइन स्क्रिप्ट चलाने की कोशिश कर रहा हूं। पर्ल उस 'लालित्य' को थोड़ा सा लाता है जो कि बाश प्रदान नहीं करेगा। (पर्ल .. लालित्य .. कभी सोचा नहीं कि मैं यह कहूंगा) :) – f4nt

+3

यदि आप सही सही करते हैं, तो यह अच्छा हो सकता है;) – Johan

3

आपको वास्तविक कोड के बिना संरचना देने के लिए।

  1. अपने इंस्टॉल/सेटअप स्क्रिप्ट को लक्ष्य बॉक्स में कॉपी करने के लिए एसपीपी का उपयोग करें।
  2. रिमोट बॉक्स पर अपनी स्क्रिप्ट को आमंत्रित करने के लिए एसएसएच का उपयोग करें।
+0

देखें जो अंत में काम करना पड़ सकता है। मैं उससे कुछ ज्यादा सुंदर की उम्मीद कर रहा था। अंत में, यह वास्तव में केवल विचलन से स्क्रिप्ट को खींचने में कटौती करता है, और एक बैश स्क्रिप्ट निर्यात करना समय की न्यूनतम हानि है। – f4nt

+0

आप स्वचालित रूप से ऐसा करने के लिए एक ही स्क्रिप्ट का उपयोग कर सकते हैं। यदि आप स्पष्ट नहीं थे, तो सभी आदेशों को टाइप करने के बिना, f4nt –

1

हालांकि यह एक जटिल विषय है, मैं अत्यधिक Capistrano की सिफारिश कर सकता हूं।

-2

यहाँ कई मशीनों पर एक SSH आदेश करने के लिए एक स्क्रिप्ट है, यह मदद मिल सकती है:

#!/bin/bash 
MACHINES="machine1 machine2 machine3 machine4 machine5 machine6" 
for m in $MACHINES 
do 
     cmd="ssh $m '$*'" 
     eval $cmd 
done 

तुम भी डाल सकता है इस तो यह आपके रास्ते में है, यह sshAll की तरह कुछ कहते हैं, तो बस sshAll आदेश लिखें।

1

आप इसे उसी तरह पहले की तरह स्क्रिप्ट यह बजाय इसे मैन्युअल रूप से ऐसा करने का कर सकते हैं। निम्न कोड 'loca' नाम की मशीन को रिमोट करता है और वहां दो आदेश चलाता है। आपको बस इतना करना है कि आप वहां चलाना चाहते हैं।

[email protected] ~ $ ssh loca 'uname -a; echo something_else' 
Linux loca 2.6.25.9 #1 (blahblahblah) 
something_else

फिर, सभी मशीनों के माध्यम से पुनरावृति करने के लिए, की तरह कुछ कार्य करें:

for box in box1_name box2_name box3_name 
do 
    ssh $box 'commmands_to_run_everywhere' 
done

आदेश पासवर्ड हर समय प्रवेश के बिना इस ssh बात काम करने के लिए, आप कुंजी स्थापित करने के लिए की आवश्यकता होगी प्रमाणीकरण। आप इसके बारे में IBM developerworks पर पढ़ सकते हैं।

+0

यह उन्हें समानांतर रूप से समान रूप से नहीं चलाता है (हालांकि आप ssh कमांड के अंत में '& 'जोड़ सकते हैं और' प्रतीक्षा ' नीचे और वे समानांतर में भागेंगे :) – rogerdpack

1

आप cluster ssh जैसे उपकरण के साथ एक बार में कई सर्वरों पर समान आदेश चला सकते हैं। यह लिंक दिन ब्लॉग के डेबियन पैकेज पर क्लस्टर एसएसएच की चर्चा के लिए है।

6

अतीत की अपेक्षा का उपयोग करने में उम्मीद (man expect)

मैं भी किया है उसके समान कार्य पर एक नजर डालें।

4

आप दूरस्थ सर्वर से पाइप स्थानीय स्क्रिप्ट कर सकते हैं और एक आदेश के साथ निष्पादित करें:

ssh -t [email protected] 'sh' < path_to_script 

यह आगे स्क्रिप्ट के साथ सार्वजनिक कुंजी प्रमाणीकरण और रैपिंग का उपयोग कर समानांतर निष्पादन प्रदर्शन करने से स्वचालित किया जा सकता।

11

आप के रूप में चे और यांग द्वारा दिखाए गए एक स्थानीय स्क्रिप्ट चला सकते हैं, और/या आप एक यहाँ दस्तावेज़ का उपयोग कर सकते हैं:

ssh [email protected] /bin/sh <<\EOF 
wget http://server/warfile # Could use NFS here 
cp app.war /location 
command 1 
command 2 
/etc/init.d/httpd restart 
EOF 
1

ठीक है, चरण 1 और 2 के लिए कोई टोमकैट प्रबंधक वेब इंटरफ़ेस नहीं है; आप कर सकते थे स्क्रिप्ट कर्ल या में libwww प्लग के साथ zsh साथ

SSH के लिए आप के लिए देख रहे हैं:। 1) SSH के पर एक पासवर्ड (उपयोग कुंजी) 2) आदेश (रों पारित) के लिए संकेत नहीं मिलता है कमांडलाइन, यह एक विश्वसनीय नेटवर्क में rsh के समान है।

अन्य पदों से पता चला है कि आप क्या करना है, और मैं शायद sh भी उपयोग लेकिन मैं perlssh [email protected] perl -e 'do-everything-on-one-line;' तरह का उपयोग करने के लिए परीक्षा होगी या आप ऐसा कर सकता है चाहते हैं:

या तोscp the_package.tbz [email protected]:the_place/.
ssh [email protected] /bin/sh <<\EOF
TOMCAT_WEBAPPS=/usr/local/share/tomcat/webapps
tar xj the_package.tbzयाrsync rsync://repository/the_package_place
012 की तरह सामान को परिभाषितmv $TOMCAT_WEBAPPS/old_war $TOMCAT_WEBAPPS/old_war.old
mv $THE_PLACE/new_war $TOMCAT_WEBAPPS/new_war
touch $TOMCAT_WEBAPPS/new_war [आप सामान्य रूप से पुन: प्रारंभ करने की जरूरत नहीं है बिल्ला]
mv $THE_PLACE/vhost_file $APACHE_VHOST_DIR/vhost_file
$APACHECTL restart
EOF

8

मुद्दा [अपाचे उपयोगकर्ता के रूप में प्रवेश करने के लिए है कि फाइल और पुन: प्रारंभ स्थानांतरित करने के लिए आवश्यकता हो सकती है] कई सर्वरों पर कमांड चलाने के तरीके को एक बार में एक पर्ल मेलिंग सूची पर आया था और मैं I gave there, gsh:

का उपयोग करने के लिए एक ही सिफारिश I gave there दे दूंगा

http://outflux.net/unix/software/gsh

GSH "for box in box1_name box2_name box3_name" समाधान already given के समान है, लेकिन मैं और अधिक सुविधाजनक होने के लिए GSH पाते हैं। आपने वेब/डीबी, आरएचईएल 4, x86_64, या जो भी (मैन भूत) जैसे समूहों में अपने सर्वर वाले एक/etc/ghosts फ़ाइल सेट की है, तो आप उस समूह का उपयोग करते हैं जब आप gsh कहते हैं।

[[email protected] ~]$ gsh web "cat /etc/redhat-release; uname -r" 
www-2.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7) 
www-2.foo.com: 2.6.9-78.0.1.ELsmp 
www-3.foo.com: Red Hat Enterprise Linux AS release 4 (Nahant Update 7) 
www-3.foo.com: 2.6.9-78.0.1.ELsmp 
www-4.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga) 
www-4.foo.com: 2.6.18-92.1.13.el5 
www-5.foo.com: Red Hat Enterprise Linux Server release 5.2 (Tikanga) 
www-5.foo.com: 2.6.18-92.1.13.el5 
[[email protected] ~]$ 

तुम भी गठबंधन कर सकते हैं या विभाजन भूत समूहों, वेब + db या वेब RHEL4 का उपयोग कर, उदाहरण के लिए।

मैं यह भी उल्लेख करूंगा कि मैंने कभी भी श्मक्स का उपयोग नहीं किया है, its website में सॉफ्टवेयर की एक सूची (जीएसएच सहित) है जो आपको कई सर्वरों पर एक बार में आदेश चलाने देती है। Capistrano पहले ही उल्लेख किया जा चुका है और (जो मैं समझता हूं) उस सूची में भी हो सकता है।

+0

बहु पंक्ति आदेशों के साथ जीएसएच का उपयोग कैसे करें? –

1

आप डीएसएच या वितरित खोल चाहते हैं, जो क्लस्टर में बहुत उपयोग किया जाता है। यहां लिंक है: dsh

आपके मूल रूप से नोड समूह (उनमें नोड्स की सूचियों वाली एक फ़ाइल है) और आप निर्दिष्ट करते हैं कि आप किस नोड समूह को कमांड चलाने के लिए चाहते हैं, तो आप dsh का उपयोग करेंगे, जैसे आप आदेश चलाने के लिए ssh करेंगे उन पर।

dsh -a /path/to/some/command/or/script 

यह एक ही समय में सभी मशीनों पर कमांड चलाएगा और मेजबाननाम के साथ प्रीफ़िक्स किए गए आउटपुट को वापस कर देगा। आदेश या स्क्रिप्ट को सिस्टम पर मौजूद होना है, इसलिए साझा की गई एनएफएस निर्देशिका इस तरह के चीजों के लिए उपयोगी हो सकती है।

0

मुझे यकीन है कि अगर इस विधि सब कुछ है कि आप चाहते हैं के लिए काम करेंगे नहीं कर रहा हूँ, लेकिन आप कुछ इस तरह की कोशिश कर सकते हैं:

$ cat your_script.sh | ssh your_host bash 

कौन सा रिमोट सर्वर पर स्क्रिप्ट (जो स्थानीय स्तर पर रहता है) चलेंगे।

2

pssh दिलचस्प हो सकता है, यहां वर्णित अधिकांश समाधानों के विपरीत, आदेश समानांतर में चल रहे हैं।

(मेरे अपने उपयोग के लिए, मैंने गैविन कैटल के एक जैसा ही एक छोटी सी छोटी लिपि लिखी, यह documented here - in french है)।

2

क्या आपने Puppet या Cfengine जैसी चीजों को देखा है। वे जो भी आप चाहते हैं और शायद अधिक कर सकते हैं।

4

आप paramiko आज़मा सकते हैं। यह एक शुद्ध पायथन एसएसएच ग्राहक है। आप अपने एसएसएच सत्र प्रोग्राम कर सकते हैं। रिमोट मशीनों पर स्थापित करने के लिए कुछ नहीं।

इसे great article पर उपयोग करने के तरीके पर देखें।

0

Multixterm ऐसा करने के लिए अच्छा है, और आपको अनुक्रम में वापस 1 मशीन को आसानी से डालने की अनुमति देता है।

2

इस प्रश्न में जो लोग ठोकर खा रहे हैं, उनके लिए एक उत्तर शामिल होगा जो Fabric का उपयोग करता है, जो ऊपर वर्णित समस्या को हल करता है: एसएसएच पर एकाधिक होस्टों पर मनमाने ढंग से आदेश चला रहा है।

एक बार कपड़े स्थापित हो जाने पर, आप fabfile.py बनाएंगे, और कार्य लागू करें जो आपके दूरस्थ होस्ट पर चलाया जा सकता है। उदाहरण के लिए, पुनः लोड अपाचे के लिए कोई कार्य इस प्रकार दिखाई देंगे:

from fabric.api import env, run 

env.hosts = ['[email protected]', '[email protected]'] 

def reload(): 
    """ Reload Apache """ 
    run("sudo /etc/init.d/apache2 reload") 

फिर, अपने स्थानीय मशीन पर, fab reload चलाने के लिए और sudo /etc/init.d/apache2 reload आदेश सभी मेजबानों env.hosts में निर्दिष्ट पर चलने जायेगा।

1

एक्सेस की गई सभी मशीनों का होस्टनाम ssh कमांड बनाता है। Quierati http://pastebin.com/pddEQWq2

#Use in .bashrc 
#Use "HashKnownHosts no" in ~/.ssh/config or /etc/ssh/ssh_config 
# If known_hosts is encrypted and delete known_hosts 

[ ! -d ~/bin ] && mkdir ~/bin 
for host in `cut -d, -f1 ~/.ssh/known_hosts|cut -f1 -d " "`; 
    do 
    [ ! -s ~/bin/$host ] && echo ssh $host '$*' > ~/bin/$host 
done 
[ -d ~/bin ] && chmod -R 700 ~/bin 
export PATH=$PATH:~/bin 

द्वारा पूर्व निष्पादित करें:

$for i in hostname{1..10}; do $i who;done 
1

वहाँ एक उपकरण है जो पर कई यूनिक्स/लिनक्स एक बटन के एक क्लिक के साथ होस्ट करता है आप आलेख निष्पादित करने की अनुमति देता है FLATT (FLexible Automation and Troubleshooting Tool) कहा जाता है। यह एक डेस्कटॉप जीयूआई ऐप है जो मैक और विंडोज पर चलता है लेकिन एक कमांड लाइन जावा क्लाइंट भी है।
आप बैच नौकरियां बना सकते हैं और एकाधिक होस्ट पर पुन: उपयोग कर सकते हैं।
जावा 1.6 या उच्चतम की आवश्यकता है।

0

मुख्यधारा के कर्नेल के अलावा setsid का उपयोग करके setsid का उपयोग करके एक नया blog पढ़ें। Ubuntu14.04 के तहत परीक्षण/सत्यापित।

जबकि लेखक के रूप में अच्छी तरह से एक बहुत ही स्पष्ट विवरण और नमूना कोड है, यहाँ एक नज़र के लिए जादू हिस्सा है:

#---------------------------------------------------------------------- 
# Create a temp script to echo the SSH password, used by SSH_ASKPASS 
#---------------------------------------------------------------------- 
SSH_ASKPASS_SCRIPT=/tmp/ssh-askpass-script 
cat > ${SSH_ASKPASS_SCRIPT} <<EOL 
#!/bin/bash 
echo "${PASS}" 
EOL 
chmod u+x ${SSH_ASKPASS_SCRIPT} 

# Tell SSH to read in the output of the provided script as the password. 
# We still have to use setsid to eliminate access to a terminal and thus avoid 
# it ignoring this and asking for a password. 
export SSH_ASKPASS=${SSH_ASKPASS_SCRIPT} 
...... 
...... 
# Log in to the remote server and run the above command. 
# The use of setsid is a part of the machinations to stop ssh 
# prompting for a password. 
setsid ssh ${SSH_OPTIONS} ${USER}@${SERVER} "ls -rlt" 
संबंधित मुद्दे

 संबंधित मुद्दे