দূরবর্তী কমান্ডগুলি প্রয়োগ করুন, সম্পূর্ণরূপে ssh সংযোগ থেকে বিচ্ছিন্ন


48

আমার 2 টি কম্পিউটার রয়েছে, localpcএবং remoteserver

আমার localpcকিছু কমান্ড চালানো দরকার remoteserver। এটির জন্য প্রয়োজনীয় একটি জিনিস ব্যাকআপ স্ক্রিপ্ট শুরু করা যা বেশ কয়েক ঘন্টা চলে। আমি কমান্ডটি localpc"ফায়ার" করতে চাই এবং তারপরে সম্পূর্ণ স্বাধীনভাবে চালিত হতে remoteserverচাই, যেমনটি localpcআগে কখনও ছিল না।

আমি এ পর্যন্ত এটিই করেছি:

remoteserver স্ক্রিপ্ট রয়েছে:

/root/backup.sh

localpc এটি চালানোর সময় নির্ধারিত:

ssh root@remoteserver 'nohup /root/backup.sh' &

আমি কি এটি সঠিক উপায়ে করছি? এই কাজ করতে একটি ভাল উপায় আছে কি? আমি কি এইভাবে এটি করতে কোনও সমস্যায় পড়ব?


স্ট্যাকওভারফ্লো / সেকশনস / ১৯৯৯60০৯৯ / and এবং স্ট্যাকওভারফ্লো / প্রশ্নগুলি / ২৯১৪২/২.. স্ক্রিন / টিএমউक्स ইত্যাদি ব্যবহার না করার জন্য এই সমস্যার জন্য বেশ কয়েকটি দরকারী পন্থা সরবরাহ করে ...
পল

উত্তর:


47

screenসত্যিকারের বিচ্ছিন্ন কমান্ডটি পেতে আপনার সম্ভবত রিমোট হোস্টে ব্যবহার করা উচিত :

ssh root@remoteserver screen -d -m ./script

আমি এই ধারনাটি পছন্দ করি. স্ক্রিপ্টটি শেষ হয়ে গেলে, স্ক্রিনটি তখনও চলতে থাকবে ... এবং পরের বার যখন আমি এটি চালাতে চাইছিলাম তখন কোনওভাবেই এটির সাথে আবার সংযোগ স্থাপন করব, তাই না?
LVLAaron

@ অ্যারোনজেএন্ডারসন: না, প্রদত্ত কমান্ডটি শেল নয়, যখন এটি বন্ধ হয়ে যায় তখন স্ক্রিন সেশনটি সমাপ্ত হয়।
এনজোটিব

52

বন্ধ, কিন্তু ঠিক না।

স্বাধীনভাবে যে কোনও টার্মিনালের

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

Ssh সকেটের সাথে সংযুক্ত সমস্ত ফাইল বর্ণনাকারী আপনার বন্ধ করতে হবে, কারণ কিছু দূরবর্তী প্রক্রিয়াটিতে সকেট খোলা থাকলে ssh সেশনটি বন্ধ হবে না। আপনি যদি স্ক্রিপ্টের আউটপুটটিতে আগ্রহী না হন (সম্ভবতঃ কারণ স্ক্রিপ্ট নিজেই কোনও লগ ফাইলে লেখার যত্ন নেয়) /dev/nullতবে এটিকে পুনর্নির্দেশ করুন (তবে নোট করুন যে এটি স্ক্রিপ্টটি আরম্ভ করতে না পারার মতো ত্রুটিগুলি আড়াল করবে)।

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

টার্মিনাল থেকে আলাদা করা হচ্ছে

 aaron@localpc$ ssh root@remoteserver
 root@remoteserver# nohup /root/backup.sh </dev/null &
 nohup: appending output to `nohup.out'
 [1] 12345
 root@remoteserver# exit
 aaron@localpc$ 

nohupস্ক্রিনটিকে নিয়ন্ত্রণকারী টার্মিনাল থেকে আলাদা করতে ব্যবহার করুন যাতে টার্মিনাল অদৃশ্য হয়ে গেলে এটি কোনও SIGHUP গ্রহণ না করে । nohupস্ক্রিপ্টের স্ট্যান্ডার্ড আউটপুট এবং স্ট্যান্ডার্ড ত্রুটি কোনও ফাইলকে ডায়াল করে যা nohup.outযদি তারা টার্মিনালের সাথে সংযুক্ত থাকে; আপনাকে নিজেরাই স্ট্যান্ডার্ড ইনপুটটির যত্ন নিতে হবে।

রিমোট টার্মিনাল রাখা

আপনি যদি কমান্ডটি একটি দূরবর্তী টার্মিনালে চলমান রাখতে চান তবে এটি এসএসএইচ সেশনের সাথে সংযুক্ত না থাকে, এটি স্ক্রিন বা টিমাক্সের মতো টার্মিনাল মাল্টিপ্লেজারে চালান

ssh root@remoteserver 'screen -S backup -d -m /root/backup.sh'

আপনি পরে সেই টার্মিনালে পুনরায় সংযোগ করতে পারেন যেখানে screen -S backup -rdসেই মেশিনে রুট হিসাবে অনুরোধ করে স্ক্রিপ্টটি চলছে ।

একটি রিমোট কমান্ড স্বয়ংক্রিয় করা হচ্ছে

কিছুটা ভাল সুরক্ষার জন্য, সরাসরি দূরবর্তী রুট লগইনগুলি খুব বেশি খোলা না। একটি বিশেষ উদ্দেশ্যে কী তৈরি করুন এবং এটিকে একটি বাধ্যতামূলক কমান্ড দিন /root/.ssh/authorized_keys। সর্বজনীন কী ফাইলের সামগ্রীগুলি AAAA…== wibble@example.com; কমা-বিচ্ছিন্ন বিকল্পগুলির তালিকা যুক্ত করুন command="…"যা উল্লেখ করে যে কীটি কেবলমাত্র এই নির্দিষ্ট কমান্ডটি কার্যকর করতে ব্যবহৃত হতে পারে। বিকল্পগুলি এবং কীগুলি এক লাইনে রাখার বিষয়ে নিশ্চিত হন।

command="/root/backup.sh </dev/null >/dev/null 2>/dev/null &",no-port-forwarding,no-agent-forwarding,no-x11-forwarding,no-pty,no-user-rc AAAA…== wibble@example.com

আপনার তালিকাভুক্ত প্রথম আদেশটি চেষ্টা করেছি tried কমান্ডটি কার্যকর করে এমন বাক্সে এটি পটভূমি নয়। কার্সারটি কেবল সেখানে বসে সমাপ্তির জন্য অপেক্ষা করে ... সম্ভবত এটি কোনও বাগ?
LVLAaron

রিমোট সিস্টেমে আপনাকে স্টিডিনকে / dev / নাল থেকে পুনঃনির্দেশ করতে হবে। এই কারণেই ssh প্রস্থান করছে না।
কিথবি

আমি -fস্থানীয় পক্ষের 'ব্যাকগ্রাউন্ড' (যেমন সমাপ্ত, সংযোগগুলি বন্ধ) এর জন্য এসএসএস পাওয়ার বিকল্পটি যুক্ত করব । এটি এর সাথে মিলে কাজ করবে &nohupএই ক্ষেত্রে isচ্ছিক, কিন্তু আপনি setsidপরিবর্তে ব্যবহার বিবেচনা করতে পারেন ।
অ্যালেক্সিয়াস

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

1
@ এরিকবওয়ার্ক দয়া করে মনে রাখবেন যে এই বিষয়গুলি সম্পর্কে আমার কোনও ধারণা নেই, তবে আলোচনা এবং মন্তব্যগুলি অনুসরণ করে: গিলস তার কমান্ডগুলিতে -t বিকল্পটি ব্যবহার করেন না, তাই ক্লায়েন্ট বা সার্ভারে কোনও ছদ্ম টার্মিনাল প্রতিষ্ঠিত হবে না neither পাশ। অতএব, কোনও এইচইপি প্রেরণ করা হবে না।
বিনারাস

12

এসএসএচের মতো রিমোট লগইন থেকে রিমোট কমান্ড চালানোর জন্য স্ট্যান্ডার্ড রেসিপিটি নিম্নলিখিত:

nohup command </dev/null >command.log 2>&1 &

যদি commandকোনও শেল স্ক্রিপ্ট হয় যা নিজেই কোনও ফাইলটিতে লগিংয়ের যত্ন নেয় তবে আপনি এতে পরিবর্তন command.logকরতে পারেন /dev/null। আপনি এটি শুরু করার পরে, এখনই লগ অফ করুন।

আপনার এই লাইনে সমস্ত কিছুই দরকার।

nohup লগইন সেশনটি সংযোগ বিচ্ছিন্ন হলে শেলটি প্রক্রিয়াটি বিরক্ত না করতে বলে tells

</dev/null এটি কখনও ইনপুট জন্য অপেক্ষা না করতে বলে

>command.log এই নামের লগ ফাইলে কোনও বার্তা প্রেরণ করতে বলে

2>&1এটি একই লগ ফাইলে যে কোনও স্ট্যাডার বার্তা প্রেরণ করতে বলে। কিছু ক্ষেত্রে দুটি ফাইল থাকা ভাল, দ্বিতীয়টি ত্রুটির বার্তা সংগ্রহ করা এবং প্রথমটি সাধারণ ক্রিয়াকলাপের বার্তা সংগ্রহ করা। যা সবকিছু সঠিকভাবে কাজ করেছে তা যাচাই করা আরও সহজ করে তুলতে পারে।

& এটিকে এই প্রক্রিয়াটি আলাদা করতে এবং ডেমন প্রক্রিয়া হিসাবে পটভূমিতে চালাতে বলে।


10

এই থ্রেডটি খুব সহায়ক ছিল তবে আমার সমাধানটি কিছুটা আলাদা হতে হয়েছিল।

আমি পর্দার সমাধানটি পছন্দ করি না কারণ এটি এমন স্ক্রিন প্রক্রিয়া চালিয়ে যায় যা আমার প্রয়োজন হয় না। পুনঃনির্দেশগুলি এবং নোহুপগুলি এর মতো ব্যবহৃত:

ssh root@remoteserver '/root/backup.sh </dev/null >/var/log/root-backup.log 2>&1 &'

ssh কমান্ডটি ব্যবহার করার সময় আমার পক্ষে কাজ করছিল না।

আমি রিমোট মেশিনে একটি মোড়ক স্ক্রিপ্ট তৈরি করেছি যা আসল স্ক্রিপ্টটি চালায়। মোড়ক স্ক্রিপ্ট পুনর্নির্দেশ এবং nohup সেট করে। এটার মতো কিছু:

backupwrapper.sh:
nohup backup.sh > /dev/null 2>&1 &

তারপরে আমার ক্লায়েন্ট মেশিনে আমি চালাচ্ছি (কোনও পুনঃনির্দেশ লক্ষ্য করুন):

# ssh remotemachine "backupwrapper.sh"
#

Ssh কমান্ড তত্ক্ষণাত্ ফিরে আসে, সংযোগটি বন্ধ হয়ে যায় এবং স্ক্রিপ্টটি চলমান থাকে।


6

নিলস যেমন বলেছেন , এসএসএসের মাধ্যমে রুটটিকে লগ ইন করতে দেওয়া একটি সুরক্ষা ঝুঁকি। এবং আমি লগ ছাড়া কোনও মেশিনে কোনও উল্লেখযোগ্য কাজ চালানোর বিরুদ্ধে পরামর্শ দিই। যদি কিছু ভুল হয়ে যায়, আপনি ইচ্ছে করে আপনার কিছু সমস্যা সমাধানের বার্তা পেয়েছেন। এটি করতে কীভাবে আপনাকে দেখায় সেখানে অন্যান্য উত্তর রয়েছে। আপনি এখানে যা চেয়েছিলেন ঠিক তেমন করার জন্য আমি কীভাবে পরামর্শ দিচ্ছি তা এখানে here এটি সব শ (1) দিয়ে তৈরি। জিএনইউ স্ক্রিনের প্রয়োজন নেই (যদিও আমি মনে করি এটি একটি চতুর সমাধান)। আপনার কমান্ড এই স্ট্রিং সংযোজন করুন: >&- 2>&- <&- &>&-মানে ক্লোজড স্টডআউট। 2>&-মানে ক্লোজ স্টাডার <&-মানে নিকট &অর্থ ব্যাকগ্রাউন্ডে চালানো, যেমন

$ ssh myhost 'sleep 30 >&- 2>&- <&- &'
# ssh returns right away, and your sleep job is running remotely
$

0

আপনার রিমোট কমান্ডটি ব্যাকগ্রাউন্ড করা উচিত remoteserver। আপনি যেভাবে এটি করবেন সেটি এসএস-কমান্ডের পটভূমি localpc

তা ছাড়া রুট-এসএসএসের অনুমতি দেওয়া বাজে ধারণা।

সুতরাং সেটআপ চালু করুন remoteserver: একটি sudoers লাইন যা /root/backup.shব্যবহারকারী দ্বারা রুট হিসাবে চলবে backup

আপনি "ভাল" পাসওয়ার্ড ছাড়াই সেই ব্যবহারকারী তৈরি করতে পারেন।

কমান্ড sudo /root/backup.sh &হিসাবে কমান্ডটি রাখুন ~backup/.ssh/authorized_keys- একসাথে সর্বজনীন কী localpc(যে কেউ এই স্ক্রিপ্টটি ট্রিগার করে) এর সাথে।


-1
#screen -d -m -S BACKUP ssh root@remoteserver /root/backup.sh

2
এটি খুব কার্যকর নয়: যদি এসএসএইচ সংযোগটি মারা যায় তবে স্ক্রিপ্টের স্টাডআউট এবং স্ট্ডার বন্ধ হয়ে যাবে, যা সমস্যার কারণ হতে পারে। পর্দা দূরবর্তী মেশিনে চলতে হবে ( এনজোটিবের উত্তরে ) as
গিলস 'অশুভ হওয়া বন্ধ করুন'
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.