আমি কীভাবে এসএসএসের মাধ্যমে দূরবর্তী মেশিনে স্থানীয় বাশ স্ক্রিপ্টটি চালাব?


51

দূরবর্তী মেশিনে কিছু ইনস্টল করার প্রয়োজন ছাড়াই আমি একটি কেন্দ্রীয় মেশিন থেকে একাধিক দূরবর্তী মেশিনে কনফিগারেশনটি ঠেকানোর উপায় খুঁজছি।

লক্ষ্যটি হ'ল এমন কিছু করা যা আপনি যেমন সরঞ্জামগুলি সন্ধান করতে পারেন cfengineতবে এমন একটি মেশিনের সেট যা এজেন্ট সেটআপ করে না। এটি সম্ভবত cfagentবিদ্যমান দূরবর্তী মেশিনগুলির একটি সেট সেট আপ করার জন্য একটি ভাল কৌশল হতে পারে ।


: তাই অনুরূপ stackoverflow.com/q/305035/435605
AlikElzin-kilaka

1
আসল প্রশ্নগুলির 23 টি আপভেট রয়েছে যেখানে এসও-তে সদৃশ 55 আছে: পি
মোজো

উত্তর:


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
আমি কীভাবে এই রানটি রিমোট সিস্টেমে sudo হিসাবে করব? আমি যদি রিমোট সার্ভারে লগইন করে থাকতাম তবে আমি সাধারণত এটি sudo -u testuser স্ক্রিপ্ট হিসাবে চালাতাম
শারজিল

আমি যে স্ক্রিপ্টটি কল করছি তাতে যদি ব্যবহারকারী ইন্টারঅ্যাকশন জড়িত থাকে ???
অভিমন্যু শ্রীবাস্তব

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

শুরু করার জন্য আপনার উপরেরটি ব্যবহার করতে সক্ষম হওয়া উচিত। বাকীগুলি করার জন্য ফ্যাব্রিকের দুর্দান্ত ডকুমেন্টেশনের সাথে পরামর্শ করুন । সংযোজন হিসাবে, সম্পূর্ণরূপে আপনার স্ক্রিপ্টটি ফ্যাব্রিকের মধ্যে রচনা করা সম্ভব - কোনও অনুলিপি লাগবে না, তবে এটি অবশ্যই লক্ষ করা উচিত যে সমস্ত মেশিনে স্ক্রিপ্টটি পরিবর্তন করতে আপনাকে কেবল স্থানীয় অনুলিপি এবং পুনর্লিখন সম্পাদনা করতে হবে। তদুপরি, এপিআই এর মৌলিক ব্যবহারের চেয়ে কিছুটা বেশি, আপনি বর্তমানে কোন হোস্ট এবং / অথবা অন্যান্য ভেরিয়েবলের উপর ভিত্তি করে স্ক্রিপ্টটি পরিবর্তন করতে পারেন। এটি এক ধরণের পাইথনিক প্রত্যাশা।


আমি মনে করি না এটি সঠিকভাবে প্রশ্নের উত্তর দেয় তবে আমি ধারণাটি পছন্দ করি এবং আমি একটি দরকারী সরঞ্জাম হিসাবে ফ্যাব্রিককে দেখতে পেতাম।
tremoloqui

1
@ ট্রিমোলোকি ফ্যাব্রিক এসএসএস-এর আশেপাশে একটি অজগর মোড়ক - লক্ষ্য মেশিনে কিছুই ইনস্টল করার দরকার নেই, স্ক্রিপ্টটি চাপ দেওয়া থেকে বাঁচানো যায়। যা, তারেক কমান্ড (ব্যবহারের একটি সিরিজ হিসাবে পুনর্লিখিত runএবং sudo), এমনকি প্রয়োজন হয় না।
ইজকাটা

5

এটি হ'ল উত্তরযোগ্যটির জন্য ব্যবহৃত হয়। কোনও এজেন্ট নেই, আপনাকে কেবল একটি পাঠ্য ফাইল তৈরি করতে হবে যার নাম রয়েছে:

/etc/ansible/hosts

এমন কিছু সামগ্রী দেখায় যা দেখে মনে হয়:

[webhosts]
web[1-8]

এটি নির্দিষ্ট করবে যে "ওয়েব 1, ওয়েব 2 ... ওয়েব 8" মেশিনগুলি "ওয়েবহোস্ট" গ্রুপে রয়েছে। তারপরে আপনি এই জাতীয় জিনিসগুলি করতে পারেন:

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

সুডো ব্যবহার করে আপনার সমস্ত মেশিনে অ্যাপাচি 2 পরিষেবা পুনরায় চালু করতে।

আপনি ফ্লাই কমান্ডগুলিতে যেমন করতে পারেন:

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
অন্যান্য সমস্ত উত্তর একটি বাশ স্ক্রিপ্ট জড়িত, কিন্তু তিনি বিশেষত যা চেয়েছিলেন তা নয়। তিনি কেবল রিমোট মেশিনগুলিতে কনফিগারেশনের দিকে ধাক্কা দিয়েছিলেন। তবে স্ক্রিপ্ট মডিউলটি সম্পর্কে ভাল উল্লেখ :)
সিউমাস্যাক

এই উত্তরটি দয়া করে ভোট দিন! এই এটা করতে উপায়!
মেয়ে

@ptman আমি কেবল লক্ষ্য করেছি যে তিনি যখন প্রশ্নের মধ্যে একটি স্ক্রিপ্ট উল্লেখ করেননি, তিনি শিরোনামে করেন! দুঃখিত। আমি আপডেট করেছি।
seumasmac

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:

আপনার ব্যাচের স্ক্রিপ্টটি তুলনামূলক জটিল হলে, ব্যাচ স্ক্রিপ্টটি ব্যবহার করা ভাল যা প্লিংক কমান্ডকে আবৃত করে সেইসাথে এখানে @ মার্টিন 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
আমি স্ক্রিপ্টটি আপলোড করতে চাই না তার কারণ এটি পরিচালনা করতে হবে না এবং আপনার উল্লিখিত ঝুঁকিগুলিও থাকতে হবে। এছাড়াও, এটি আমার কাছে মনে হচ্ছে এটি আপলোড, প্রক্রিয়াজাতকরণ এবং (allyচ্ছিকভাবে) মোছার মাল্টি-স্টেপ প্রক্রিয়াটির চেয়ে সহজ।
tremoloqui

0

একটি উপায় যে এটা প্রতিটি কমান্ড ইতিমধ্যে স্ক্রিপ্ট লেখা হয় SSH এবং একটি হোস্টনাম / IP বা এই ধরনের একটি তালিকা সহ পূর্বে সমাধান একটি আর্গুমেন্ট হিসাবে স্ক্রিপ্ট প্রেরণ করা হয় (অভিমানী আপনি passwordless / SSH-এজেন্ট কী প্রমাণীকরণ সেট আপ)। দূরবর্তী কমান্ডগুলি থেকে সঠিকভাবে ত্রুটি / কোডগুলি ফিরিয়ে দেওয়ার জন্য কিছু কাজের প্রয়োজন হতে পারে ....


0

যদি স্ক্রিপ্টটি খুব বড় না হয় এবং আপনি বাশ বা কেএসএস ব্যবহার করছেন ...

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

স্টিডিন এবং স্টডআউট উভয়ই সঠিকভাবে কাজ করে তবে স্ক্রিপ্টটি আর্গুমেন্টের আকারে (সাধারণত প্রায় 100 কে) সীমাবদ্ধ) স্ক্রিপ্টের যুক্তিগুলি লাইনের শেষে সম্ভবত কোনও অতিরিক্ত "-" যুক্তি অনুসরণ করে কাজ করতে পারে। একটি পাইটি বরাদ্দ করার জন্য "-t" alচ্ছিক।

সাবধানতা: এটি ব্যাশ-সমাপ্তিকে বিভ্রান্ত করে, ট্যাবে আঘাত করবেন না।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.