আমি মনে করি না আপনি এটিকে পেতে পারেন।
সঙ্গে -tt
, sshd
একটি সিউডো-টার্মিনাল ও স্লেভ অংশ stdin, stdout- এ এবং শেল দূরবর্তী কমান্ড executes এর দ্বারা stderr তোলে spawns।
sshd
সিডো-টার্মিনালের মাস্টার অংশে তার (একক) এফডি থেকে কী আসছে তা পড়ে এবং এটি (একক চ্যানেলের মাধ্যমে) ssh
ক্লায়েন্টকে প্রেরণ করে । স্টাডারের বাইরে নেই বলে দ্বিতীয় চ্যানেল নেই -t
।
তদুপরি লক্ষ করুন যে সিউডো-টার্মিনালের টার্মিনাল লাইন শৃঙ্খলা আউটপুট পরিবর্তন করতে পারে (এবং পূর্বনির্ধারিতভাবে হবে)। উদাহরণস্বরূপ, এলএফ স্থানীয় টার্মিনালে নয়, সেখানে সিআরএলএফে রূপান্তরিত হবে, সুতরাং আপনি আউটপুট পোস্ট-প্রসেসিং অক্ষম করতে চাইতে পারেন।
$ ssh localhost 'echo x' | hd
00000000 78 0a |x.|
00000002
$ ssh -t localhost 'echo x' | hd
00000000 78 0d 0a |x..|
00000003
$ ssh -t localhost 'stty -opost; echo x' | hd
00000000 78 0a |x.|
00000002
ইনপুট সাইডে আরও অনেক কিছু ঘটবে (যেমনটি এমন ^C
চরিত্রের মতো যা একটি সিগিন্টের কারণ হয়ে দাঁড়ায়, তবে অন্যান্য সংকেতগুলি, প্রতিধ্বনি এবং ক্যানোনিকাল মোড লাইন সম্পাদকের সাথে জড়িত সমস্ত হ্যান্ডলিং )।
আপনি সম্ভবত স্টাডারকে একটি ফিফোতে পুনর্নির্দেশ করতে এবং এটি একটি দ্বিতীয় ব্যবহার করে পুনরুদ্ধার করতে পারেন ssh
:
ssh -tt host 'mkfifo fifo && cmd 2> fifo' &
ssh host 'cat fifo' >&2
তবে সেরা আইএমও হ'ল -t
সম্পূর্ণরূপে ব্যবহার এড়ানো উচিত। এটি সত্যই কেবল আসল টার্মিনাল থেকে ইন্টারেক্টিভ ব্যবহারের জন্য।
দূরবর্তী প্রান্তটি সংযোগ বন্ধ হতে দিতে কোনও ^ সি ট্রান্সমিশনের উপর নির্ভর করার পরিবর্তে, আপনি একটি মোড়ক ব্যবহার করতে পারেন poll()
যা নিহত ssh
বা বন্ধ সংযোগ সনাক্ত করতে একটি করে ।
হতে পারে এর মতো কিছু (সরলীকৃত, আপনি কিছু ত্রুটি পরীক্ষা করে যুক্ত করতে চান):
LC_HUP_DETECTOR='
use IO::Poll;
$SIG{CHLD} = sub {$done = 1};
$p = IO::Poll->new;
$p->mask(STDOUT, POLLIN);
$pid=fork; unless($pid) {setpgrp; exec @ARGV; die "exec: $!\n"}
$p->poll;
kill SIGHUP, -$pid unless $done;
wait; exit ($?&127 ? 128+($?&127) : 1+$?>>8)
' ssh host 'perl -e "$LC_HUP_DETECTOR" some cmd'
$p->mask(STDOUT, POLLIN)
উপরে নিরীহ মনে হতে পারে, কিন্তু ধারণা (বন্ধ করে দেওয়া হয় stdout- এ তে পাইপের পড়া শেষ) একটি নীচ hup থেকে ইভেন্টের জন্য অপেক্ষা করতে হয়। অনুরোধ করা মুখোশ হিসাবে পোলহাপ উপেক্ষা করা হবে। POLLHUP শুধুমাত্র meaningfull একটি ফিরে ঘটনা হিসাবে (বলতে যে লেখা শেষ বন্ধ করে দেয়া হয়েছে)।
ইভেন্ট মাস্কের জন্য আমাদের একটি শূন্য-মান দিতে হবে। আমরা যদি ব্যবহার করি 0
, perl
কলও করি না poll
। সুতরাং এখানে আমরা পলিং ব্যবহার করি।
লিনাক্সে, আপনি যা যা অনুরোধ করুন, পাইপটি নষ্ট হয়ে গেলে, পোল () POLLERR প্রদান করে।
সোলারিস এবং ফ্রিবিএসডি-তে, যেখানে পাইপগুলি দ্বি নির্দেশমূলক হয়, যখন পাইপের পাঠ শেষ হয় (যা সেখানে লেখার শেষও হয়) বন্ধ হয়ে যায়, তখন এটি পলহাপ (এবং ফ্রিবিএসডি-তে পলিন) দিয়ে ফিরে আসে, যেখানে আপনাকে পলিনের জন্য অনুরোধ করতে হবে অন্যথায় $p->poll()
না আসতে)।
এই তিনটি অপারেটিং সিস্টেমের বাইরে অন্যথায় এটি কতটা পোর্টেবল তা আমি বলতে পারি না।
parallel --tag -j1 'ssh -tt localhost perl/catch_wrap perl/catch_all_signals & sleep 1; killall -{} ssh' ::: {1..31}
তবে '-tt' সরান এবং তারপরে এটি কার্যকর হয় না।