मैं ssh के माध्यम से दूरस्थ मशीनों पर स्थानीय बैश स्क्रिप्ट कैसे चलाऊँ?


51

मुझे दूरस्थ मशीन पर कुछ भी स्थापित करने की आवश्यकता के बिना एक केंद्रीय मशीन से कई दूरस्थ मशीनों तक कॉन्फ़िगरेशन को आगे बढ़ाने का एक रास्ता मिल रहा है।

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



1
वास्तविक प्रश्नों में 23 उत्थान हैं जहाँ SO पर डुप्लिकेट में 55: P
MoJo

जवाबों:


55

आप एक स्क्रिप्ट को पास कर सकते हैं और इसे खोलकर पाइपिंग करके और खोलकर निष्पादित करके इसे समय-समय पर निष्पादित कर सकते हैं।

जैसे

echo "ls -l; echo 'Hello World'" | ssh me@myserver /bin/bash

स्वाभाविक रूप से, "ls -l; echo 'Hello World'"स्थानीय मशीन पर फ़ाइल में संग्रहीत बैश स्क्रिप्ट के साथ भाग को बदला जा सकता है।

जैसे

cat script.sh | ssh me@myserver /bin/bash

चीयर्स!


2
मैं कैसे दूरस्थ system.eg पर sudo के रूप में इस रन कर सकता हूँ अगर मैं दूरस्थ सर्वर पर लॉग ऑन किया गया था मैं आमतौर पर के रूप में sudo -u testuser script.sh इस चल पाएंगे
Sharjeel

क्या होगा अगर मैं जो स्क्रिप्ट कह रहा हूं उसमें उपयोगकर्ता इंटरैक्शन शामिल हैं ???
अभिमन्यु श्रीवास्तव

20

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

1:

ssh user@remote_server 'bash -s' < localfile

2:

cat localfile  | ssh user@remote_server

3:

ssh user@remote_server "$(< localfile)"

नंबर 3 मेरा पसंदीदा तरीका है, यह इंटरैक्टिव कमांड्स जैसे की अनुमति देता है su -S service nginx restart

(# 1 आपके द्वारा उपयोग किए जाने पर पासवर्ड प्रश्न के लिए इनपुट के रूप में बाकी स्क्रिप्ट का उपभोग करेगा su -S।)


4
रिमोट मशीन पर स्थानीय स्क्रिप्ट चलाने के बारे में - क्या रिमोट मशीन के तर्क के रूप में चर भेजने का एक तरीका है ..? यानी स्क्रिप्ट के साथ, मैं दूरस्थ मशीन के तर्क के रूप में एक चर (कई पंक्तियों वाले) भेजना चाहता हूं। स्क्रिप्ट तब चर का उपयोग करने का इरादा रखती है।

13

मैं इस उद्देश्य के लिए अजगर के कपड़े की सिफारिश करूंगा:

#!/usr/bin/python
# ~/fabfile.py

from fabric_api import *

env.hosts = ['host1', 'host2']
def deploy_script():
    put('your_script.sh', 'your_script.sh', mode=0755)
    sudo('./your_script.sh')

# from shell
$ fab deploy_script

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


मुझे नहीं लगता कि यह वास्तव में सवाल का जवाब देता है, लेकिन मुझे यह विचार पसंद है और मैं फैब्रिक को एक उपयोगी उपकरण के रूप में देख सकता हूं।
कांपोलोकी

1
@tremoloqui फैब्रिक ssh के आसपास एक अजगर आवरण है - लक्ष्य मशीनों पर कुछ भी स्थापित करने की आवश्यकता नहीं है, स्क्रिप्ट को धकेलने से बचाएं। फैब्रिक कमांड (उपयोग runऔर sudo) की एक श्रृंखला के रूप में दोबारा लिखे जाने पर , इसकी आवश्यकता भी नहीं है।
इजाकाता

5

यह वही है जो Ansible के लिए उपयोग किया जाता है। कोई एजेंट नहीं है, आपको बस एक टेक्स्ट फाइल बनानी होगी, जिसे:

/etc/ansible/hosts

ऐसी सामग्री के साथ जो कुछ इस तरह दिखती है:

[webhosts]
web[1-8]

यह निर्दिष्ट करेगा कि मशीनें "web1, web2 ... web8" समूह "webhosts" में हैं। तब आप निम्न कार्य कर सकते हैं:

ansible webhosts -m service -a "name=apache2 state=restarted" --sudo

sudo का उपयोग करके अपने सभी मशीनों पर apache2 सेवा को फिर से शुरू करने के लिए।

आप फ्लाई कमांड पर कर सकते हैं जैसे:

ansible webhosts -m shell -a "df -h"

या आप दूरस्थ मशीन पर स्थानीय स्क्रिप्ट चला सकते हैं:

ansible webhosts -m script -a "./script.sh"

या आप एक पूर्ण कॉन्फ़िगरेशन के साथ एक प्लेबुक (विवरण के लिए दस्तावेज़ीकरण देखें) बना सकते हैं, जिसे आप चाहते हैं कि आपके सर्वर इसके अनुरूप हों और इसे निम्न परिनियोजित करें:

ansible-playbook webplaybook.yml

मूल रूप से आप इसे कई सर्वरों पर कमांड चलाने के लिए कमांड लाइन टूल के रूप में उपयोग करना शुरू कर सकते हैं और इसके उपयोग को एक संपूर्ण कॉन्फ़िगरेशन टूल में विस्तारित कर सकते हैं जैसा कि आप फिट देखते हैं।


3
मुझे अगले लड़के जितना ही पसंद है, लेकिन अगर वह किसी स्क्रिप्ट के बारे में पूछ रहा है, तो उस स्क्रिप्ट में एक बहुत अच्छा स्क्रिप्ट मॉड्यूल है :ansible webhosts -m script script.sh
ptman

1
अन्य सभी उत्तरों में बैश स्क्रिप्ट शामिल है, लेकिन यह वह नहीं है जो उन्होंने विशेष रूप से मांगा था। उन्होंने सिर्फ रिमोट मशीनों को कॉन्फ़िगर करने के लिए कहा। लेकिन स्क्रिप्ट मॉड्यूल का अच्छा उल्लेख :)
seumasmac

कृपया इस उत्तर को वोट करें! इसे करने का यही तरीका है!
चूजों

@ptman मैंने केवल यह देखा है कि जब वह प्रश्न में एक स्क्रिप्ट का उल्लेख नहीं करता है, तो वह शीर्षक में करता है! माफ़ करना। मैंने अपडेट किया है।
सीसमैसैक

3

इस उत्तर में बताया गया है कि आप हेरेडोक का उपयोग कर सकते हैं :

ssh user@host <<'ENDSSH'
#commands to run on remote host
ENDSSH

आपको हेरेडोक के साथ सावधान रहना होगा, क्योंकि यह सिर्फ पाठ भेजता है, लेकिन यह वास्तव में प्रतिक्रिया की प्रतीक्षा नहीं करता है। इसका मतलब है कि यह आपके आदेशों के क्रियान्वित होने का इंतजार नहीं करेगा।


1

यहाँ उत्तर ( https://stackoverflow.com/a/2732991/4752883 ) बहुत अच्छा काम करता है अगर आप एक रिमोट लाइनक्स मशीन का उपयोग करके plinkया एक स्क्रिप्ट को चलाने की कोशिश कर रहे हैं ssh। यह काम करेगा अगर स्क्रिप्ट पर कई लाइनें हैं linux

** हालांकि, यदि आप एक स्थानीय linux/windowsमशीन पर स्थित एक बैच स्क्रिप्ट को चलाने की कोशिश कर रहे हैं और आपकी रिमोट मशीन है Windows, और इसमें ** का उपयोग करके कई पंक्तियों का समावेश है

plink root@MachineB -m local_script.bat

यह काम नहीं करेगा।

केवल स्क्रिप्ट की पहली पंक्ति निष्पादित होगी। यह शायद एक सीमा है plink

समाधान 1:

बहुस्तरीय बैच स्क्रिप्ट को चलाने के लिए (विशेषकर यदि यह अपेक्षाकृत सरल है, जिसमें कुछ लाइनें शामिल हैं):

यदि आपकी मूल बैच स्क्रिप्ट इस प्रकार है

cd C:\Users\ipython_user\Desktop 
python filename.py

आप अपनी local_script.batफ़ाइल में निम्नानुसार "&&" विभाजक का उपयोग करके लाइनों को एक साथ जोड़ सकते हैं जैसे कि https://stackoverflow.com/a/8055390/4752883 :

cd C:\Users\ipython_user\Desktop && python filename.py

इस परिवर्तन के बाद, आप @ जेसन.चूम द्वारा यहाँ बताई गई स्क्रिप्ट चला सकते हैं: https://stackoverflow.com/a/2732991/4752883

समाधान 2:

यदि आपकी बैच स्क्रिप्ट अपेक्षाकृत जटिल है, तो बैच स्क्रिप्ट का उपयोग करना बेहतर हो सकता है, जो पलक कमांड को इनकैप्सुलेट करता है और साथ ही साथ यहां बताया गया है @Martin https://stackoverflow.com/a/32196999/4752883 :

rem Open tunnel in the background
start plink.exe -ssh [username]@[hostname] -L 3307:127.0.0.1:3306 -i "[SSH
key]" -N

rem Wait a second to let Plink establish the tunnel 
timeout /t 1

rem Run the task using the tunnel
"C:\Program Files\R\R-3.2.1\bin\x64\R.exe" CMD BATCH qidash.R

rem Kill the tunnel
taskkill /im plink.exe

0

केवल स्क्रिप्ट की प्रतिलिपि पहले क्यों नहीं बनाई गई, फिर उसे चला रहे हैं?

scp your_script.sh the_server:
ssh the_server "chmod +x your_script.sh; ./your_script.sh"

निश्चित रूप से आपको सावधान रहना चाहिए कि आप इसे विश्व-कुख्यात स्थान पर अपलोड न करें, इसलिए इसे चलाने से पहले कोई भी आपके साथ नहीं रह सकता है (संभवतः रूट के रूप में)।


1
इसका कारण यह है कि मैं स्क्रिप्ट अपलोड नहीं करना चाहता, इसलिए इसे प्रबंधित करने की आवश्यकता नहीं है और आपके द्वारा बताए गए जोखिम हैं। इसके अलावा, यह मुझे लगता है कि अपलोड करने, प्रसंस्करण और (वैकल्पिक रूप से) हटाने की बहु-चरण प्रक्रिया की तुलना में सरल है।
२३'१० को कांपोलोकी

0

स्क्रिप्ट को इस तरह से फिर से लिखें कि इसमें प्रत्येक कमांड पहले से ही ssh के साथ उपसर्गित हो और एक hostname / ip या इस तरह की सूची को तर्क के रूप में स्क्रिप्ट में पास किया जाता है (यह मानते हुए कि आपके पास पासवर्ड रहित / ssh- एजेंट कुंजी प्रमाणीकरण सेट है)। दूरस्थ कमांड से त्रुटि / रिटर्न कोड को सही ढंग से पास करने के लिए कुछ काम आवश्यक हो सकते हैं ...।


0

यदि स्क्रिप्ट बहुत बड़ी नहीं है, और आप बैश या ksh का उपयोग कर रहे हैं ...

ssh vm24 -t bash -c "$(printf "%q" "$(< shell-test.sh )")"

स्टड और स्टडआउट दोनों सही ढंग से काम करते हैं लेकिन स्क्रिप्ट तर्क आकार (आमतौर पर लगभग 100k) तक सीमित है। स्क्रिप्ट के तर्क, पंक्ति के अंत में, संभवतः एक अतिरिक्त "-" तर्क के बाद काम कर सकते हैं। एक pty आवंटित करने के लिए "-t" वैकल्पिक है।

खबरदार: यह टकराव को पूरा करता है, टैब को मत मारो।

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