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


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

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


45
2017-12-23 18:41


मूल


एसओ पर समान: stackoverflow.com/q/305035/435605 - AlikElzin-kilaka
वास्तविक प्रश्नों में 23 अपवॉट हैं जहां एसओ पर डुप्लिकेट 55 है: पी - MoJo


जवाब:


आप एक स्क्रिप्ट पास कर सकते हैं और इसे खोलकर और खोल को निष्पादित करके इसे अंधाधुंध निष्पादित कर सकते हैं।

जैसे

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

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

जैसे

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

चीयर्स!


51
2017-12-23 18:47



मैं इस प्रणाली को रिमोट सिस्टम पर sudo के रूप में कैसे बना सकता हूं। अगर मैं रिमोट सर्वर पर लॉग ऑन था तो मैं आमतौर पर इसे सूडो -यू टेस्टसर स्क्रिप्ट के रूप में चलाऊंगा - Sharjeel
क्या होगा यदि मैं जिस स्क्रिप्ट को कॉल कर रहा हूं जिसमें उपयोगकर्ता इंटरैक्शन शामिल है ??? - Abhimanyu Srivastava


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

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।)


18
2018-05-15 08:41



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


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

#!/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

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


12
2017-12-23 20:33



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


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

/etc/ansible/hosts

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

[webhosts]
web[1-8]

यह निर्दिष्ट करेगा कि मशीन "वेब 1, वेब 2 ... वेब 8" समूह "वेबहोस्ट" में हैं। फिर आप चीजें कर सकते हैं जैसे:

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

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

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

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

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

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

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

ansible-playbook webplaybook.yml

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


5
2017-08-15 09:35



मुझे अगले व्यक्ति के रूप में उत्तरदायी पसंद है, लेकिन अगर वह एक स्क्रिप्ट के बारे में पूछ रहा है, तो उत्तरदायी वास्तव में अच्छा है स्क्रिप्ट मॉड्यूल: ansible webhosts -m script script.sh - ptman
अन्य सभी उत्तरों में एक बैश स्क्रिप्ट शामिल है, लेकिन यह वह नहीं है जिसे उसने विशेष रूप से पूछा था। उन्होंने अभी रिमोट मशीनों को कॉन्फ़िगर करने के लिए कहा। लेकिन स्क्रिप्ट मॉड्यूल का अच्छा उल्लेख :) - seumasmac
कृपया इस जवाब को वोट दें! इसे करने का यही तरीका है! - chicks
@ptman मैंने केवल इतना देखा है कि जब वह इस प्रश्न में एक स्क्रिप्ट का जिक्र नहीं करता है, तो वह शीर्षक में करता है! माफ़ कीजिये। मैंने अपडेट किया है - seumasmac


जैसा कि समझाया गया है यह जवाब आप उपयोग कर सकते हैं हियरडॉक :

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

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


3
2017-12-13 14:24





यहां जवाब (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

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

समाधान 2:

यदि आपकी बैच स्क्रिप्ट अपेक्षाकृत जटिल है, तो बैच का उपयोग करना बेहतर हो सकता है स्क्रिप्ट जो प्लिंक कमांड को साथ ही साथ इंगित करता है जैसा कि इंगित करता है यहां @ मार्टिन द्वारा 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

1
2018-04-19 21:09





क्यों न केवल स्क्रिप्ट कॉपी करें, फिर इसे चलाएं?

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

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


0
2017-12-23 19:00



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


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


0
2017-12-13 14:31





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

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

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

सावधान रहें: यह बैश-पूर्णता को भ्रमित करता है, टैब को हिट न करें।


0
2018-03-16 23:32