দূরবর্তী কমান্ড নির্বাহ করার সময় "রেপার" ssh স্ক্রিপ্টটি স্থির থাকে


1

আমি ওএসএক্স মাউন্টেন লায়ন চালাচ্ছি এবং রিমোট সার্ভারটি CentOS 6. আমার স্থানীয় মেশিনে আমার বেশ কয়েকটি স্ক্রিপ্ট রয়েছে যা আমি রিমোট সার্ভারে চালাতে চাই এবং শেষ পর্যন্ত, আমি একটি স্ক্রিপ্ট লিখতে চেয়েছিলাম যা ssh এর মাধ্যমে সংযোগ করে যা একটি একটি প্যারামিটার হিসাবে চালানোর জন্য একটি দ্বিতীয় স্ক্রিপ্ট। এইভাবে, আমি ssh এবং তার সাথে সম্পর্কিত সমস্ত উদ্বেগ সম্পর্কে চিন্তা না করে স্বাভাবিকভাবেই ব্যাশ স্ক্রিপ্টগুলি লিখতে পারি এবং একই স্ক্রিপ্টগুলি আমার স্থানীয় মেশিনে পুনঃপ্রতিষ্ঠিত করতে সক্ষম হবে। এই ক্ষেত্রে,

exec_remote.sh

!#/bin/bash
ssh -t -t jeff@remoteserver 'bash -s' < $1

make_dir.sh (সুডো নোট করুন)

!#/bin/bash
sudo mkdir -p /some/path/to/a/new/location

এবং ধারণা হিসাবে চালানো হচ্ছে

./exec_remote.sh make_dir.sh

আমি অনেক সমস্যার মধ্যে চলেছি, যার মধ্যে আমি পরাভূত করতে সক্ষম হয়েছে। যাইহোক, এখন যখন আমি উপরে উল্লিখিত স্ক্রিপ্টগুলি চালাচ্ছি, টার্মিনাল বেশ কয়েক মিনিটের জন্য হ্যাং করে, রিমোট ডিরেক্টরি তৈরি হয় না এবং কোন ত্রুটি বার্তা নেই।

তাছাড়া, আমি ফোন করেছি না logout, আমি এখনও এসএসএম টার্মিনাল খোলা আছে এবং সব পরবর্তী কমান্ড (যেমন। ls ) সম্পূর্ণরূপে হিমায়িত হয়। আমি একটি যাক ls এটি ভেঙ্গে 70 মিনিটের জন্য চালানো। নোট: আমি আসলে পরে কমান্ড চলমান সম্পর্কে যত্ন না; আমি শুধু ভুল কি একটি উপসর্গ হিসাবে এই অন্তর্ভুক্ত।

আমি কিভাবে এই সংশোধন করব? অথবা ভাল এখনো, এই সমস্যা পদ্ধতির একটি ভাল উপায় আছে?

সম্পাদনা

আমি যদি আমার আপডেট make_dir.sh স্ক্রিপ্ট প্রয়োজন হয় এমন একটি ডিরেক্টরি তৈরি করতে sudo, স্ক্রিপ্ট প্রত্যাশিত হিসাবে, পুরোপুরি স্বাভাবিক executes। দূরবর্তী sudo কমান্ড চলমান সঙ্গে একটি পরিচিত সমস্যা আছে? সম্ভবত শুধু CentOS সঙ্গে?


যারা প্রকৃত স্ক্রিপ্ট হয়? !# হতে হবে #! আপনি যদি make_dir.sh এর প্রথম লাইনটি #! / Bin / bash -x থেকে পরিবর্তন করেন তবে আপনি কী দেখেন
parkydr

দুঃখিত, না। আমার স্ক্রিপ্ট যদিও খুব অনুরূপ, সঠিক আদেশ আছে #!। যোগ করা হচ্ছে -x পতাকা কোনো প্রভাব আছে বলে মনে হচ্ছে না।
Jeff

আপনি কি সুডো লাইন নামক দেখতে পাচ্ছেন?
parkydr

হ্যাঁ। সুডো লাইন বলা হয়। এটি প্রায় 5 মিনিটের জন্য ঝুলন্ত। তারপরে, কোন আউটপুট নেই এবং প্রম্পট ফেরত আসে তবে ডিরেক্টরি তৈরি করা হয়নি।
Jeff

রিমোট সিস্টেমে কিভাবে আপনি আপনার পাসওয়ার্ড প্রদান করছেন? আপনি এই এক অনুরূপ একটি কৌশল ব্যবহার করছেন? askubuntu.com/questions/155791/...
slm

উত্তর:


3

পটভূমিতে পুনঃনির্দেশিত স্ক্রিপ্টে দূরবর্তী স্ক্রিপ্টটি চালানোর চেষ্টা করুন এবং একটি লগ ফাইলে ত্রুটিপূর্ণ std। আপনার শেলটি ফিরে যাওয়ার জন্য (যেমন "স্ক্রিপ্ট চলাকালীন দীর্ঘ সময়ের জন্য লক করা না") আপনাকে নূপ ব্যবহার করতে হবে এবং সমস্ত পাইপগুলি পুনঃনির্দেশিত করতে হবে: স্টুডুট, স্টেডিন, স্টেডির। উদাহরণ স্বরূপ:

ssh jeff@remoteserver 'nohup make_dir.sh >> /tmp/log_file 2>&1 </dev/null &'

উপরোক্ত কমান্ডটি আপনাকে রিমোট সার্ভারে লগ ইন করবে এবং স্টডআউট এবং স্টডিএরআরকে / tmp / log_file এ পুনঃনির্দেশিত করার সময় ব্যাকগ্রাউন্ডে make_dir.sh চালাবে। STDIn / dev / null থেকে পুনঃনির্দেশিত হয়। অন্যথায়, স্ক্রিপ্ট সমাপ্ত না হওয়া পর্যন্ত ssh ঝুলন্ত হবে।

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


3

Ssh নির্বাহ করার আপনার উপায় একটি মৌলিক ত্রুটি রয়েছে, যা হল: আপনার কেবল একটি স্টেডিন রয়েছে। যেহেতু আপনি ব্যবহার করে স্ক্রিপ্ট পড়ছেন <, স্ট্যাডিন স্ক্রিপ্ট কন্টেন্ট দিয়ে "ভরা" হয়। এবং আপনার ইনপুট সঙ্গে মিলিত (এই ক্ষেত্রে, আপনার পাসওয়ার্ড)। যা কাজ করতে পারে না।

তাই আমি এই কাজটি দেখার জন্য একমাত্র উপায় হল: আপনাকে স্ক্রিপ্টটি দূরবর্তী সার্ভারে অনুলিপি করতে হবে এবং তারপরে একটি ssh কমান্ডটি শুরু করতে হবে যা কেবল সেই স্ক্রিপ্টটি চালায়। তাই ঐ লাইন বরাবর কিছু:

#!/bin/bash
USERHOST=jeff@remoteserver

ssh -o ControlMaster=yes -o ControlPersist=3600 -o ControlPath=/tmp/ssh-master-$USER-%r@%h:%p -Nf $USERHOST
trap "ssh -o ControlPath=/tmp/ssh-master-$USER-%r@%h:%p $USERHOST -O exit" exit

TEXEC=$(ssh $USERHOST mktemp)
scp $1 ${USERHOST}:${TEXEC}
ssh -t -t $USERHOST $TEXEC

এই স্ক্রিপ্টটি দূরবর্তী সার্ভারে একটি ভাগযোগ্য সংযোগ খোলে (তাই আপনাকে শুধুমাত্র একবারে আপনার SSH পাসওয়ার্ড প্রবেশ করতে হবে), তারপরে আপনার শেল স্ক্রিপ্টটি অনুলিপি করে এবং অবশেষে স্বাভাবিক ব্যবহার করে এটি কার্যকর করে ssh কমান্ড, এটি একটি TTY বরাদ্দ করার অনুমতি দেয়, এবং এইভাবে আপনার পাসওয়ার্ডটি প্রবেশ করতে দেয় sudo একটি (অপেক্ষাকৃত) নিরাপদ উপায়। Wrapper স্ক্রিপ্ট শেষে, শেয়ার করা সংযোগ মাধ্যমে বন্ধ করা হয় exit ফাঁদ।


2

শুধু কর

ssh -t -t jeff@remoteserver $1

কমান্ড চালানোর জন্য (এটি এক্সিকিউটেবল নিশ্চিত করুন) তারপর প্রস্থান করুন।

bash -s সঙ্গে খোলা bash অধিবেশন খোলা।

আপনি সম্ভবত $ 1 এর পরিবর্তে $ * চান তবে আপনি যে স্ক্রিপ্টটি কল করছেন তার জন্য আপনি আর্গুমেন্টগুলি পাস করতে পারেন


ধন্যবাদ parkdyr, কিন্তু যে শুধুমাত্র খোলা সেশন বাকি খোলা যা সত্যিই সমস্যা সঙ্গে আমি উদ্বিগ্ন ছিল না। আমি দীর্ঘ এক্সিকিউশন সময় এবং যে কোন ডিরেক্টরি তৈরি করা হয়েছিল সঙ্গে আরো উদ্বিগ্ন।
Jeff

0

আমি আপনি কি চান বুঝতে। দূরবর্তী মেশিনে স্থানীয় ফাইল এক্সিকিউট করুন।

দূরবর্তী bash মধ্যে একটি পাইপ মাধ্যমে আপনার স্থানীয় ফাইল বিড়াল

উদাহরণস্বরূপ পরীক্ষা

$ echo "ls -l" | ssh jeff@remoteserver "bash " 

স্ক্রিপ্টে

cat $1 | ssh jeff@remoteserver "bash "

1
cat $1 | ssh jeff@remoteserver "bash " হিসাবে একই ssh jeff@remoteserver "bash " < $1 UUOC ব্যতীত (বিড়াল ব্যবহার নিষ্ক্রিয়)।
Stefan Seidel
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.