एक दूरस्थ मशीन पर ssh और कमांड निष्पादित करने के लिए शेल स्क्रिप्ट लिखें


97

मेरे दो सवाल हैं:

  1. कई दूरस्थ लिनक्स मशीनें हैं, और मुझे एक शेल स्क्रिप्ट लिखने की ज़रूरत है जो प्रत्येक मशीन में कमांड के एक ही सेट को निष्पादित करेगी। (कुछ सूडो ऑपरेशन सहित)। शेल स्क्रिप्टिंग का उपयोग करके यह कैसे किया जा सकता है?
  2. जब रिमोट मशीन के लिए ssh'ing, तो RSA फिंगरप्रिंट प्रमाणीकरण के लिए संकेत देने पर इसे कैसे संभालना है।

दूरस्थ मशीनें रन बनाने के लिए वीएम हैं और मेरे पास बस अपना आईपी है। इसलिए, मैं उन मशीनों में एक स्क्रिप्ट फ़ाइल पहले से नहीं रख सकता और उन्हें मेरी मशीन से निष्पादित कर सकता हूं।


मैं दूरस्थ लिनक्स मशीनों में एक एजेंट जैसे कार्यक्रम को तैनात करने के बारे में सोचता हूं, जो नेटवर्क सॉकेट (या एसएसएल) कनेक्शन / सर्वर द्वारा आवधिक मतदान द्वारा सर्वर के साथ संबंध बनाए रखता है।
Raptor

मुझे केवल एक बार आदेशों के एक सेट को निष्पादित करने की आवश्यकता है, इसलिए कनेक्शन को बनाए रखने के लिए आवश्यक नहीं है
बालानिवश

"नो स्क्रिप्ट्स" का अर्थ है "नो फाइल्स बिलकुल", मुझे लगता है? आप प्रमाणीकरण कैसे संभालते हैं? आप होस्ट फ़िंगरप्रिंट चेकिंग (मेरा उत्तर देखें) को अक्षम कर सकते हैं, लेकिन यदि आपने सार्वजनिक / निजी कुंजी सेट नहीं की है, तो भी आपको एक इंटरैक्टिव पासवर्ड प्रॉम्प्ट मिल सकता है।
एंड्रियास फस्टर

1
एंड्रियास: हाँ। कोई फाइल नहीं। पासवड प्रॉम्प्ट expectको 'उम्मीद' के रूप में इस्तेमाल किया जा सकता है; एसरवर्ड: "`
बालनिवास

जवाबों:


141

कई दूरस्थ लिनक्स मशीनें हैं, और मुझे एक शेल स्क्रिप्ट लिखने की ज़रूरत है जो प्रत्येक मशीन में कमांड के एक ही सेट को निष्पादित करेगी। (कुछ सूडो ऑपरेशन सहित)। शेल स्क्रिप्टिंग का उपयोग करके यह कैसे किया जा सकता है?

आप इसे ssh के साथ कर सकते हैं, उदाहरण के लिए:

#!/bin/bash
USERNAME=someUser
HOSTS="host1 host2 host3"
SCRIPT="pwd; ls"
for HOSTNAME in ${HOSTS} ; do
    ssh -l ${USERNAME} ${HOSTNAME} "${SCRIPT}"
done

जब रिमोट मशीन के लिए ssh'ing, तो RSA फिंगरप्रिंट प्रमाणीकरण के लिए संकेत देने पर इसे कैसे संभालना है।

आप StrictHostKeyChecking=nossh में विकल्प जोड़ सकते हैं :

ssh -o StrictHostKeyChecking=no -l username hostname "pwd; ls"

यह होस्ट कुंजी जांच को अक्षम कर देगा और स्वचालित रूप से होस्ट की जाने वाली मेजबानों की सूची में जोड़ देगा। यदि आप होस्ट को ज्ञात होस्ट फ़ाइल में जोड़ना नहीं चाहते हैं, तो विकल्प जोड़ें -o UserKnownHostsFile=/dev/null

ध्यान दें कि यह कुछ सुरक्षा जांचों को अक्षम करता है , उदाहरण के लिए मैन-इन-द-बीच हमले के खिलाफ सुरक्षा। इसलिए इसे सुरक्षा संवेदनशील वातावरण में लागू नहीं किया जाना चाहिए।


स्क्रिप्टिंग भाषा क्या है? आप निश्चित रूप sshसे किसी भी शेल स्क्रिप्ट से कॉल कर सकते हैं
एंड्रियास फस्टर

अगर आप CTRL + C करना चाहते हैं और कई सर्वर पर ssh जारी रखना चाहते हैं तो क्या होगा? उदाहरण के लिए कुछ सर्वर पासवर्ड मांग रहे हैं और कुछ अन्य नहीं में, इसलिए स्क्रिप्ट वहां अटक जाएगी। क्या CTRL c या CTRL d करने के लिए -o के समान सोमैथोंग करने का एक तरीका है?
चनाफोट

5

इसे संभालने के कई तरीके हैं।

मेरा पसंदीदा तरीका दूरस्थ प्रणालियों पर http://pamsshagentauth.sourceforge.net/ स्थापित करना है और आपकी स्वयं की सार्वजनिक कुंजी भी है। (वीएम पर इन स्थापित करने का एक तरीका समझ लें, किसी तरह आपको एक संपूर्ण यूनिक्स सिस्टम स्थापित किया गया है, एक जोड़ी अधिक फाइलें क्या हैं?)

आपके ssh एजेंट को अग्रेषित करने के साथ, आप अब बिना पासवर्ड के हर सिस्टम में लॉग इन कर सकते हैं।

और इससे भी बेहतर, कि pam मॉड्यूल sudo के लिए आपके ssh की जोड़ी के साथ प्रमाणित करेगा ताकि आप आवश्यकतानुसार रूट (या किसी अन्य उपयोगकर्ता) अधिकार के साथ चला सकें।

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

आपको कैपिस्ट्रानो जैसे पैकेज में भी देखना चाहिए निश्चित रूप से उस साइट के चारों ओर देखें; इसमें रिमोट स्क्रिप्टिंग का परिचय है।

व्यक्तिगत स्क्रिप्ट लाइनें कुछ इस तरह दिख सकती हैं:

ssh remote-system-name command arguments ... # so, for exmaple,
ssh target.mycorp.net sudo puppet apply

4

Sshpass का उपयोग कर स्थापित करें, apt-get install sshpassफिर स्क्रिप्ट को संपादित करें और अपने लिनक्स मशीनों को संबंधित क्रम में IPs , उपयोगकर्ता नाम और पासवर्ड डालें। इसके बाद उस स्क्रिप्ट को चलाएं। बस ! यह स्क्रिप्ट सभी प्रणालियों में VLC स्थापित करेगी।

#!/bin/bash
SCRIPT="cd Desktop; pwd;  echo -e 'PASSWORD' | sudo -S apt-get install vlc"
HOSTS=("192.168.1.121" "192.168.1.122" "192.168.1.123")
USERNAMES=("username1" "username2" "username3")
PASSWORDS=("password1" "password2" "password3")
for i in ${!HOSTS[*]} ; do
     echo ${HOSTS[i]}
     SCR=${SCRIPT/PASSWORD/${PASSWORDS[i]}}
     sshpass -p ${PASSWORDS[i]} ssh -l ${USERNAMES[i]} ${HOSTS[i]} "${SCR}"
done

स्क्रिप्ट में दिखाने से बचने के लिए पासवर्ड निर्यात करने के लिए $ SSHPASS का उपयोग करें। Ref: tecmint.com/…
Hexy

2

यदि आप पर्ल कोड लिखने में सक्षम हैं, तो आपको नेट :: ओपनएसएसएच :: समानांतर का उपयोग करने पर विचार करना चाहिए ।

आप उन कार्यों का वर्णन करने में सक्षम होंगे जो प्रत्येक मेजबान में एक घोषणात्मक तरीके से चलाए जाते हैं और मॉड्यूल सभी डरावने विवरणों का ध्यान रखेगा। के माध्यम से कमांड चलाना sudoभी समर्थित है।


2

यह काम मेरे लिए।

सिंटैक्स: ssh -i pemfile.pem user_name @ ip_address 'command_1; आज्ञा 2; कमांड 3 '

#! /bin/bash

echo "########### connecting to server and run commands in sequence ###########"
ssh -i ~/.ssh/ec2_instance.pem ubuntu@ip_address 'touch a.txt; touch b.txt; sudo systemctl status tomcat.service'

1

इस तरह के कार्यों के लिए, मैं बार-बार एन्सिबल का उपयोग करता हूं जो कई समरूप या वीएम में सुसंगत रूप से बैश लिपियों की नकल करने की अनुमति देता है। Ansible (अधिक सटीक रूप से Red Hat ) में अब एक अतिरिक्त वेब इंटरफ़ेस AWX है जो उनके वाणिज्यिक टॉवर का ओपन-सोर्स संस्करण है।

Ansible: https://www.ansible.com/
AWX: https://github.com/ansible/awx
Ansible टॉवर: वाणिज्यिक उत्पाद, तो आप शायद मुट्ठी खुले मुक्त स्रोत AWX से जानेंगे, 15 दिनों के बजाय मुक्त-निशान टॉवर का


1

कई दूरस्थ लिनक्स मशीनों में कमांड या स्क्रिप्ट को निष्पादित करने के कई तरीके हैं। Pssh (समानांतर ssh प्रोग्राम)

pssh के माध्यम से एक सरल और सबसे आसान तरीका है : कई मेजबानों पर समानांतर में ssh निष्पादित करने के लिए एक कार्यक्रम है। यह सभी प्रक्रियाओं को इनपुट भेजने, ssh को पासवर्ड पास करने, आउटपुट को फाइलों में सहेजने, और समय समाप्त करने जैसी सुविधाएँ प्रदान करता है।

उदाहरण और उपयोग:

host1 और host2 से कनेक्ट करें, और प्रत्येक से "हैलो, वर्ल्ड" प्रिंट करें:

 pssh -i -H "host1 host2" echo "hello, world"

कई सर्वरों पर स्क्रिप्ट के माध्यम से कमांड चलाएँ:

pssh -h hosts.txt -P -I<./commands.sh

मेजबान कुंजियों की जाँच या सहेजे बिना एक कमांड का उपयोग करें और चलाएं:

pssh -h hostname_ip.txt -x '-q -o StrictHostKeyChecking=no -o PreferredAuthentications=publickey -o PubkeyAuthentication=yes' -i  'uptime; hostname -f'

यदि फ़ाइल Host.txt में बड़ी संख्या में प्रविष्टियाँ हैं, तो 100 का कहना है, तो यह सुनिश्चित करने के लिए समानांतरवाद विकल्प भी 100 पर सेट किया जा सकता है कि कमांड समवर्ती रूप से चलाए जा रहे हैं:

pssh -i -h hosts.txt -p 100 -t 0 sleep 10000

विकल्प :
-I: इनपुट पढ़ें और प्रत्येक ssh प्रक्रिया को भेजता है।
- 8. आउटपुट आने पर पीएसएच को आउटपुट प्रदर्शित करने के लिए कहता है।
-h: होस्ट की फ़ाइल पढ़ता है।
-एच: [उपयोगकर्ता @] होस्ट [: पोर्ट] एकल-होस्ट के लिए।
-i: प्रत्येक होस्ट पूर्ण
-x आर्ग के रूप में मानक आउटपुट और मानक त्रुटि प्रदर्शित करता है : अतिरिक्त SSH कमांड-लाइन तर्क
-पास विकल्प देता है: विकल्प विन्यास फाइल में प्रयुक्त प्रारूप में विकल्प देने के लिए इस्तेमाल किया जा सकता है। (/ etc / ssh / ssh_config ) (~ / .ssh / config)
-p समानतावाद : समवर्ती कनेक्शन की अधिकतम संख्या के रूप में दी गई संख्या का उपयोग करें
-q चुप मोड: सबसे चेतावनी और नैदानिक ​​संदेशों को दबाए जाने का कारण बनता है ।
-t: दिए गए सेकंड के बाद कनेक्शन टाइम आउट करें। 0 का मतलब है कि pssh किसी भी कनेक्शन मध्यांतर नहीं होगा

जब रिमोट मशीन के लिए ssh'ing, तो RSA फिंगरप्रिंट प्रमाणीकरण के लिए संकेत देने पर इसे कैसे संभालना है।

RSA प्रमाणीकरण प्रॉम्प्ट को संभालने के लिए StrictHostKeyChecking अक्षम करें।
-ओ स्ट्रिक्टहोस्टकेयेकिंग = नहीं

स्रोत : आदमी pssh


0

इसने मेरे लिए काम किया। मैंने एक फंक्शन किया। इसे अपनी शेल स्क्रिप्ट में रखें:

sshcmd(){
    ssh $1@$2 $3
}

sshcmd USER HOST COMMAND

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

sshcmd USER HOST COMMAND ; sshcmd USER HOST COMMAND

USER को कंप्यूटर के उपयोगकर्ता से बदलें। कंप्यूटर के नाम के साथ HOST बदलें। उस कमांड को बदलें जो आप कंप्यूटर पर करना चाहते हैं।

उम्मीद है की यह मदद करेगा!


-1

आप इस दृष्टिकोण का अनुसरण कर सकते हैं:

  • Expect Script का उपयोग करके रिमोट मशीन से कनेक्ट करें । यदि आपकी मशीन उम्मीद का समर्थन नहीं करती है तो आप उसे डाउनलोड कर सकते हैं। उम्मीद की स्क्रिप्ट लिखना बहुत आसान है (इस पर मदद पाने के लिए गूगल)
  • शेल स्क्रिप्ट में रिमोट सर्वर पर किए जाने वाले सभी कार्यों को रखें।
  • लॉगिन सफल होने के बाद उम्मीद की गई स्क्रिप्ट से दूरस्थ शेल स्क्रिप्ट को आमंत्रित करें।

जैसा कि मैंने प्रश्न में उल्लेख किया है, रिमोट मशीन रन पर बनाई गई हैं और I कैंटन मशीन में पहले से कोई स्क्रिप्ट है।
बालनिवास

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