ssh কমান্ড অপ্রত্যাশিতভাবে অন্যান্য সিস্টেমে ssh সমাপ্ত হওয়ার পরে অব্যাহত থাকে


11

আমি নীচের কমান্ডটি চালাচ্ছি এবং অন্যান্য সিস্টেমে আউটপুট ফাইলটি পর্যবেক্ষণ করছি:

ssh $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'

আমি যদি ssh কমান্ডটি ব্যবহার করে ^Cঅথবা আমি যে টার্মিনালটি লগ ইন করেছি তা মেরে ফেললে আমিও রিমোট কমান্ডটি সমাপ্ত হওয়ার আশা করব। যদিও এটি ঘটে না: /tmp/countনির্বিশেষে সমস্ত নম্বর 1-5 পেয়ে ps -ejHযায় এবং শেলটি দেখায় এবং এর sleepশিশুটি চলতে থাকে।

এই প্রত্যাশিত আচরণ, এবং এটি কোথাও নথিভুক্ত করা হয়? আমি কি এটি অক্ষম করতে পারি? চারপাশে পড়া থেকে, আমি প্রত্যাশা করব যে এটি পূর্বনির্ধারিত হওয়ার জন্য নয়, নোহুপের সাথে স্পষ্টভাবে এই ধরণের আচরণটি সক্ষম করবে।

আমি ssh এবং sshd এর জন্য ম্যান পেজগুলি দেখেছি, তবে কোনও স্পষ্ট স্পষ্ট করে দেখিনি, এবং গুগল আমাকে এই আচরণটি চালু করার জন্য নির্দেশগুলি নির্দেশ করেছে, এটি বন্ধ করার জন্য নয়।

আমি দুটি সিস্টেমে রুট লগইন এবং ব্যাশ শেল সহ রেড হ্যাট এন্টারপ্রাইজ লিনাক্স 6.2 চালাচ্ছি।

উত্তর:


11

উথরের উত্তর আপনাকে একটি টার্মিনাল বরাদ্দ করতে বলে তবে কেন তা ব্যাখ্যা করে না। কারণটি ssh- এর জন্য নির্দিষ্ট নয়, এটি সংকেত উত্পাদন এবং প্রচারের বিষয় a আমি আপনাকে পড়তে আমন্ত্রণ জানিয়েছি কী কারণে বিভিন্ন সংকেত পাঠানো হয়? আরও পটভূমি জন্য।

রিমোট হোস্টে, দুটি প্রাসঙ্গিক প্রক্রিয়া রয়েছে:

  • ssh ডিমন ( sshd) এর উদাহরণ , যা দূরবর্তী প্রোগ্রামের ইনপুট এবং আউটপুটটিকে স্থানীয় টার্মিনালে রিলে করে;
  • একটি শেল, যা যে forলুপ চলছে ।

লুপটির শেষ প্রান্তে পৌঁছলে বা মারাত্মক ত্রুটি বা সিগন্যালের কাছে গেলে শেলটি স্বাভাবিকভাবেই মারা যেতে পারে। প্রশ্নটি হল, শেল কেন একটি সংকেত পাবে?

যদি রিমোট শেলটি sshdওভার পাইপের সাথে সংযুক্ত থাকে, যা আপনি sshকমান্ড লাইনে একটি কমান্ড নির্দিষ্ট করার সময় ঘটে থাকে , তবে যদি সাইনটিsshd প্রস্থান করে এবং শেলটি পাইপটিতে লেখার চেষ্টা করে তবে এটি একটি সিপাইপিতে মারা যাবে । যতক্ষণ শেলটি পাইপে লিখছে না, ততক্ষণ এটি সাইনপাইপ পাবে না। এখানে, শেলটি কখনও তার স্ট্যান্ডার্ড আউটপুটে কিছু লিখছে না, তাই এটি চিরকাল বেঁচে থাকতে পারে।

আপনি -tssh করতে অপশনটি পাস করতে পারবেন , এটির বলার জন্য দূরবর্তী দিকের টার্মিনালটি অনুকরণ করতে এবং এই টার্মিনালটিতে নির্দিষ্ট কমান্ডটি চালাতে। তারপরে, যদি এসএসএইচ ক্লায়েন্ট অদৃশ্য হয়ে sshdযায়, সংযোগটি বন্ধ করে এবং প্রস্থান করে, টার্মিনালটি ধ্বংস করে। টার্মিনাল ডিভাইসটি চলে গেলে, এতে চলমান যে কোনও প্রক্রিয়া একটি সাইনআপ গ্রহণ করে । সুতরাং আপনি যদি এসএসএইচ ক্লায়েন্টকে হত্যা করেন (সাথে kill, বা ক্লায়েন্টটি যে টার্মিনালটি চলছে সেগুলি বন্ধ করে), রিমোট শেলটি SIGHUPped হয়।

আপনি যদি -tবিকল্পটি পাস করেন তবে এসএসএইচ স্বাক্ষরটিও রিলে করে । আপনি যদি Ctrl+ Cটিপেন, তবে দূরবর্তী শেলটি একটি সাইন ইন করে।


এর -ttপরিবর্তে -tssh নিজেই কোনও tty বরাদ্দ না থাকলে ব্যবহার করুন । যদি SSH মত বিকল্পগুলির মাধ্যমে আবাহন পরে অবিলম্বে পশ্চাদপটে করা পরার, SSH একটি বরাদ্দ TTY পাবেন না -fবা -n
মিরন ভি

3

আপনার sshকমান্ড দিয়ে একটি psuedo-tty বরাদ্দ চেষ্টা করুন ।

ssh -t $ip_address 'for n in 1 2 3 4 5; do sleep 10; echo $n >>/tmp/count; done'

আপনি যখন ssh সেশনটি সংযোগ বিচ্ছিন্ন করেন, প্রক্রিয়াটি শেষ হওয়া উচিত।

যেহেতু এটি সিউডো-টিটি, তাই আপনার শেল সূচনাটি সম্ভবত উত্স কনফিগারেশন ফাইলগুলিতে যাচ্ছে না, আপনার কমান্ডটি খুব খালি পরিবেশের সাথে রেখে। আপনাকে এমন একটি .ssh/environmentফাইল সেট আপ করতে হবে যা পরিবেশের ভেরিয়েবলগুলি যেমন PATH নির্ধারণ করে। থেকেman 1 ssh

Additionally, ssh reads ~/.ssh/environment, and adds lines of the format 
“VARNAME=value” to the environment if the file exists and users are allowed
to change their environment.  For more information, see the 
PermitUserEnvironment option in sshd_config(5).

2

ক্লায়েন্টটি প্রস্থান করার সময় বা (নিহত হওয়ার পরে) রিমোট কমান্ডটি শেষ করার জন্য -tবিকল্পটি ব্যবহার করার বিকল্প হিসাবে ssh, স্টিডিনটি বন্ধ হয়ে যাওয়ার পরে sshএকটি নামযুক্ত পাইপ "ইওএফ থেকে সিএইচএইচইপআপ" রূপান্তর করতে ব্যবহার করতে পারেন sshd( বাগ 396 - এসএসডিডি দেখুন অনাথদের প্রক্রিয়া করার সময় কোনও পিটিআই বরাদ্দ নেই )।

# sample code in Bash
# press ctrl-d for EOF
ssh localhost '
TUBE=/tmp/myfifo.fifo
rm -f "$TUBE"
mkfifo "$TUBE"
#exec 3<>"$TUBE"

<"$TUBE" sleep 100 &  appPID=$!

# cf. "OpenSSH and non-blocking mode", 
# http://lists.mindrot.org/pipermail/openssh-unix-dev/2005-July/023090.html
#cat >"$TUBE"
#socat -u STDIN "PIPE:$TUBE"
dd of="$TUBE" bs=1 2>/dev/null
#while IFS="" read -r -n 1 char; do printf '%s' "$char"; done > "$TUBE"

#kill -HUP -$appPID 
kill $appPID

rm -f "$TUBE"
'

1

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

ssh localhost "sleep 99 < <(cat; kill -INT 0)" <&1

এটি আসলে কোথাও stdout পুনর্নির্দেশ বলে মনে হচ্ছে না তবে এটি একটি ব্লকিং ইনপুট হিসাবে কাজ করে এবং কীস্ট্রোকগুলি ক্যাপচার এড়ায়।

প্রাসঙ্গিক ওপেনশ বাগ: https://bugzilla.mindrot.org/show_bug.cgi?id=396#c14


0

যদি আপনি এটি (আপাতদৃষ্টিতে ডিফল্ট-আচরণ) অক্ষম করতে চান তবে আপনাকে ক্লায়েন্ট বা সার্ভার-সাইডে ssh-keep-live সক্ষম করতে হবে

ম্যান-পৃষ্ঠাগুলিতে ssh-কিপ-লাইভ-বিকল্পগুলির দিকে নজর দিলে আপনি দেখতে পাবেন যে সেগুলি ডিফল্টরূপে অক্ষম রয়েছে।


0

আমার উত্তর তেরুর উপর ভিত্তি করে। আমার ~/helperসার্ভার সার্ভার.আইপ এ একটি সহায়ক স্ক্রিপ্ট দরকার :

#!/bin/bash
TUBE=/tmp/sshCoLab_myfifo.$$;
mkfifo "$TUBE"
( <"$TUBE" "$@" ; rm "$TUBE" ; kill -TERM 0 ) &  
cat >"$TUBE" ;
rm "$TUBE" ;
kill -TERM 0 ;

যদি এটি বলা হয় যেমন সাথে

ssh server.ip ~/helper echo hello from server

এবং echo hello from serverসার্ভার.আইপিতে কার্যকর করে এবং তারপরে ssh ক্লায়েন্টটি সমাপ্ত হবে।

যদি এটি বলা হয় যেমন সাথে

ssh server.ip ~/helper sleep 1000 &
CHID=$!

kill -9 $CHIDসার্ভারে স্ক্রিপ্টও বন্ধ করে দেবে। আমার জন্য, kill -INT $CHIDকাজ করে না, তবে কেন জানি না।

টেরুর উত্তরে, ssh কমান্ড চিরকাল অপেক্ষা করবে যখন রিমোট কমান্ডটি শেষ হয়, কারণ catকখনই শেষ হয় না।

Ssh -t সহ সমস্ত উত্তর আমার পক্ষে কাজ করে নি kill, তবে কেবল Ctrl-C দিয়ে।

সম্পাদনা: আমি এটি একটি নতুন উবুন্টু থেকে 14.01 থেকে একজন প্রাচীন বৈজ্ঞানিক লিনাক্স বাক্সে খুঁজে পেয়েছি - তবে অন্যভাবে নয়। সুতরাং, আমি মনে করি যে কোনও সাধারণ সমাধান নেই। রহস্যময়।

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