অনেক সার্ভারে স্বয়ংক্রিয়ভাবে এসএসএইচ-র কমান্ডগুলি চালান


46

টেক্সট ফাইলে আইপি ঠিকানার একটি তালিকা রয়েছে, প্রাক্তন:

1.1.1.1
2.2.2.2
3.3.3.3

প্রত্যেক IP ঠিকানা বিহাইন্ড একটি সার্ভার আছে, এবং প্রতি সার্ভারে একটা sshd কমান্ড না যে সার্ভার রয়েছে বন্দর 22. চলছে known_hosts(আমার পিসি, উবুন্টু 10.04 LTS / ব্যাশ দিকে) তালিকা।

আমি কীভাবে এই সার্ভারগুলিতে কমান্ড চালাতে পারি এবং আউটপুট সংগ্রহ করতে পারি?

আদর্শভাবে, আমি সমস্ত সার্ভারের সমান্তরালভাবে কমান্ডগুলি চালাতে চাই।

আমি সমস্ত সার্ভারে সর্বজনীন কী প্রমাণীকরণ ব্যবহার করব।

এখানে কিছু সম্ভাব্য সমস্যাগুলি রয়েছে:

  • Ssh আমাকে আমার known_hostsফাইলটিতে প্রদত্ত সার্ভারগুলি ssh কী রাখার অনুরোধ জানায় sh
  • প্রদত্ত কমান্ডগুলি একটি ননজারো প্রস্থান কোডটি ফিরিয়ে আনতে পারে, এটি নির্দেশ করে যে আউটপুটটি সম্ভাব্য অবৈধ। আমি এটা চিনতে হবে।
  • কোনও সংযোগ কোনও প্রদত্ত সার্ভারে প্রতিষ্ঠিত হতে ব্যর্থ হতে পারে, উদাহরণস্বরূপ কোনও নেটওয়ার্ক ত্রুটির কারণে।
  • একটি সময়সীমা থাকা উচিত, কমান্ডটি প্রত্যাশার চেয়ে বেশি সময় চলতে থাকলে বা কমান্ডটি চালনার সময় সার্ভারটি ডাউন হয়ে যায়।

সার্ভারগুলি হল এআইএক্স / কেএসএইচ (তবে আমি মনে করি এটি আসলে আসেনি।



1
আমি মনে করি এটি নকল নয়, কারণ আপনি যে লিঙ্কটি উল্লেখ করেছেন তাতে এমনকি এসএসএইচ নেই।
ল্যান্সবায়েন্স

4
যদি আপনি এটি না করে থাকেন, আপনার সমস্ত মেশিনে এসএস সার্ভার সেট আপ করা উচিত, আপনি যে মেশিনটি থেকে কাজ করছেন তার একটি ব্যক্তিগত / সর্বজনীন কী জুড়ি তৈরি করুন এবং আরও পাসওয়ার্ড ঝামেলা রোধ করতে সার্ভারের অ্যাকাউন্টগুলিতে পাবলিক কীটি অনুলিপি করতে হবে। এটি আমার উত্তর এবং @ বিমূর্তের জন্যও প্রযোজ্য।
অ্যান্থন

উত্তর:


14

ধরে নিই যে আপনি পিএসএসএস বা অন্যদের ইনস্টল করতে সক্ষম নন, আপনি এর মতো কিছু করতে পারেন:

tmpdir=${TMPDIR:-/tmp}/pssh.$$
mkdir -p $tmpdir
count=0
while IFS= read -r userhost; do
    ssh -n -o BatchMode=yes ${userhost} 'uname -a' > ${tmpdir}/${userhost} 2>&1 &
    count=`expr $count + 1`
done < userhost.lst
while [ $count -gt 0 ]; do
    wait $pids
    count=`expr $count - 1`
done
echo "Output for hosts are in $tmpdir"

1
এই স্ক্রিপ্টে ঠিক কী অপেক্ষা করতে হবে ?? TY!
ল্যান্সবায়েন্স

যদি সার্ভার কী আমার জ্ঞাত_হোস্টস ফাইলে না থাকে তবে কি হবে?
ল্যান্সবায়েন্স

5
পটভূমিতে স্ক্রিপ্টগুলি রাখা শিশু প্রক্রিয়াগুলি তৈরি করে। যখন কোনও শিশু প্রক্রিয়াটি প্রস্থান করে, পিতামাতার প্রক্রিয়াটি না বের হওয়া বা পিতামাতার প্রক্রিয়া সন্তানের জন্য অপেক্ষা করতে না হওয়া পর্যন্ত প্রক্রিয়াটি 'স্লট' এবং সংস্থানগুলি সিস্টেমে থাকে। এগুলি 'এখনও উপস্থিত দ্বারা সমাপ্ত' প্রক্রিয়াগুলিকে 'জম্বি' প্রক্রিয়া বলা হয়। শিশুদের প্রক্রিয়াজাতকরণ এবং সংস্থানগুলি পুনরায় দাবি করার পরে পরিষ্কার করা ভাল আচরণ।
আর্গেজ

1
যদি না জানা থাকে, তবে এটি এটিকে ঘিরে ফেলতে পারে তবে -o StrictHostKeyChecking=noএটি এড়াতে আপনি যোগ করতে পারেন । তবে প্রথমে কমান্ড-লাইন থেকে সমস্ত সার্ভার স্ক্যান করা ভাল, যাতে হোস্ট কীগুলি যুক্ত করা যায়।
আর্গেজ

1
যেমনটি আমি উল্লেখ করেছি, ssh প্রোগ্রামটিকে পটভূমিতে রাখার পরে এবং এটি বেরিয়ে যাওয়ার পরে, সংস্থানগুলি এখনও রাখা হয়। waitকমান্ড প্রক্রিয়া 'রিটার্ন কোড (কিভাবে processs থেকে প্রস্থান) সহ সেই সম্পদ, reclaims। তারপরে যদি প্রোগ্রামটিতে পরে, আপনি অন্য প্রক্রিয়াটি রেখেছেন, একটি সংক্ষেপণ বলতে পারেন, ব্যাকগ্রাউন্ডে এবং এটির জন্য অপেক্ষা করা দরকার, তবে এই লুপটি ছাড়াই, অপেক্ষাটি সংক্ষেপিত না হয়ে একটি সম্পন্ন এসএস প্রোগ্রামগুলির পুনরায় দাবি জানাবে - যা এখনও হতে পারে চলমান হতে। আপনি ভুল শিশু প্রক্রিয়া উপর একটি রিটার্ন স্থিতি পাবেন। নিজের পরে পরিষ্কার করা ভাল।
আর্গেজ

61

এখানে বেশ কয়েকটি সরঞ্জাম রয়েছে যা আপনাকে একই সাথে একাধিক মেশিনে লগ ইন করতে এবং সিরিজ কমান্ডগুলি কার্যকর করতে দেয়। এখানে একটি দম্পতি রয়েছে:


1
আপনি তালিকায় পিডিএস যোগ করতে চাইতে পারেন ।
রিকার্ডো মুরি 13

1
আমি ক্লাস্টারশ ব্যবহার করার জন্য মোটামুটি স্বজ্ঞাত পেয়েছি। কেবল আমার 2 সেন্ট ...
জোসিনালভো

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

1
@ অ্যান্থনি ক্লার্ক আপনি এই আদেশগুলিতে "|| সত্য" এর মতো কিছু যুক্ত করতে পারেন।
এক্সিক

16

আপনি যদি স্ক্রিপ্টিংয়ের চেয়ে পাইথন স্ক্রিপ্টিং-এ বেশি হন bashতবে ফ্যাব্রিক আপনার জন্য হাতিয়ার হতে পারে।

থেকে তারেক হোম পেজে :

ফ্যাব্রিক একটি পাইথন (2.5 বা ততোধিক) গ্রন্থাগার এবং এসএসএইচ ব্যবহারের জন্য অ্যাপ্লিকেশন মোতায়েন বা সিস্টেম প্রশাসনের কাজে স্ট্রিমলাইনের জন্য কমান্ড-লাইন সরঞ্জাম।

এটি স্থানীয় বা রিমোট শেল কমান্ডগুলি কার্যকর করার জন্য (সাধারণত বা সুডোর মাধ্যমে) এবং ফাইলগুলি আপলোড / ডাউনলোড করার জন্য সহায়ক কার্যকারিতা যেমন ইনপুটটির জন্য চলমান ব্যবহারকারীকে অনুরোধ জানানো, বা মৃত্যুদন্ড কার্যকর করা বাতিল করে provides

সাধারণ ব্যবহারে এক বা একাধিক ফাংশন সমন্বিত পাইথন মডিউল তৈরি করা জড়িত থাকে, তারপরে ফাব কমান্ড-লাইন সরঞ্জামের মাধ্যমে এগুলি সম্পাদন করে।


ফ্যাব্রিক ভি 1 আশ্চর্যজনক ছিল। দুর্ভাগ্যক্রমে, ফ্যাব্রিক ভি 2 বেশিরভাগ বৈশিষ্ট্য সরিয়ে নিয়েছে যা এই ব্যবহারের ক্ষেত্রে এটি দরকারী করে - এটি বর্তমানে (জুন 2018) সুপারিশ করবে না।
মেকোহি

11

আমি তার জন্য জিএনইউ সমান্তরাল ব্যবহার করি, বিশেষত আপনি এই রেসিপিটি ব্যবহার করতে পারেন :

parallel --tag --nonall --slf your.txt command

your.txtসার্ভারের আইপি ঠিকানা / নামগুলির সাথে ফাইল হওয়ার সাথে being



অবশ্যই, আমি এটির আগেও এটি ব্যবহার করতাম sshতবে অন্য কম্পিউটারগুলিতে লগইন করার জন্য আপনার কিছু উপায় প্রয়োজন এবং সেই উপায়গুলি কম সুরক্ষিত (যেমন rsh) ব্যবহৃত হত । আপনি এখন মেশিন থেকে মেশিনে ( telnet?, rsh?) পেতে কী ব্যবহার করছেন তা বর্ণনা করেন না ।
অ্যান্থন

1
@ Eshজেশ হ্যাঁ কেবলমাত্র নিয়ামককে
অ্যান্থন

1
@ Eshজেশ দেখুন জিএনইউ সমান্তরাল ইনস্টল না করার কারণটি আপনার ওলেট্যানজ.ব্লগস্পট.ডেক
ওলে

1
@ ওলেটটাইজ ঠিক বুঝতে পেরেছেন যে আমার উত্তর% -) এ মন্তব্য করেছেন। এই দুর্দান্ত সফটওয়্যারটির জন্য ধন্যবাদ।
অ্যান্টন

8

খুব বেসিক সেটআপ:

for host in $(cat hosts.txt); do ssh "$host" "$command" >"output.$host"; done

নাম / পাসওয়ার্ড দিয়ে প্রমাণীকরণ করা আসলেই ভাল ধারণা নয়। এর জন্য আপনার একটি ব্যক্তিগত কী সেট আপ করা উচিত:

ssh-keygen && for host in $(cat hosts.txt); do ssh-copy-id $host; done

1
এটিই আমি খুঁজছিলাম !!!!! ধন্যবাদ মিচাস
eshzzesh

উপরের স্ক্রিপ্টটি আমার পক্ষে ভাল কাজ করে তবে 10 সার্ভারে কার্যকর করার পরে স্ক্রিপ্টটি সাড়া দেয় না। আমি যে ফর্মের সাথে সংযুক্ত রয়েছি সেগুলি কীভাবে লগআউট করব?
eshজ্জেশ

আপনার স্পষ্টভাবে লগআউট করার দরকার নেই। এই "স্ক্রিপ্ট" ssh $host $commandপ্রতিটি হোস্টের জন্য চলবে । কী চলছে তা জানতে ম্যানুয়ালি এই কমান্ডগুলি চালনার চেষ্টা করুন।
মিচাস

4

আমি Ansible.cc পরামর্শ দিই । এটি কনফিগারেশন ম্যানেজার এবং কমান্ড প্রেরণকারী।


2

আমি মনে করি আপনি পিএসএস এবং সাধারণ scp, rsync ইত্যাদি সম্পর্কিত সমান্তরাল সংস্করণগুলি সন্ধান করছেন ..


এটি মুছে ফেলা থেকে এক ভোট দূরে, তবে পরবর্তী উত্তরটি +10 এ। নিখুঁত ধারণা তৈরি করে
মাইকেল মরোজেক

@ মিশেলমরোজেক এটি আপনার চেনার চেয়েও খারাপ। দুটি ভিটিডি-র দ্বিতীয়টি হ'ল ক্লিক-হ্যাপি-অ্যাক্সিডেন্টে আমার। আমি এই ট্যাবটি কয়েক দিনের জন্য খোলা রেখেছিলাম flag ভোটগুলি সাফ করার জন্য আপনি এখনই এটি সরিয়ে ফেলতে পারেন।
কালেব

@ কালেব এটি ঠিক করেছেন
মাইকেল মরোজেক

2

আমি নামক একটি ওপেন সোর্স টুল নির্মিত মেঘাচ্ছন্ন জিনিস এই সাজানোর সহজ করতে।

প্রথমে আপনি আপনার সার্ভারগুলি সংজ্ঞায়িত করুন:

overcast import vm.01 --ip 1.1.1.1 --ssh-key /path/to/key
overcast import vm.02 --ip 2.2.2.2 --ssh-key /path/to/key

তারপরে আপনি এগুলির মতো একাধিক কমান্ড এবং স্ক্রিপ্ট ফাইলগুলি ক্রমানুসারে বা সমান্তরালভাবে চালাতে পারেন:

overcast run vm.* uptime "free -m" /path/to/script --parallel

2

Hypertable প্রকল্পের সম্প্রতি একটি বহু-হোস্ট SSH টুল যোগ করা হয়েছে। এই সরঞ্জামটি libssh এবং স্থাপন সংযোগ এবং বিষয় কমান্ড দিয়ে তৈরি করা হয়েছে অ্যাসিঙ্ক্রোনাস এবং সমান্তরাল ভাবে সর্বাধিক সাদৃশ্য জন্য। সম্পূর্ণ ডকুমেন্টেশনের জন্য মাল্টি-হোস্ট এসএসএইচ সরঞ্জামটি দেখুন । হোস্টের একটি সেটে একটি কমান্ড চালাতে, আপনি এটি নিম্নরূপে চালিত করবেন:

$ ht ssh 1.1.1.1,2.2.2.2,3.3.3.3 uptime

আপনি কোনও হোস্টের নাম বা আইপি প্যাটার্ন নির্দিষ্ট করতে পারেন, উদাহরণস্বরূপ:

$ ht ssh 1.1.1.[1-99] uptime
$ ht ssh host[00-99] uptime

এটি এমন একটি --random-start-delay <millis>বিকল্পকে সমর্থন করে যা 0 এবং <millis>মিলিসেকেন্ডের মধ্যে এলোমেলো সময়ের ব্যবধানের দ্বারা প্রতিটি হোস্টের কমান্ড শুরু করতে বিলম্ব করবে will কমান্ডটি চালানো যখন কোনও কেন্দ্রীয় সংস্থান অ্যাক্সেস করে তখন এই ঝাঁকুনির ঝাঁকুনির সমস্যা এড়াতে এই বিকল্পটি ব্যবহার করা যেতে পারে।


2

বেশ কয়েকটি সার্ভারে কার্য সম্পাদন করার জন্য আমি কালেক্টনোড অত্যন্ত সহজ এবং কার্যকর বিকাশ করেছি (উইন্ডোজ অন্তর্ভুক্ত)

কিভাবে কালেক্টনোড ব্যবহার করবেন:

  1. এর সাথে কাজ করার জন্য সার্ভারের তালিকা তৈরি করুন:

    # cat hosts.file
    server1
    server2
    server3
    server4
    server5
    
  2. সার্ভের তালিকাটি পাস করে কালেক্টনোড কার্যকর করুন:

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User'
    
  3. অপ্টিনালি, ফলাফলগুলি ফিল্টার করা সম্ভব, উদাহরণস্বরূপ এই কমান্ডটি কেবলমাত্র সার্ভারটি প্রদর্শন করে যেখানে শর্তটি সম্পন্ন হয়।

    collectnode --file servers.txt --command='cat /etc/httpd/conf/httpd.conf |grep ^User' --where="command contain User"
    

https://collectnode.com/5-tasks-collectnode-can-help-managing-servers/


1
দেখে মনে হচ্ছে আপনি কালেক্টনোডের বিকাশকারী। সেক্ষেত্রে আপনার উত্তরটি প্রকাশ করা উচিত বা এটি কেবল স্প্যাম।
মুড়ু

দুঃখিত, এটি আমার উদ্দেশ্য ছিল না, উত্তরটি আরও নির্দিষ্ট করে সংশোধন করা হয়েছে।
fvidalmolina

1

সত্যিই খুব সুন্দর প্রশ্নের জন্য একটি শিরোনাম:

আমি যে সেরা সমাধানটি পেয়েছি তা হ'ল চমকপ্রদ নয়, টিএমউক্স।

আপনি সিটিআরএল-বি করতে পারেন: আশ্চর্যজনক পুনঃসূচনার জন্য tmux এ সিঙ্ক্রোনাইজ-প্যানগুলি সেট করুন। এটির জন্য আপনার টিএমউসের 1 উইন্ডোর বিভিন্ন প্যানে আপনার সমস্ত এসএসএস সংযোগগুলি অবশ্যই খোলা থাকতে হবে।


0

একাধিক হোস্টে কমান্ড চালাতে এই জাতীয় কিছু কাজ করে? মনে করুন সমস্ত হোস্ট পাসওয়ার্ড-স্বল্প লগইনের জন্য .ssh / কনফিগারেশনে সেট আপ হয়েছে।

$ < hosts.txt xargs -I {} ssh {} command


0

একটি ফাইল / ইত্যাদি / এসএক্সএক্স / হোস্ট তৈরি করুন

যেমন জনবহুল:

[grp_ips]
1.1.1.1
2.2.2.2
3.3.3.3

সমস্ত মেশিনে শেয়ার করুন ssh কী।

প্যাকেজ থেকে sxx ইনস্টল করুন:

https://github.com/ericcurtin/sxx/releases

তারপরে এভাবে কমান্ড চালান:

sxx username@grp_ips "whatever bash command"

আউটপুট কোথায় লেখা হয়? শূন্য-বহির্গমন প্রস্থানগুলি কীভাবে পরিচালনা করা হয়? মন্তব্যে প্রতিক্রিয়া জানাতে দয়া করে; আপনার উত্তরটি আরও পরিষ্কার এবং আরও পরিপূর্ণ করতে সম্পাদনা করুন।
জি-ম্যান

0

প্যারামিকো http://www.paramiko.org/ এবং থ্রেড-ভিত্তিক সমান্তরালতা https://docs.python.org/3/library/threading.html ব্যবহার করুন। বিলো কোডটি প্রতিটি সার্ভারে সমান্তরালে একাধিক কমান্ড কার্যকর করতে দেয়!

ssh = paramiko.SSHClient()
ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
ssh.load_system_host_keys()
ssh.connect(hostname, port, username, password)
t = threading.Thread(target=tasks[index], args=(ssh, box_ip,))
t.start()

দ্রষ্টব্য: প্রতিটি সার্ভারের জন্য উপরের নির্দেশগুলি পুনরাবৃত্তি করুন।


0

আমি মনে করি "প্রত্যাশা" আপনার যা প্রয়োজন।
অনেকের এমনকি এটি বিদ্যমান তা জানেন না। এটি একটি টিসিএল ভিত্তিক প্রোগ্রাম যা আপনার পক্ষ থেকে প্রশ্ন এবং সম্ভাব্য উত্তর তৈরি করবে। করার জন্য একটি চেহারা আছে https://wiki.tcl-lang.org/page/Expect

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