এসএসএইচ সেশনের অভ্যন্তরে কোনও এসএসএইচ চলাকালীন একাধিক কমান্ড


10

আমার কাছে একটি স্থানীয় মেশিন রয়েছে যা একটি রিমোট masterমেশিনে একটি এসএসএইচ অধিবেশন তৈরি করার কথা রয়েছে এবং তারপরে masterকিছু থেকে দূরবর্তী প্রতিটি থেকে অন্য অভ্যন্তরীণ এসএসএইচ অধিবেশন তৈরি করার কথা রয়েছে slavesএবং তারপরে 2 টি কমান্ড কার্যকর করে একটি নির্দিষ্ট ডিরেক্টরি মুছে ফেলা এবং এটি পুনরায় তৈরি করতে।

নোট করুন যে লোকাল মেশিনটির মাস্টারের কাছে পাসওয়ার্ডহীন এসএসএইচ রয়েছে এবং দাসদের কাছে মাস্টের পাসওয়ার্ডহীন এসএসএইচ রয়েছে। এছাড়াও সমস্ত হোস্টনাম .ssh/configস্থানীয় / মাস্টার মেশিনে পরিচিত এবং দাসদের হোস্ট-নেম slaves.txtস্থানীয়ভাবে রয়েছে এবং আমি সেখান থেকে সেগুলি পড়ি।

সুতরাং আমি যা করি এবং কাজ করে তা হ'ল:

username="ubuntu"
masterHostname="myMaster"
while read line
do

    #Remove previous folders and create new ones.
    ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition""
    ssh -n $username@$masterHostname "ssh -t -t $username@$line "mkdir -p EC2_WORKSPACE/$project Input Output Partition""


    #Update changed files...
    ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""

done < slaves.txt 

এই গুচ্ছটিটি আমাজন ইসি 2 এ রয়েছে এবং আমি লক্ষ্য করেছি যে প্রতিটি পুনরাবৃত্তিতে 6 টি এসএসএইচ সেশন তৈরি করা হয়েছে যা একটি উল্লেখযোগ্য বিলম্বকে প্ররোচিত করে। কম এসএসএইচ সংযোগ পেতে আমি এই 3 টি কমান্ডকে 1 এ একত্রিত করতে চাই। সুতরাং আমি প্রথম 2 কমান্ড একত্রিত করার চেষ্টা করেছি

ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""

তবে এটি প্রত্যাশার মতো কাজ করে না। দেখে মনে হচ্ছে এটি প্রথমটি কার্যকর করে ( rm -rf Input Output Partition) এবং তারপরে সেশনটি থেকে বেরিয়ে যায় এবং চলছে। আমি কি করতে পারি?


3
কমান্ডে এ জাতীয় নির্দেশের পরিবর্তে আপনি -Jএমন বিকল্প ব্যবহার করতে পারেন যা আপনার জাম্প হোস্টকে সংজ্ঞায়িত করবে।
হাউলেথ

উত্তর:


15

&&এটি একটি লজিকাল অপারেটর বিবেচনা করুন । এর অর্থ এই নয় যে "এই কমান্ডটিও চালান" এর অর্থ "অন্য কমান্ড সফল হলে এই কমান্ডটি চালান"।

এর অর্থ যদি rmকমান্ডটি ব্যর্থ হয় (যা ঘটবে যদি তিনটি ডিরেক্টরিতে কোনও উপস্থিত না থাকে) তবে mkdirকার্যকর হবে না। এটি আপনার পছন্দ মতো আচরণের মতো শোনাচ্ছে না; ডিরেক্টরি যদি বিদ্যমান না থাকে তবে এগুলি তৈরি করা সম্ভবত ঠিক fine

ব্যবহার ;

সেমিকোলন ;পৃথক কমান্ড ব্যবহার করতে ব্যবহৃত হয়। কমান্ডগুলি পরের দিকে চালিয়ে যাওয়ার আগে প্রতিটিটির জন্য অপেক্ষা করে পর্যায়ক্রমে চালানো হয় তবে তাদের সাফল্য বা ব্যর্থতা একে অপরের উপর কোনও প্রভাব ফেলেনি।

অভ্যন্তরীণ উদ্ধৃতিগুলি এড়িয়ে চলুন

অন্যান্য উদ্ধৃতিগুলির মধ্যে উদ্ধৃতিগুলি রক্ষা করা উচিত, অন্যথায় আপনি একটি অতিরিক্ত শেষ পয়েন্ট এবং সূচনা পয়েন্ট তৈরি করছেন। আপনার আদেশ:

ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input Output Partition""

হয়ে:

ssh -n $username@$masterHostname "ssh -t -t $username@$line \"rm -rf Input Output Partition && mkdir -p EC2_WORKSPACE/$project Input OutputPartition\""

আপনার বর্তমান কমান্ড, পলায়নের উদ্ধৃতিগুলির অভাবে কার্যকর করা উচিত:

ssh -n $username@$masterHostname "ssh -t -t $username@$line "rm -rf Input Output Partition

যদি এটি সফল হয়:

mkdir -p EC2_WORKSPACE/$project Input Output Partition"" # runs on your local machine

আপনি লক্ষ করবেন যে সিনট্যাক্স হাইলাইট করার ফলে পুরো কমান্ডটি এখানে লাল হিসাবে দেখাবে যার অর্থ পুরো কমান্ডটি স্ট্রিংকে ssh এ দেওয়া হচ্ছে। আপনার স্থানীয় মেশিন পরীক্ষা করুন; আপনার ডিরেক্টরি থাকতে পারে Input Outputএবং Partitionআপনি এটি কোথায় চালাচ্ছিলেন।


আমি আপনার বিষয় বুঝতে। একটি অংশ আমি বিভ্রান্ত হয়ে পড়েছিলাম সেমিকোলন, যেহেতু আমি ভেবেছিলাম এটি একই সাথে এটি 1 টিরও বেশি কমান্ড কার্যকর করবে যে কারণে আমি এটি ব্যবহার করি নি।
মিগ্রাস

সেমিকোলন কমান্ড একই সময়ে চালানো দেখতে পারবে না এখানে কমান্ড নির্বাহ করা একটি রেফারেন্স হিসাবে। &কারণ কমান্ড int- এ তিনি পটভূমি, যার মানে তারা পরবর্তী সম্মুখের সরানোর আগে ফিনিস ঢুকে করা অভ্যস্ত চালানোর জন্য।
সেন্টিমানে

10

আপনি সর্বদা ওপেনএসএসএইচে আপনার জাম্পবক্স মাল্টিপ্লেক্সিং-এ সংজ্ঞায়িত করতে পারেন

একাধিক সংকেত একক লাইন বা সংযোগের মাধ্যমে একাধিক সংকেত প্রেরণ করার ক্ষমতা হ'ল মাল্টিপ্লেক্সিং। মাল্টিপ্লেক্সিংয়ের মাধ্যমে ওপেনএসএইচ প্রতিবার একটি নতুন তৈরি করার পরিবর্তে একাধিক সমবর্তী এসএসএইচ সেশনের জন্য বিদ্যমান টিসিপি সংযোগটি পুনরায় ব্যবহার করতে পারে।

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

তার জন্য এটি করুন /etc/ssh/ssh_config:

ControlMaster auto
ControlPath ~/.ssh/controlmasters/ssh_mux_%h_%p_%r
ControlPersist 30m

এইভাবে, নিম্নলিখিত সার্ভারের সাথে নিম্নলিখিত 30 মিনিটের মধ্যে পরপর সংযোগগুলি পূর্ববর্তী এসএসএস সংযোগটি পুনরায় ব্যবহার করে সম্পন্ন হবে।

আপনি এটি একটি মেশিন বা মেশিনের গ্রুপের জন্যও সংজ্ঞায়িত করতে পারেন। প্রদত্ত লিঙ্কটি থেকে নেওয়া।

Host machine1
    HostName machine1.example.org
    ControlPath ~/.ssh/controlmasters/%r@%h:%p
    ControlMaster auto
    ControlPersist 10m

এটা আকর্ষণীয়! প্রদত্ত সংযোগের জন্য কি এটিকে স্পষ্টভাবে চালু এবং বন্ধ করার কোনও উপায় আছে? এই এক ব্যবহারের ক্ষেত্রে সমস্ত এসএসএইচ সংযোগকে তীব্রভাবে পরিবর্তন করতে ওভারকিলের মতো মনে হচ্ছে change এটি আরও নিখুঁতভাবে ব্যবহার করা যেতে পারে? শুধুমাত্র একটি নির্দিষ্ট সংযোগ মাল্টিপ্লেক্সিং শুরু করতে?
সেন্টিমানে

@ সেন্টিমান হ্যাঁ, উত্তরটি আপডেট করেছেন
রুই এফ রিবেইরো

1
আমি বিশ্বব্যাপী পঠনযোগ্য লেখার চেয়ে সকেটটি ব্যবহারকারীর বাড়িতে রাখার পরামর্শ দেব /tmp/
হিমাইল

@ হেইমাইল ভাল পয়েন্ট আমি যখন কম্পিউটারে থাকি তখন এটি সম্পাদনা করব।
রুই এফ রিবেইরো

@RuiFRibeiro এছাড়াও, দেখে মনে হচ্ছে অনুযায়ী man ssh, ControlPath, ControlMasterএবং ControlPersistবৈধ বিকল্প পাস হয় sshব্যবহার করে কমান্ড -o। এমনকি আরও সুনির্দিষ্ট ব্যবহারের ক্ষেত্রে হতে পারে, sshস্ক্রিপ্টের প্রথমটিতে মাল্টিপ্লেক্সিং সেট আপ করে অন্যদের জন্য এটি পুনরায় ব্যবহার করতে পারে তবে অন্যথায় পারফরম্যান্সের শাস্তি এড়াতে পারে avoid আমি অবাক হয়েছি যে 3 এসএসএইচ সংযোগের জন্য মাল্টিপ্লেক্সিং ভিএসের মানদণ্ড কী তা নয়, "নতুন সংযোগ খোলার সময় উল্লেখযোগ্য
বিলম্বও হয়

4

আপনি আপনার সমস্ত আদেশকে আপনার "মাস্টার" সার্ভারে একটি পৃথক স্ক্রিপ্টে রাখতে পারেন।

মাস্টার স্ক্রিপ্ট

#!/bin/bash
rm -rf "Input Output Partition"
mkdir -p "EC2_WORKSPACE/$project Input Output Partition"

তারপরে আপনার এসএসএস স্ক্রিপ্টে এটিকে এভাবে কল করুন: এসএসএইচ স্ক্রিপ্ট

username="ubuntu"
masterHostname="myMaster"
while read line
do
ssh -n $username@$masterHostname "ssh -t -t $username@$line < /path/to/masterscript.sh"
ssh -n $username@$masterHostname "ssh -t -t $username@$line "rsync --delete -avzh /EC2_NFS/$project/* EC2_WORKSPACE/$project""
done < slaves.txt 

বা যদি সমস্ত ফাইল প্রাথমিক মেশিনে থাকা থাকে তবে আপনি এরকম কিছু করতে পারেন:

script1

script2="/path/to/script2"
username="ubuntu"
while read line; do
cat $script2 | ssh -t -t $username@line
done < slaves.txt

script2

#!/bin/bash
rm -rf "Input Output Partition"
mkdir -p "EC2_WORKSPACE/$project Input Output Partition"
rsync --delete -avzh "/EC2_NFS/$project/* EC2_WORKSPACE/$project"

ssh স্ক্রিপ্ট

script1="/path/to/script1"
username="ubuntu"
masterHostname="myMaster"
cat $script1 | ssh -n $username@$masterHostname

1

কিছু সময় আগে, আমি নিয়ন্ত্রণ সকেট ব্যবহার করতে মত অন্যান্য উত্তর সুপারিশ করি (এই উত্তরটি মূলত মত নিয়ন্ত্রণ সকেট ব্যবহারের সংমিশ্রণ অনুষ্ঠানে ছিল এই উত্তরটি মত স্ক্রিপ্ট এই উত্তর )।

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

#! /bin/bash -xe
. "${CONFIG_DIR}/scripts/setup-ssh.sh"

# Build and test
export TEST_LABEL="${_started_by}-${BUILD_TAG%-BUILD*}"
#...
xargs --arg-file test-list \
    --no-run-if-empty \
    --process-slot-var=NUM \
    --max-procs=${#SERVERS[@]} \
    --max-args="${BATCH_SIZE:-20}" \
    "${CONFIG_DIR}/scripts/run-test.sh"

কোথায় setup-ssh.sh:

export SSH_CONFIG="${CONFIG_DIR}/scripts/.ssh-config"
mapfile -t SERVERS < "${CONFIG_DIR}/scripts/hosts"

for SERVER in "${SERVERS[@]}"
do
    while ! ssh -F "${SSH_CONFIG}" "${SERVER}" -fnN; do sleep 1; done
    scp -F "${SSH_CONFIG}" "${CONFIG_DIR}/scripts/ssh-script.sh" "${SERVER}":"${TEST_LABEL}.sh"
done

এবং .ssh-config:

Host test-*
  User test
  StrictHostKeyChecking no
  ControlMaster auto
  ControlPath /tmp/ssh-%h-%p-%r

এবং run-test.sh:

mapfile -t TEST_SERVERS < "${CONFIG_DIR}/scripts/hosts"
ssh -F "${SSH_CONFIG}" "${TEST_SERVERS[$NUM]}" "./${TEST_LABEL}.sh"

ক্রমটি এরকম হয়:

  • মূল স্ক্রিপ্ট (প্রথম দেখানো) উত্স setup-ssh.sh
  • setup-ssh.shসার্ভারগুলিতে ব্যস্ত-লুপ হয় যতক্ষণ না তাদের সকলের কন্ট্রোল সকেট সেটআপ থাকে। hostsফাইল কেবল প্রতি লাইনে সার্ভার হোস্ট-নেম এক তালিকাবদ্ধ করে।
  • যেহেতু কন্ট্রোল সকেট নির্দিষ্ট করে কনফিগারেশনটি কেবলমাত্র এতে রয়েছে ${CONFIG_DIR}/scripts/.ssh-config, যতক্ষণ না আমি এই ফাইলটি ব্যবহার করে নির্দিষ্ট করি -F, এসএসএইচ সংযোগগুলি এটি ব্যবহার করবে না। সুতরাং এটি আমাকে কন্ট্রোল সকেটটি কেবলমাত্র সেখানেই অপশনটি ব্যবহার করে আমার ব্যবহার করার অনুমতি দেয় F
  • সেটআপ স্ক্রিপ্টটি সার্ভারে টেস্ট এক্সিকিউশন স্ক্রিপ্ট অনুলিপি করে। এক্সিকিউশন স্ক্রিপ্ট নিজেই একগুচ্ছ কমান্ড ধারণ করে এবং আমি এক্সিকিউশন স্ক্রিপ্টটি অনুলিপি করায় এসএসএইচ-এর উদ্ধৃতি দেওয়ার অতিরিক্ত স্তর সম্পর্কে (এবং কখন কী প্রসারিত হবে তা নির্ধারণ করার জন্য অতিরিক্ত জ্ঞানীয় ওভারহেড) নিয়ে আমাকে চিন্তা করতে হবে না।
  • তারপরে মূল স্ক্রিপ্টটি xargsসার্ভারগুলিতে কাজের চাপ বিতরণ করতে ব্যবহার করে চালানো শেষ হওয়ার সাথে সাথে নতুন কাজ শুরু করে।
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.